diff --git a/src/components/MyCreationPickerModal.tsx b/src/components/MyCreationPickerModal.tsx index 4310a341..4cfa1227 100644 --- a/src/components/MyCreationPickerModal.tsx +++ b/src/components/MyCreationPickerModal.tsx @@ -180,9 +180,9 @@ function getHistoryPreviewUrl(item: HistoryItem, kind: HistoryTabKey): string | const mediaKind = getHistoryKind(item, kind); const result = firstResult(item); if (mediaKind === "image") { - return firstString(result?.thumbs || undefined) || null; + return firstString(result?.thumbs || undefined) || firstString(result?.images || undefined) || null; } - if (mediaKind === "video") return result?.coverThumb || result?.cover || item.coverThumb || item.cover || result?.video || item.video || null; + if (mediaKind === "video") return result?.cover || result?.video || null; return null; } diff --git a/src/components/media/image-edit/useImageDerivedNodeActions.ts b/src/components/media/image-edit/useImageDerivedNodeActions.ts index ae001911..ab019585 100644 --- a/src/components/media/image-edit/useImageDerivedNodeActions.ts +++ b/src/components/media/image-edit/useImageDerivedNodeActions.ts @@ -42,8 +42,7 @@ interface CreateSplitGridNodesOptions { selectedCellKeys: Set; } -function getNodeWidth(node: { width?: unknown; style?: { width?: unknown } | undefined }) { - if (typeof node.width === "number") return node.width; +function getNodeWidth(node: { style?: { width?: unknown } | undefined }) { if (typeof node.style?.width === "number") return node.style.width; return defaultNodeDimensions.imageInput.width; } diff --git a/src/components/nodes/GenerateImageNode.tsx b/src/components/nodes/GenerateImageNode.tsx index 8e2f96cd..62f13030 100644 --- a/src/components/nodes/GenerateImageNode.tsx +++ b/src/components/nodes/GenerateImageNode.tsx @@ -295,11 +295,9 @@ export function GenerateImageNodeView({ id, data, selected, renderInputHandle = if (!currentNode) return; const currentPosition = currentNode.position ?? { x: 0, y: 0 }; - const currentWidth = typeof currentNode.width === "number" - ? currentNode.width - : typeof currentNode.style?.width === "number" - ? currentNode.style.width - : 300; + const currentWidth = typeof currentNode.style?.width === "number" + ? currentNode.style.width + : 300; const filename = `crop-${Date.now()}.png`; const dimensions = { width: payload.outputWidth, height: payload.outputHeight }; const size = resolveMediaNodeCreationSizeFromDimensions(dimensions) ?? undefined; @@ -381,11 +379,9 @@ export function GenerateImageNodeView({ id, data, selected, renderInputHandle = if (!currentNode || !imageSource) return; const currentPosition = currentNode.position ?? { x: 0, y: 0 }; - const currentWidth = typeof currentNode.width === "number" - ? currentNode.width - : typeof currentNode.style?.width === "number" - ? currentNode.style.width - : 300; + const currentWidth = typeof currentNode.style?.width === "number" + ? currentNode.style.width + : 300; const dimensions = await readHighDefinitionSourceImageDimensions(currentNode.data as { dimensions?: unknown }, imageSource); createHighDefinitionImageNode({ sourceNodeId: id, @@ -408,11 +404,9 @@ export function GenerateImageNodeView({ id, data, selected, renderInputHandle = if (!currentNode || !imageSource || !outpaintingModel) return; const currentPosition = currentNode.position ?? { x: 0, y: 0 }; - const currentWidth = typeof currentNode.width === "number" - ? currentNode.width - : typeof currentNode.style?.width === "number" - ? currentNode.style.width - : 300; + const currentWidth = typeof currentNode.style?.width === "number" + ? currentNode.style.width + : 300; const sourceDimensions = await readHighDefinitionSourceImageDimensions(currentNode.data as { dimensions?: unknown }, imageSource); const dimensions = deriveOutpaintingOutputDimensions(sourceDimensions, params) ?? sourceDimensions; const size = resolveMediaNodeCreationSizeFromDimensions(dimensions) ?? undefined; diff --git a/src/components/nodes/ImageInputNode.tsx b/src/components/nodes/ImageInputNode.tsx index 06bfa74a..e59fe9a0 100644 --- a/src/components/nodes/ImageInputNode.tsx +++ b/src/components/nodes/ImageInputNode.tsx @@ -293,11 +293,9 @@ export function ImageInputNodeView({ id, data, selected, renderInputHandle = fal if (!currentNode || !imageSource) return; const currentPosition = currentNode.position ?? { x: 0, y: 0 }; - const currentWidth = typeof currentNode.width === "number" - ? currentNode.width - : typeof currentNode.style?.width === "number" - ? currentNode.style.width - : IMAGE_INPUT_DIMENSIONS.width; + const currentWidth = typeof currentNode.style?.width === "number" + ? currentNode.style.width + : IMAGE_INPUT_DIMENSIONS.width; const dimensions = await readHighDefinitionSourceImageDimensions(currentNode.data as { dimensions?: unknown }, imageSource); createHighDefinitionImageNode({ sourceNodeId: id, diff --git a/src/components/nodes/TextNodeResizer.tsx b/src/components/nodes/TextNodeResizer.tsx index 21e9193c..fc762f77 100644 --- a/src/components/nodes/TextNodeResizer.tsx +++ b/src/components/nodes/TextNodeResizer.tsx @@ -13,8 +13,6 @@ interface TextNodeResizerProps { function applyNodeDimensions(node: Node, width: number, height: number): Node { return { ...node, - width, - height, style: { ...node.style, width, height }, }; } diff --git a/src/store/workflowStore.ts b/src/store/workflowStore.ts index 4788fc27..c09de9b3 100644 --- a/src/store/workflowStore.ts +++ b/src/store/workflowStore.ts @@ -553,42 +553,6 @@ function withDefaultCustomTitle(type: NodeType, data: WorkflowNodeData, nodes: W } as WorkflowNodeData; } -function logSmartImage7Snapshot(label: string, node: WorkflowNode | undefined | null, extra?: Record) { - if (!node || node.id !== "smartImage-7") return; - const data = node.data as { - inputPrompt?: unknown; - selectedModel?: SelectedModel; - outputImage?: unknown; - inputImages?: unknown; - referenceSubjectList?: unknown; - parameters?: unknown; - status?: unknown; - }; - console.debug("[composer-debug] smartImage-7 data trace", { - label, - id: node.id, - type: node.type, - selected: node.selected, - inputPrompt: data.inputPrompt, - selectedModel: data.selectedModel - ? { - provider: data.selectedModel.provider, - modelId: data.selectedModel.modelId, - displayName: data.selectedModel.displayName, - type: data.selectedModel.type, - subType: data.selectedModel.subType, - capabilities: data.selectedModel.capabilities, - } - : undefined, - hasOutputImage: Boolean(data.outputImage), - inputImages: data.inputImages, - referenceSubjectList: data.referenceSubjectList, - parameters: data.parameters, - status: data.status, - ...extra, - }); -} - function canConnectToDerivedMediaTarget(connection: Connection, nodes: WorkflowNode[]): boolean { const targetNode = connection.target ? nodes.find((node) => node.id === connection.target) @@ -1582,12 +1546,6 @@ const workflowStoreImpl: StateCreator = (set, get) => ({ convertNodeType: (nodeId: string, type: NodeType, initialData?: Partial) => { const sourceNode = get().nodes.find((node) => node.id === nodeId); if (!sourceNode) return; - if (nodeId === "smartImage-7") { - logSmartImage7Snapshot("convertNodeType:before", sourceNode, { - nextType: type, - initialData, - }); - } const { width, height } = defaultNodeDimensions[type]; const sourceData = sourceNode.data as { @@ -1624,12 +1582,6 @@ const workflowStoreImpl: StateCreator = (set, get) => ({ ) as WorkflowNode[], hasUnsavedChanges: true, })); - if (nodeId === "smartImage-7") { - logSmartImage7Snapshot("convertNodeType:after", get().nodes.find((node) => node.id === nodeId), { - nextType: type, - initialData, - }); - } get().incrementManualChangeCount(); }, @@ -1638,12 +1590,6 @@ const workflowStoreImpl: StateCreator = (set, get) => ({ const node = get().nodes.find((n) => n.id === nodeId); if (!node) return; const managedData = buildStoreManagedGenerationData(node, data, get); - if (nodeId === "smartImage-7") { - logSmartImage7Snapshot("updateNodeData:before", node, { - patch: data, - managedPatch: managedData, - }); - } const hasDataChange = Object.entries(managedData).some( ([key, value]) => !Object.is((node.data as Record)[key], value) @@ -1655,12 +1601,6 @@ const workflowStoreImpl: StateCreator = (set, get) => ({ const resizedNode = applyWorkflowNodeStyleSize(node, canvasSize); const hasSizeChange = resizedNode !== node; if (!hasDataChange && !hasSizeChange) { - if (nodeId === "smartImage-7") { - logSmartImage7Snapshot("updateNodeData:no-change", node, { - patch: data, - managedPatch: managedData, - }); - } return; } const selectedModelChanged = Object.prototype.hasOwnProperty.call(managedData, "selectedModel"); @@ -1694,12 +1634,6 @@ const workflowStoreImpl: StateCreator = (set, get) => ({ ) as WorkflowNode[], hasUnsavedChanges: true, })); - if (nodeId === "smartImage-7") { - logSmartImage7Snapshot("updateNodeData:after", get().nodes.find((node) => node.id === nodeId), { - patch: data, - managedPatch: managedData, - }); - } if (selectedModelChanged) { const unsupportedEdgeIds = getUnsupportedReferenceEdgeIds(nodeId, get); if (unsupportedEdgeIds.length > 0) { @@ -3412,11 +3346,6 @@ const workflowStoreImpl: StateCreator = (set, get) => ({ }, loadWorkflow: async (workflow: WorkflowFile, workflowPath?: string, options?: { preserveSnapshot?: boolean }) => { - logSmartImage7Snapshot( - "loadWorkflow:start", - (workflow.nodes as WorkflowNode[]).find((node) => node.id === "smartImage-7") - ); - // Update nodeIdCounter to avoid ID collisions const maxNodeId = workflow.nodes.reduce((max, node) => { const match = node.id.match(/-(\d+)$/); @@ -3453,10 +3382,6 @@ const workflowStoreImpl: StateCreator = (set, get) => ({ } return node; }) as WorkflowNode[]; - logSmartImage7Snapshot( - "loadWorkflow:after-model-normalize", - (workflow.nodes as WorkflowNode[]).find((node) => node.id === "smartImage-7") - ); workflow.edges = workflow.edges.map((edge) => normalizeWorkflowEdgeHandles(edge)); diff --git a/src/utils/splitGridNodes.ts b/src/utils/splitGridNodes.ts index b91c1728..2d31727a 100644 --- a/src/utils/splitGridNodes.ts +++ b/src/utils/splitGridNodes.ts @@ -1,6 +1,7 @@ import type { XYPosition } from "@xyflow/react"; import type { Connection } from "@xyflow/react"; import type { SmartImageNodeData, WorkflowNode } from "@/types"; +import { defaultNodeDimensions } from "@/constants/nodeDimensions"; import { createPendingDerivedImageNode } from "@/utils/derivedImageNodes"; import { resolveMediaNodeCreationSizeFromDimensions } from "@/utils/nodeSizing"; @@ -14,13 +15,17 @@ interface SplitGridNodeCreationOptions { selectSingleNode?: (nodeId: string) => void; } -function getNodeWidth(node: WorkflowNode) { - return node.style?.width as number; +function getStyleWidth(node: WorkflowNode): number { + return typeof node.style?.width === "number" ? node.style.width : defaultNodeDimensions.imageInput.width; +} + +function getStyleHeight(node: WorkflowNode): number { + return typeof node.style?.height === "number" ? node.style.height : defaultNodeDimensions.imageInput.height; } function getSplitNodeStartPosition(sourceNode: WorkflowNode): XYPosition { return { - x: sourceNode.position.x + getNodeWidth(sourceNode) + 220, + x: sourceNode.position.x + getStyleWidth(sourceNode) + 220, y: sourceNode.position.y, }; } @@ -49,9 +54,7 @@ function resolveSplitNodeDimensions(sourceNode: WorkflowNode, rows: number, cols function resolveSplitNodeSize(sourceNode: WorkflowNode, splitDimensions: { width: number; height: number } | null): { width: number; height: number } { const splitNodeSize = resolveMediaNodeCreationSizeFromDimensions(splitDimensions); if (!splitNodeSize) { - const width = sourceNode.style?.width as number; - const height = sourceNode.style?.height as number; - return { width, height }; + return { width: getStyleWidth(sourceNode), height: getStyleHeight(sourceNode) }; } return splitNodeSize; } diff --git a/src/utils/videoFrameNode.ts b/src/utils/videoFrameNode.ts index a043bee5..27c10ad0 100644 --- a/src/utils/videoFrameNode.ts +++ b/src/utils/videoFrameNode.ts @@ -10,7 +10,6 @@ type AddNode = ( ) => string; function getNodeWidth(node: WorkflowNode): number { - if (typeof node.width === "number") return node.width; if (typeof node.style?.width === "number") return node.style.width; return 300; }