import { useCallback, useRef } from 'react' import { useConversationContext } from '../contexts/conversation_context' import { useApiClient } from './use_api_client' const THROTTLE_INTERVAL = 3000 // 3 seconds /** * Hook for broadcasting typing status to other users in a conversation * * We only broadcast once every 3 seconds, but we show the typing indicator for 6 seconds * after receiving a typing event. This is how we can show a steady typing indicator even * if the user types once every 2.9 seconds. */ export const useBroadcastTypingStatus = () => { const { conversationId, currentPageReplyRootId } = useConversationContext() const apiClient = useApiClient() const lastBroadcastTime = useRef(0) const broadcastTypingStatus = useCallback(() => { const now = Date.now() if (now - lastBroadcastTime.current < THROTTLE_INTERVAL) { return } lastBroadcastTime.current = now apiClient.chat .post({ url: `/me/conversations/${conversationId}/broadcast_typing_status`, data: { data: { type: 'TypingStatus', attributes: { reply_root_id: currentPageReplyRootId } }, }, }) .catch(error => { console.error('Failed to broadcast typing status:', error) }) }, [apiClient.chat, conversationId, currentPageReplyRootId]) return broadcastTypingStatus }