"use client"; import { useMemo } from "react"; import { Handle, Position, NodeProps, Node } from "@xyflow/react"; import { ReactCompareSlider, ReactCompareSliderImage, } from "react-compare-slider"; import { BaseNode } from "./BaseNode"; import { useWorkflowStore } from "@/store/workflowStore"; import { ImageCompareNodeData } from "@/types"; type ImageCompareNodeType = Node; export function ImageCompareNode({ id, data, selected, }: NodeProps) { const nodeData = data; const updateNodeData = useWorkflowStore((state) => state.updateNodeData); const edges = useWorkflowStore((state) => state.edges); const nodes = useWorkflowStore((state) => state.nodes); // Collect images in real-time from connected nodes (same pattern as OutputGalleryNode) const displayImages = useMemo(() => { const connectedImages: string[] = []; // Get edges connected to this node, sorted by creation time for stable ordering const sortedEdges = edges .filter((edge) => edge.target === id) .sort((a, b) => { const aTime = (a.data?.createdAt as number) || 0; const bTime = (b.data?.createdAt as number) || 0; return aTime - bTime; }); sortedEdges.forEach((edge) => { const sourceNode = nodes.find((n) => n.id === edge.source); if (!sourceNode) return; let image: string | null = null; // Extract image from different node types if (sourceNode.type === "imageInput") { image = (sourceNode.data as any).image; } else if (sourceNode.type === "annotation") { image = (sourceNode.data as any).outputImage; } else if (sourceNode.type === "nanoBanana") { image = (sourceNode.data as any).outputImage; } if (image) { connectedImages.push(image); } }); return connectedImages; }, [edges, nodes, id]); const imageA = displayImages[0] || nodeData.imageA || null; const imageB = displayImages[1] || nodeData.imageB || null; return ( {/* Two labeled image input handles */}
A
B
{/* Comparison view or placeholder */} {imageA && imageB ? (
} itemTwo={ } portrait={false} style={{ width: "100%", height: "100%" }} /> {/* Corner labels */}
A
B
) : (
{!imageA && !imageB ? "Connect 2 images to compare" : "Connect another image to compare"} {imageA && !imageB && (
Image A connected
)} {!imageA && imageB && (
Image B connected
)}
)}
); }