From e749f2f3a52f5c1e137ce8262701b9c9df96324f Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Wed, 15 Nov 2023 18:17:03 -0800 Subject: Factor lightbox out into hook/context (#1919) --- src/state/lightbox.tsx | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 src/state/lightbox.tsx (limited to 'src/state/lightbox.tsx') diff --git a/src/state/lightbox.tsx b/src/state/lightbox.tsx new file mode 100644 index 000000000..613cd638e --- /dev/null +++ b/src/state/lightbox.tsx @@ -0,0 +1,86 @@ +import React from 'react' +import {AppBskyActorDefs} from '@atproto/api' + +interface Lightbox { + name: string +} + +export class ProfileImageLightbox implements Lightbox { + name = 'profile-image' + constructor(public profile: AppBskyActorDefs.ProfileViewDetailed) {} +} + +interface ImagesLightboxItem { + uri: string + alt?: string +} + +export class ImagesLightbox implements Lightbox { + name = 'images' + constructor(public images: ImagesLightboxItem[], public index: number) {} + setIndex(index: number) { + this.index = index + } +} + +const LightboxContext = React.createContext<{ + activeLightbox: Lightbox | null +}>({ + activeLightbox: null, +}) + +const LightboxControlContext = React.createContext<{ + openLightbox: (lightbox: Lightbox) => void + closeLightbox: () => void +}>({ + openLightbox: () => {}, + closeLightbox: () => {}, +}) + +export function Provider({children}: React.PropsWithChildren<{}>) { + const [activeLightbox, setActiveLightbox] = React.useState( + null, + ) + + const openLightbox = React.useCallback( + (lightbox: Lightbox) => { + setActiveLightbox(lightbox) + }, + [setActiveLightbox], + ) + + const closeLightbox = React.useCallback(() => { + setActiveLightbox(null) + }, [setActiveLightbox]) + + 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) +} -- cgit 1.4.1