/ src / hooks / useMailboxBridge.ts
useMailboxBridge.ts
 1  import { useCallback, useEffect, useMemo, useSyncExternalStore } from 'react'
 2  import { useMailbox } from '../context/mailbox.js'
 3  
 4  type Props = {
 5    isLoading: boolean
 6    onSubmitMessage: (content: string) => boolean
 7  }
 8  
 9  export function useMailboxBridge({ isLoading, onSubmitMessage }: Props): void {
10    const mailbox = useMailbox()
11  
12    const subscribe = useMemo(() => mailbox.subscribe.bind(mailbox), [mailbox])
13    const getSnapshot = useCallback(() => mailbox.revision, [mailbox])
14    const revision = useSyncExternalStore(subscribe, getSnapshot)
15  
16    useEffect(() => {
17      if (isLoading) return
18      const msg = mailbox.poll()
19      if (msg) onSubmitMessage(msg.content)
20    }, [isLoading, revision, mailbox, onSubmitMessage])
21  }