1- import React , { useMemo , useState } from 'react'
1+ import React , { useEffect , useImperativeHandle , useMemo , useRef , useState } from 'react'
22import classNames from 'classnames'
33import { usePopper } from 'react-popper'
44import { Padding , Placement , VirtualElement } from '@popperjs/core'
55
6- export function PreviewPopUp ( {
7- anchor,
8- padding,
9- placement,
10- hidden,
11- size,
12- preview,
13- controls,
14- contentInfo,
15- warnings,
16- } : {
17- anchor : HTMLElement | VirtualElement | null
18- padding : Padding
19- placement : Placement
20- size : 'small' | 'large'
21- hidden ?: boolean
22- preview ?: React . ReactNode
23- controls ?: React . ReactNode
24- contentInfo ?: React . ReactNode
25- warnings ?: React . ReactNode
26- } ) : React . JSX . Element {
6+ export const PreviewPopUp = React . forwardRef <
7+ {
8+ update : ( ) => void
9+ } ,
10+ {
11+ anchor : HTMLElement | VirtualElement | null
12+ padding : Padding
13+ placement : Placement
14+ size : 'small' | 'large'
15+ hidden ?: boolean
16+ preview ?: React . ReactNode
17+ controls ?: React . ReactNode
18+ contentInfo ?: React . ReactNode
19+ warnings ?: React . ReactNode
20+ }
21+ > ( function PreviewPopUp (
22+ { anchor, padding, placement, hidden, size, preview, controls, contentInfo, warnings } ,
23+ ref
24+ ) : React . JSX . Element {
2725 const warningsCount = React . Children . count ( warnings )
2826
2927 const [ popperEl , setPopperEl ] = useState < HTMLDivElement | null > ( null )
@@ -62,7 +60,26 @@ export function PreviewPopUp({
6260 } ) ,
6361 [ padding ]
6462 )
65- const { styles, attributes } = usePopper ( anchor , popperEl , popperOptions )
63+ const { styles, attributes, update } = usePopper ( anchor , popperEl , popperOptions )
64+
65+ const updateRef = useRef ( update )
66+
67+ useEffect ( ( ) => {
68+ updateRef . current = update
69+ } , [ update ] )
70+
71+ useImperativeHandle (
72+ ref ,
73+ ( ) => {
74+ return {
75+ update : ( ) => {
76+ if ( ! updateRef . current ) return
77+ updateRef . current ( ) . catch ( console . error )
78+ } ,
79+ }
80+ } ,
81+ [ ]
82+ )
6683
6784 return (
6885 < div
@@ -87,4 +104,4 @@ export function PreviewPopUp({
87104 ) }
88105 </ div >
89106 )
90- }
107+ } )
0 commit comments