Skip to content

Commit 5c9abdf

Browse files
jstarplMint de Wit
authored andcommitted
wip: PreviewPopUp
1 parent 0b6b5ba commit 5c9abdf

File tree

2 files changed

+70
-32
lines changed

2 files changed

+70
-32
lines changed

meteor/client/ui/PreviewPopUp/PreviewPopUp.tsx

Lines changed: 41 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,27 @@
1-
import React, { useMemo, useState } from 'react'
1+
import React, { useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'
22
import classNames from 'classnames'
33
import { usePopper } from 'react-popper'
44
import { 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+
})

meteor/client/ui/PreviewPopUp/PreviewPopUpContext.tsx

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react'
1+
import React, { useRef, useState } from 'react'
22

33
type VirtualElement = {
44
getBoundingClientRect: () => DOMRect
@@ -26,8 +26,14 @@ export type PreviewContent =
2626
content: string
2727
}
2828

29+
interface IPreviewPopUpHandle {
30+
update: Readonly<(content?: PreviewContent) => void>
31+
close: Readonly<() => void>
32+
onClosed?: () => void
33+
}
34+
2935
interface IPreviewPopUpContext {
30-
display: (
36+
requestPreview(
3137
anchor: HTMLElement | VirtualElement,
3238
content: PreviewContent,
3339
opts?: {
@@ -36,19 +42,34 @@ interface IPreviewPopUpContext {
3642
contentInfo?: React.ReactNode
3743
warnings?: React.ReactNode
3844
}
39-
) => void
40-
hide: () => void
45+
): IPreviewPopUpHandle
4146
}
4247

4348
const PreviewPopUpContext = React.createContext<IPreviewPopUpContext>({
44-
display: () => void {},
45-
hide: () => void {},
49+
requestPreview: () => {
50+
throw new Error('Preview PopUp needs to set up with `PreviewPopUpContextProvider`.')
51+
},
4652
})
4753

4854
export function PreviewPopUpContextProvider({ children }: React.PropsWithChildren<{}>): React.ReactNode {
55+
const [isVisible, setVisible] = useState(false)
56+
const [currentHandle, setCurrentHandle] = useRef()
57+
4958
const context: IPreviewPopUpContext = {
50-
display: () => void {},
51-
hide: () => void {},
59+
requestPreview: (anchor, content, opts) => {
60+
setVisible(true)
61+
62+
const handle: IPreviewPopUpHandle = {
63+
close: () => {
64+
setVisible(false)
65+
},
66+
update: () => {
67+
// todo test
68+
},
69+
}
70+
71+
return handle
72+
},
5273
}
5374

5475
return <PreviewPopUpContext.Provider value={context}>{children}</PreviewPopUpContext.Provider>

0 commit comments

Comments
 (0)