import type { Node, WorkflowDataUpdater, } from '@/app/components/workflow/types' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' import { START_INITIAL_POSITION } from '@/app/components/workflow/constants' import startPlaceholderDefault from '@/app/components/workflow/nodes/start-placeholder/default' import { BlockEnum } from '@/app/components/workflow/types' import { generateNewNode } from '@/app/components/workflow/utils' import { AppModeEnum } from '@/types/app' type HydrateWorkflowDraftGraphOptions = { localStartPlaceholderNodes?: Node[] } const hasWorkflowEntryNode = (nodes: Node[] = []): boolean => { return nodes.some(node => ( node?.data?.type === BlockEnum.Start || node?.data?.type === BlockEnum.TriggerSchedule || node?.data?.type === BlockEnum.TriggerWebhook || node?.data?.type === BlockEnum.TriggerPlugin )) } const hasStartPlaceholderNode = (nodes: Node[] = []): boolean => { return nodes.some(node => node?.data?.type === BlockEnum.StartPlaceholder) } export const useWorkflowDraftGraphForCanvas = (appMode?: AppModeEnum | string) => { const { t } = useTranslation() const getNodesWithLocalStartPlaceholder = useCallback(( nodes: Node[] = [], localStartPlaceholderNodes?: Node[], ) => { if (appMode !== AppModeEnum.WORKFLOW || hasWorkflowEntryNode(nodes) || hasStartPlaceholderNode(nodes)) return nodes if (localStartPlaceholderNodes?.length) return [...localStartPlaceholderNodes, ...nodes] const { newNode: startPlaceholderNode } = generateNewNode({ data: { ...startPlaceholderDefault.defaultValue, selected: true, type: startPlaceholderDefault.metaData.type, title: t(`blocks.${startPlaceholderDefault.metaData.type}`, { ns: 'workflow' }), desc: '', }, position: START_INITIAL_POSITION, }) return [startPlaceholderNode, ...nodes] }, [appMode, t]) const getWorkflowDraftGraphForCanvas = useCallback(( graph?: Partial, options?: HydrateWorkflowDraftGraphOptions, ): WorkflowDataUpdater => { const nodes = getNodesWithLocalStartPlaceholder( graph?.nodes || [], options?.localStartPlaceholderNodes, ) return { nodes, edges: graph?.edges || [], viewport: graph?.viewport || { x: 0, y: 0, zoom: 1 }, } }, [getNodesWithLocalStartPlaceholder]) return { getWorkflowDraftGraphForCanvas, } }