From 4c8fd006f6a994783a43e4744a3167db7aefc159 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 6 May 2025 22:50:28 +0300 Subject: New Edit Profile dialog on web, use new Edit Image dialog everywhere (#8220) --- src/components/Portal.tsx | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) (limited to 'src/components/Portal.tsx') diff --git a/src/components/Portal.tsx b/src/components/Portal.tsx index 03b397b2b..4e03d6b08 100644 --- a/src/components/Portal.tsx +++ b/src/components/Portal.tsx @@ -1,4 +1,14 @@ -import React from 'react' +import { + createContext, + Fragment, + useCallback, + useContext, + useEffect, + useId, + useMemo, + useRef, + useState, +} from 'react' type Component = React.ReactElement @@ -9,32 +19,32 @@ type ContextType = { } type ComponentMap = { - [id: string]: Component + [id: string]: Component | null } export function createPortalGroup() { - const Context = React.createContext({ + const Context = createContext({ outlet: null, append: () => {}, remove: () => {}, }) function Provider(props: React.PropsWithChildren<{}>) { - const map = React.useRef({}) - const [outlet, setOutlet] = React.useState(null) + const map = useRef({}) + const [outlet, setOutlet] = useState(null) - const append = React.useCallback((id, component) => { + const append = useCallback((id, component) => { if (map.current[id]) return - map.current[id] = {component} + map.current[id] = {component} setOutlet(<>{Object.values(map.current)}) }, []) - const remove = React.useCallback(id => { - delete map.current[id] + const remove = useCallback(id => { + map.current[id] = null setOutlet(<>{Object.values(map.current)}) }, []) - const contextValue = React.useMemo( + const contextValue = useMemo( () => ({ outlet, append, @@ -49,14 +59,14 @@ export function createPortalGroup() { } function Outlet() { - const ctx = React.useContext(Context) + const ctx = useContext(Context) return ctx.outlet } function Portal({children}: React.PropsWithChildren<{}>) { - const {append, remove} = React.useContext(Context) - const id = React.useId() - React.useEffect(() => { + const {append, remove} = useContext(Context) + const id = useId() + useEffect(() => { append(id, children as Component) return () => remove(id) }, [id, children, append, remove]) -- cgit 1.4.1