All files / webview-app/src/hooks useExtensionListener.ts

35.29% Statements 6/17
0% Branches 0/6
75% Functions 3/4
35.29% Lines 6/17

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49                          4x   4x 4x                                                 4x   4x 4x        
import { useEffect } from "react";
 
import { parseMessage } from "@/schemas/parsers";
import type { CanvasState, ConfigDefaults } from "@/types/canvas";
import type { PreviewCodeFile } from "@/types/messages";
 
export interface UseExtensionListenerOptions {
  onLoadState?: (state: CanvasState) => void;
  onConfigDefaults?: (config: ConfigDefaults) => void;
  onPreviewCodeResponse?: (files: PreviewCodeFile[]) => void;
}
 
export function useExtensionListener(options: UseExtensionListenerOptions): void {
  const { onLoadState, onConfigDefaults, onPreviewCodeResponse } = options;
 
  useEffect(() => {
    const handleMessage = (event: MessageEvent<unknown>) => {
      const message = parseMessage(event.data);
 
      if (!message) {
        return;
      }
 
      switch (message.type) {
        case "loadState":
          onLoadState?.(message.state as unknown as CanvasState);
          break;
        case "configDefaults":
          onConfigDefaults?.(message.defaults as unknown as ConfigDefaults);
          break;
        case "previewCodeResponse":
          onPreviewCodeResponse?.(message.files);
          break;
        default:
          console.warn("[useExtensionListener] Ignoring unsupported incoming message", {
            type: message.type,
            message,
          });
      }
    };
 
    window.addEventListener("message", handleMessage);
 
    return () => {
      window.removeEventListener("message", handleMessage);
    };
  }, [onLoadState, onConfigDefaults, onPreviewCodeResponse]);
}