| import { useCallback, useEffect, useRef } from 'react' |
| import type { HookResultMessage, Message } from '../types/message.js' |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| export function useDeferredHookMessages( |
| pendingHookMessages: Promise<HookResultMessage[]> | undefined, |
| setMessages: (action: React.SetStateAction<Message[]>) => void, |
| ): () => Promise<void> { |
| const pendingRef = useRef(pendingHookMessages ?? null) |
| const resolvedRef = useRef(!pendingHookMessages) |
|
|
| useEffect(() => { |
| const promise = pendingRef.current |
| if (!promise) return |
| let cancelled = false |
| promise.then(msgs => { |
| if (cancelled) return |
| resolvedRef.current = true |
| pendingRef.current = null |
| if (msgs.length > 0) { |
| setMessages(prev => [...msgs, ...prev]) |
| } |
| }) |
| return () => { |
| cancelled = true |
| } |
| }, [setMessages]) |
|
|
| return useCallback(async () => { |
| if (resolvedRef.current || !pendingRef.current) return |
| const msgs = await pendingRef.current |
| if (resolvedRef.current) return |
| resolvedRef.current = true |
| pendingRef.current = null |
| if (msgs.length > 0) { |
| setMessages(prev => [...msgs, ...prev]) |
| } |
| }, [setMessages]) |
| } |
|
|