"use client"; import { useCallback, useState, useEffect } from "react"; import { Handle, Position, NodeProps, Node } from "@xyflow/react"; import { BaseNode } from "./BaseNode"; import { useWorkflowStore } from "@/store/workflowStore"; import { SplitGridNodeData } from "@/types"; import { SplitGridSettingsModal } from "../SplitGridSettingsModal"; type SplitGridNodeType = Node; export function SplitGridNode({ id, data, selected }: NodeProps) { const nodeData = data; const updateNodeData = useWorkflowStore((state) => state.updateNodeData); const regenerateNode = useWorkflowStore((state) => state.regenerateNode); const isRunning = useWorkflowStore((state) => state.isRunning); const [showSettings, setShowSettings] = useState(false); // Show settings modal on first creation (when not configured) useEffect(() => { if (!nodeData.isConfigured && (!nodeData.childNodeIds || nodeData.childNodeIds.length === 0)) { setShowSettings(true); } }, [nodeData.isConfigured, nodeData.childNodeIds]); const handleOpenSettings = useCallback(() => { setShowSettings(true); }, []); const handleCloseSettings = useCallback(() => { setShowSettings(false); }, []); const handleSplit = useCallback(() => { regenerateNode(id); }, [id, regenerateNode]); return ( <> {/* Image input handle */} {/* Reference output handle for visual links to child nodes */} {/* Full-bleed preview area */} {nodeData.sourceImage ? (
Source grid {/* Grid overlay visualization */}
{Array.from({ length: nodeData.targetCount }).map((_, i) => (
))}
{/* Loading overlay */} {nodeData.status === "loading" && (
)}
) : (
{nodeData.status === "error" ? ( {nodeData.error || "Error"} ) : nodeData.status === "loading" ? ( ) : ( <> Connect image )}
)} {/* Controls overlay pinned at bottom */}
{/* Config summary */}
{nodeData.gridRows}x{nodeData.gridCols} grid ({nodeData.targetCount} images)
{/* Child node count / status */}
{nodeData.isConfigured ? (
{nodeData.childNodeIds?.length ?? 0} generate sets created
) : (
Not configured - click Settings
)} {/* Split button */}
{/* Settings Modal */} {showSettings && ( )} ); }