import { useCallback } from 'react'; import { SseMessageSchema, SseDetectedDiffSchema, SseFinalizedSchema, type SseMessage, type SseDetectedDiff, type SseFinalized, } from '~/features/openai/interfaces/editor-assistant/sse-schemas'; import { handleIfSuccessfullyParsed } from '~/features/openai/utils/handle-if-successfully-parsed'; interface PostMessage { (threadId: string, userMessage: string, markdown: string): Promise; } interface ProcessMessage { (data: unknown, handler: { onMessage: (data: SseMessage) => void; onDetectedDiff: (data: SseDetectedDiff) => void; onFinalized: (data: SseFinalized) => void; }): void; } export const useEditorAssistant = (): { postMessage: PostMessage, processMessage: ProcessMessage } => { const postMessage: PostMessage = useCallback(async(threadId, userMessage, markdown) => { const response = await fetch('/_api/v3/openai/edit', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ threadId, userMessage, markdown, }), }); return response; }, []); const processMessage: ProcessMessage = useCallback((data, handler) => { handleIfSuccessfullyParsed(data, SseMessageSchema, (data: SseMessage) => { handler.onMessage(data); }); handleIfSuccessfullyParsed(data, SseDetectedDiffSchema, (data: SseDetectedDiff) => { handler.onDetectedDiff(data); }); handleIfSuccessfullyParsed(data, SseFinalizedSchema, (data: SseFinalized) => { handler.onFinalized(data); }); }, []); return { postMessage, processMessage, }; };