|
|
|
@ -1,6 +1,6 @@ |
|
|
|
"use client"; |
|
|
|
|
|
|
|
import { useCallback, useState, useEffect } from "react"; |
|
|
|
import { useCallback, useState, useEffect, useMemo } from "react"; |
|
|
|
import { Handle, Position, NodeProps, Node } from "@xyflow/react"; |
|
|
|
import { BaseNode } from "./BaseNode"; |
|
|
|
import { useWorkflowStore } from "@/store/workflowStore"; |
|
|
|
@ -16,8 +16,29 @@ export function SplitGridNode({ id, data, selected }: NodeProps<SplitGridNodeTyp |
|
|
|
const updateNodeData = useWorkflowStore((state) => state.updateNodeData); |
|
|
|
const regenerateNode = useWorkflowStore((state) => state.regenerateNode); |
|
|
|
const isRunning = useWorkflowStore((state) => state.isRunning); |
|
|
|
const getConnectedInputs = useWorkflowStore((state) => state.getConnectedInputs); |
|
|
|
const edges = useWorkflowStore((state) => state.edges); |
|
|
|
const nodes = useWorkflowStore((state) => state.nodes); |
|
|
|
const [showSettings, setShowSettings] = useState(false); |
|
|
|
|
|
|
|
// Reactively track the connected source image
|
|
|
|
const hasIncomingImageConnection = useMemo(() => { |
|
|
|
return edges.some((edge) => edge.target === id && edge.targetHandle === "image"); |
|
|
|
}, [edges, id]); |
|
|
|
|
|
|
|
const connectedSourceImage = useMemo(() => { |
|
|
|
if (!hasIncomingImageConnection) return null; |
|
|
|
const { images } = getConnectedInputs(id); |
|
|
|
return images[0] || null; |
|
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
|
|
}, [hasIncomingImageConnection, id, getConnectedInputs, nodes]); |
|
|
|
|
|
|
|
useEffect(() => { |
|
|
|
if (connectedSourceImage !== nodeData.sourceImage) { |
|
|
|
updateNodeData(id, { sourceImage: connectedSourceImage }); |
|
|
|
} |
|
|
|
}, [connectedSourceImage, id, updateNodeData, nodeData.sourceImage]); |
|
|
|
|
|
|
|
// Show settings modal on first creation (when not configured)
|
|
|
|
useEffect(() => { |
|
|
|
if (!nodeData.isConfigured && (!nodeData.childNodeIds || nodeData.childNodeIds.length === 0)) { |
|
|
|
|