diff options
Diffstat (limited to 'packages/cli/src/ui/hooks/useMessageQueue.ts')
| -rw-r--r-- | packages/cli/src/ui/hooks/useMessageQueue.ts | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/packages/cli/src/ui/hooks/useMessageQueue.ts b/packages/cli/src/ui/hooks/useMessageQueue.ts new file mode 100644 index 00000000..f7bbe1eb --- /dev/null +++ b/packages/cli/src/ui/hooks/useMessageQueue.ts @@ -0,0 +1,69 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import { useCallback, useEffect, useState } from 'react'; +import { StreamingState } from '../types.js'; + +export interface UseMessageQueueOptions { + streamingState: StreamingState; + submitQuery: (query: string) => void; +} + +export interface UseMessageQueueReturn { + messageQueue: string[]; + addMessage: (message: string) => void; + clearQueue: () => void; + getQueuedMessagesText: () => string; +} + +/** + * Hook for managing message queuing during streaming responses. + * Allows users to queue messages while the AI is responding and automatically + * sends them when streaming completes. + */ +export function useMessageQueue({ + streamingState, + submitQuery, +}: UseMessageQueueOptions): UseMessageQueueReturn { + const [messageQueue, setMessageQueue] = useState<string[]>([]); + + // Add a message to the queue + const addMessage = useCallback((message: string) => { + const trimmedMessage = message.trim(); + if (trimmedMessage.length > 0) { + setMessageQueue((prev) => [...prev, trimmedMessage]); + } + }, []); + + // Clear the entire queue + const clearQueue = useCallback(() => { + setMessageQueue([]); + }, []); + + // Get all queued messages as a single text string + const getQueuedMessagesText = useCallback(() => { + if (messageQueue.length === 0) return ''; + return messageQueue.join('\n\n'); + }, [messageQueue]); + + // Process queued messages when streaming becomes idle + useEffect(() => { + if (streamingState === StreamingState.Idle && messageQueue.length > 0) { + // Combine all messages with double newlines for clarity + const combinedMessage = messageQueue.join('\n\n'); + // Clear the queue and submit + setMessageQueue([]); + submitQuery(combinedMessage); + } + }, [streamingState, messageQueue, submitQuery]); + + return { + messageQueue, + addMessage, + clearQueue, + getQueuedMessagesText, + }; +} |
