import React from 'react' import {AppBskyEmbedRecord} from '@atproto/api' import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' export interface ComposerOptsPostRef { uri: string cid: string text: string author: { handle: string displayName?: string avatar?: string } embed?: AppBskyEmbedRecord.ViewRecord['embed'] } export interface ComposerOptsQuote { uri: string cid: string text: string indexedAt: string author: { did: string handle: string displayName?: string avatar?: string } embeds?: AppBskyEmbedRecord.ViewRecord['embeds'] } export interface ComposerOpts { replyTo?: ComposerOptsPostRef onPost?: () => void quote?: ComposerOptsQuote mention?: string // handle of user to mention openPicker?: (pos: DOMRect | undefined) => void } type StateContext = ComposerOpts | undefined type ControlsContext = { openComposer: (opts: ComposerOpts) => void closeComposer: () => boolean } const stateContext = React.createContext(undefined) const controlsContext = React.createContext({ openComposer(_opts: ComposerOpts) {}, closeComposer() { return false }, }) export function Provider({children}: React.PropsWithChildren<{}>) { const [state, setState] = React.useState() const openComposer = useNonReactiveCallback((opts: ComposerOpts) => { setState(opts) }) const closeComposer = useNonReactiveCallback(() => { let wasOpen = !!state setState(undefined) return wasOpen }) const api = React.useMemo( () => ({ openComposer, closeComposer, }), [openComposer, closeComposer], ) return ( {children} ) } export function useComposerState() { return React.useContext(stateContext) } export function useComposerControls() { return React.useContext(controlsContext) }