import React from 'react' import type {MeasuredDimensions} from 'react-native-reanimated' import {nanoid} from 'nanoid/non-secure' import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' import {ImageSource} from '#/view/com/lightbox/ImageViewing/@types' export type Lightbox = { id: string images: ImageSource[] thumbDims: MeasuredDimensions | null index: number } const LightboxContext = React.createContext<{ activeLightbox: Lightbox | null }>({ activeLightbox: null, }) const LightboxControlContext = React.createContext<{ openLightbox: (lightbox: Omit) => void closeLightbox: () => boolean }>({ openLightbox: () => {}, closeLightbox: () => false, }) export function Provider({children}: React.PropsWithChildren<{}>) { const [activeLightbox, setActiveLightbox] = React.useState( null, ) const openLightbox = useNonReactiveCallback( (lightbox: Omit) => { setActiveLightbox({...lightbox, id: nanoid()}) }, ) const closeLightbox = useNonReactiveCallback(() => { let wasActive = !!activeLightbox setActiveLightbox(null) return wasActive }) const state = React.useMemo( () => ({ activeLightbox, }), [activeLightbox], ) const methods = React.useMemo( () => ({ openLightbox, closeLightbox, }), [openLightbox, closeLightbox], ) return ( {children} ) } export function useLightbox() { return React.useContext(LightboxContext) } export function useLightboxControls() { return React.useContext(LightboxControlContext) }