1
1
'use client'
2
2
3
- import { memo , useMemo } from 'react'
3
+ import { forwardRef , memo , useMemo } from 'react'
4
4
import { m } from 'framer-motion'
5
5
import type {
6
6
HTMLMotionProps ,
7
7
Spring ,
8
8
Target ,
9
9
TargetAndTransition ,
10
10
} from 'framer-motion'
11
- import type { FC , PropsWithChildren } from 'react'
11
+ import type {
12
+ ForwardRefExoticComponent ,
13
+ PropsWithChildren ,
14
+ RefAttributes ,
15
+ } from 'react'
12
16
import type { BaseTransitionProps } from './typings'
13
17
14
18
import { isHydrationEnded } from '~/components/common/HydrationEndDetector'
@@ -21,12 +25,13 @@ interface TransitionViewParams {
21
25
preset ?: Spring
22
26
}
23
27
24
- export const createTransitionView = (
25
- params : TransitionViewParams ,
26
- ) : FC < PropsWithChildren < BaseTransitionProps > > => {
28
+ export const createTransitionView = ( params : TransitionViewParams ) => {
27
29
const { from, to, initial, preset } = params
28
30
29
- const TransitionView = ( props : PropsWithChildren < BaseTransitionProps > ) => {
31
+ const TransitionView = forwardRef <
32
+ HTMLElement ,
33
+ PropsWithChildren < BaseTransitionProps >
34
+ > ( ( props , ref ) => {
30
35
const {
31
36
timeout = { } ,
32
37
duration = 0.5 ,
@@ -40,7 +45,9 @@ export const createTransitionView = (
40
45
41
46
const { enter = delay , exit = delay } = timeout
42
47
43
- const MotionComponent = m [ as ] as FC < HTMLMotionProps < any > >
48
+ const MotionComponent = m [ as ] as ForwardRefExoticComponent <
49
+ HTMLMotionProps < any > & RefAttributes < HTMLElement >
50
+ >
44
51
45
52
return (
46
53
< MotionComponent
@@ -53,6 +60,7 @@ export const createTransitionView = (
53
60
: initial || from ,
54
61
[ ] ,
55
62
) }
63
+ ref = { ref }
56
64
animate = { {
57
65
...to ,
58
66
transition : {
@@ -78,7 +86,8 @@ export const createTransitionView = (
78
86
{ props . children }
79
87
</ MotionComponent >
80
88
)
81
- }
89
+ } )
90
+ TransitionView . displayName = `forwardRef(TransitionView)`
82
91
const MemoedTransitionView = memo ( TransitionView )
83
92
MemoedTransitionView . displayName = `MemoedTransitionView`
84
93
return MemoedTransitionView
0 commit comments