2026-02-09 13:55:10 -08:00
|
|
|
import { useEffect, useRef } from 'react';
|
2026-03-31 18:47:00 +03:00
|
|
|
import { useSessionUIStore } from '@/sync/session-ui-store';
|
2026-04-05 15:36:11 +03:00
|
|
|
import { useSessionPermissions, useSessionTextMessages } from '@/sync/sync-context';
|
2026-02-09 13:55:10 -08:00
|
|
|
import { voiceHooks, isVoiceSessionStarted } from '@/lib/voice';
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Hook that syncs session events (messages, permissions) to the voice agent.
|
|
|
|
|
* Call this inside VoiceProvider to enable session awareness during voice.
|
|
|
|
|
*/
|
|
|
|
|
export function useVoiceContext() {
|
2026-03-31 18:47:00 +03:00
|
|
|
const currentSessionId = useSessionUIStore((s) => s.currentSessionId);
|
2026-04-05 15:36:11 +03:00
|
|
|
const messages = useSessionTextMessages(currentSessionId ?? '');
|
2026-03-31 18:47:00 +03:00
|
|
|
const permissions = useSessionPermissions(currentSessionId ?? '');
|
|
|
|
|
|
2026-02-09 13:55:10 -08:00
|
|
|
// Track last seen message count to only forward new messages
|
|
|
|
|
const lastMessageCountRef = useRef(0);
|
2026-03-31 18:47:00 +03:00
|
|
|
|
2026-02-09 13:55:10 -08:00
|
|
|
// Forward new messages to voice agent
|
|
|
|
|
useEffect(() => {
|
2026-03-31 18:47:00 +03:00
|
|
|
if (!currentSessionId || !messages || messages.length === 0 || !isVoiceSessionStarted()) return;
|
|
|
|
|
|
2026-02-09 13:55:10 -08:00
|
|
|
const currentCount = messages.length;
|
|
|
|
|
if (currentCount <= lastMessageCountRef.current) return;
|
2026-03-31 18:47:00 +03:00
|
|
|
|
2026-02-09 13:55:10 -08:00
|
|
|
// Get only new messages (messages since last check)
|
|
|
|
|
const newMessages = messages.slice(lastMessageCountRef.current);
|
|
|
|
|
lastMessageCountRef.current = currentCount;
|
2026-03-31 18:47:00 +03:00
|
|
|
|
2026-02-09 13:55:10 -08:00
|
|
|
const formattedMessages = newMessages.map(m => ({
|
2026-04-05 15:36:11 +03:00
|
|
|
role: m.role ?? '',
|
|
|
|
|
content: m.text,
|
2026-02-09 13:55:10 -08:00
|
|
|
}));
|
2026-03-31 18:47:00 +03:00
|
|
|
|
2026-02-09 13:55:10 -08:00
|
|
|
voiceHooks.onMessages(currentSessionId, formattedMessages);
|
|
|
|
|
}, [currentSessionId, messages]);
|
2026-03-31 18:47:00 +03:00
|
|
|
|
2026-02-09 13:55:10 -08:00
|
|
|
// Forward permission requests to voice agent
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (!currentSessionId || !permissions || permissions.length === 0) return;
|
|
|
|
|
if (!isVoiceSessionStarted()) return;
|
2026-03-31 18:47:00 +03:00
|
|
|
|
2026-02-09 13:55:10 -08:00
|
|
|
const request = permissions[0];
|
|
|
|
|
if (!request) return;
|
2026-03-31 18:47:00 +03:00
|
|
|
|
2026-02-09 13:55:10 -08:00
|
|
|
voiceHooks.onPermissionRequested(
|
|
|
|
|
currentSessionId,
|
|
|
|
|
request.id,
|
|
|
|
|
request.permission,
|
|
|
|
|
request.metadata
|
|
|
|
|
);
|
|
|
|
|
}, [currentSessionId, permissions]);
|
2026-03-31 18:47:00 +03:00
|
|
|
|
2026-02-09 13:55:10 -08:00
|
|
|
// Reset message count when session changes
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
lastMessageCountRef.current = 0;
|
|
|
|
|
}, [currentSessionId]);
|
|
|
|
|
}
|