editor-assistant.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { useCallback } from 'react';
  2. import {
  3. SseMessageSchema,
  4. SseDetectedDiffSchema,
  5. SseFinalizedSchema,
  6. type SseMessage,
  7. type SseDetectedDiff,
  8. type SseFinalized,
  9. } from '~/features/openai/interfaces/editor-assistant/sse-schemas';
  10. import { handleIfSuccessfullyParsed } from '~/features/openai/utils/handle-if-successfully-parsed';
  11. interface PostMessage {
  12. (threadId: string, userMessage: string, markdown: string): Promise<Response>;
  13. }
  14. interface ProcessMessage {
  15. (data: unknown, handler: {
  16. onMessage: (data: SseMessage) => void;
  17. onDetectedDiff: (data: SseDetectedDiff) => void;
  18. onFinalized: (data: SseFinalized) => void;
  19. }): void;
  20. }
  21. export const useEditorAssistant = (): { postMessage: PostMessage, processMessage: ProcessMessage } => {
  22. const postMessage: PostMessage = useCallback(async(threadId, userMessage, markdown) => {
  23. const response = await fetch('/_api/v3/openai/edit', {
  24. method: 'POST',
  25. headers: { 'Content-Type': 'application/json' },
  26. body: JSON.stringify({
  27. threadId,
  28. userMessage,
  29. markdown,
  30. }),
  31. });
  32. return response;
  33. }, []);
  34. const processMessage: ProcessMessage = useCallback((data, handler) => {
  35. handleIfSuccessfullyParsed(data, SseMessageSchema, (data: SseMessage) => {
  36. handler.onMessage(data);
  37. });
  38. handleIfSuccessfullyParsed(data, SseDetectedDiffSchema, (data: SseDetectedDiff) => {
  39. handler.onDetectedDiff(data);
  40. });
  41. handleIfSuccessfullyParsed(data, SseFinalizedSchema, (data: SseFinalized) => {
  42. handler.onFinalized(data);
  43. });
  44. }, []);
  45. return {
  46. postMessage,
  47. processMessage,
  48. };
  49. };