diff --git a/oxlint-suppressions.json b/oxlint-suppressions.json index 0569de71067..f98f7a16fa9 100644 --- a/oxlint-suppressions.json +++ b/oxlint-suppressions.json @@ -3634,11 +3634,6 @@ "count": 1 } }, - "web/app/components/rag-pipeline/hooks/index.ts": { - "no-barrel-files/no-barrel-files": { - "count": 9 - } - }, "web/app/components/rag-pipeline/hooks/use-DSL.ts": { "typescript/no-explicit-any": { "count": 1 @@ -3891,11 +3886,6 @@ "count": 3 } }, - "web/app/components/workflow-app/hooks/index.ts": { - "no-barrel-files/no-barrel-files": { - "count": 13 - } - }, "web/app/components/workflow-app/hooks/use-DSL.ts": { "typescript/no-explicit-any": { "count": 1 @@ -4035,11 +4025,6 @@ "count": 1 } }, - "web/app/components/workflow/hooks/index.ts": { - "no-barrel-files/no-barrel-files": { - "count": 25 - } - }, "web/app/components/workflow/hooks/use-checklist.ts": { "typescript/no-empty-object-type": { "count": 1 @@ -4068,11 +4053,6 @@ "count": 1 } }, - "web/app/components/workflow/hooks/use-workflow-run-event/index.ts": { - "no-barrel-files/no-barrel-files": { - "count": 19 - } - }, "web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-agent-log.ts": { "typescript/no-explicit-any": { "count": 1 diff --git a/web/app/components/app/configuration/config/automatic/instruction-editor-in-workflow.tsx b/web/app/components/app/configuration/config/automatic/instruction-editor-in-workflow.tsx index d6e0724ee2e..b3d27f30e2a 100644 --- a/web/app/components/app/configuration/config/automatic/instruction-editor-in-workflow.tsx +++ b/web/app/components/app/configuration/config/automatic/instruction-editor-in-workflow.tsx @@ -4,7 +4,7 @@ import type { GeneratorType } from './types' import type { ValueSelector, Var } from '@/app/components/workflow/types' import * as React from 'react' import { useCallback } from 'react' -import { useWorkflowVariableType } from '@/app/components/workflow/hooks' +import { useWorkflowVariableType } from '@/app/components/workflow/hooks/use-workflow-variables' import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list' import { useWorkflowStore } from '@/app/components/workflow/store' import { VarType } from '@/app/components/workflow/types' diff --git a/web/app/components/rag-pipeline/__tests__/index.spec.tsx b/web/app/components/rag-pipeline/__tests__/index.spec.tsx index 47219cca7dd..aee7f2c13a2 100644 --- a/web/app/components/rag-pipeline/__tests__/index.spec.tsx +++ b/web/app/components/rag-pipeline/__tests__/index.spec.tsx @@ -9,7 +9,7 @@ vi.mock('@/context/dataset-detail', () => ({ selector({ dataset: pipelineId ? { pipeline_id: pipelineId } : undefined }), })) -vi.mock('../hooks', () => ({ +vi.mock('../hooks/use-pipeline-init', () => ({ usePipelineInit: () => pipelineInit, })) diff --git a/web/app/components/rag-pipeline/components/__tests__/rag-pipeline-children.spec.tsx b/web/app/components/rag-pipeline/components/__tests__/rag-pipeline-children.spec.tsx index 6614faa0d17..4eb05f9f445 100644 --- a/web/app/components/rag-pipeline/components/__tests__/rag-pipeline-children.spec.tsx +++ b/web/app/components/rag-pipeline/components/__tests__/rag-pipeline-children.spec.tsx @@ -60,11 +60,14 @@ vi.mock('@/app/components/workflow/hooks-store', () => ({ }), })) -vi.mock('@/app/components/workflow/hooks', () => ({ +vi.mock('@/app/components/workflow/hooks/use-DSL', () => ({ useDSL: () => ({ exportCheck: mockExportCheck, handleExportDSL: mockHandleExportDSL, }), +})) + +vi.mock('@/app/components/workflow/hooks/use-panel-interactions', () => ({ usePanelInteractions: () => ({ handlePaneContextmenuCancel: mockHandlePaneContextmenuCancel, }), @@ -74,7 +77,7 @@ vi.mock('../../hooks/use-rag-pipeline-search', () => ({ useRagPipelineSearch: mockUseRagPipelineSearch, })) -vi.mock('../../../workflow/plugin-dependency', () => ({ +vi.mock('@/app/components/workflow/plugin-dependency', () => ({ default: () =>
, })) diff --git a/web/app/components/rag-pipeline/components/__tests__/rag-pipeline-main.spec.tsx b/web/app/components/rag-pipeline/components/__tests__/rag-pipeline-main.spec.tsx index e384f581b1f..d089b483292 100644 --- a/web/app/components/rag-pipeline/components/__tests__/rag-pipeline-main.spec.tsx +++ b/web/app/components/rag-pipeline/components/__tests__/rag-pipeline-main.spec.tsx @@ -17,19 +17,24 @@ vi.mock('@/context/workspace-state', async () => { })) }) -vi.mock('../../hooks', () => ({ +vi.mock('../../hooks/use-available-nodes-meta-data', () => ({ useAvailableNodesMetaData: () => ({ nodes: [], nodesMap: {} }), - useDSL: () => ({ - exportCheck: vi.fn(), - handleExportDSL: vi.fn(), - }), +})) + +vi.mock('../../hooks/use-DSL', () => ({ useDSLByCanEdit: () => ({ exportCheck: vi.fn(), handleExportDSL: vi.fn(), }), +})) + +vi.mock('../../hooks/use-get-run-and-trace-url', () => ({ useGetRunAndTraceUrl: () => ({ getWorkflowRunAndTraceUrl: vi.fn(), }), +})) + +vi.mock('../../hooks/use-nodes-sync-draft', () => ({ useNodesSyncDraft: () => ({ doSyncWorkflowDraft: vi.fn(), syncWorkflowDraftWhenPageClose: vi.fn(), @@ -38,16 +43,15 @@ vi.mock('../../hooks', () => ({ doSyncWorkflowDraft: vi.fn(), syncWorkflowDraftWhenPageClose: vi.fn(), }), +})) + +vi.mock('../../hooks/use-pipeline-refresh-draft', () => ({ usePipelineRefreshDraft: () => ({ handleRefreshWorkflowDraft: vi.fn(), }), - usePipelineRun: () => ({ - handleBackupDraft: vi.fn(), - handleLoadBackupDraft: vi.fn(), - handleRestoreFromPublishedWorkflow: vi.fn(), - handleRun: vi.fn(), - handleStopRun: vi.fn(), - }), +})) + +vi.mock('../../hooks/use-pipeline-run', () => ({ usePipelineRunByCanEdit: () => ({ handleBackupDraft: vi.fn(), handleLoadBackupDraft: vi.fn(), @@ -55,10 +59,9 @@ vi.mock('../../hooks', () => ({ handleRun: vi.fn(), handleStopRun: vi.fn(), }), - usePipelineStartRun: () => ({ - handleStartWorkflowRun: vi.fn(), - handleWorkflowStartRunInWorkflow: vi.fn(), - }), +})) + +vi.mock('../../hooks/use-pipeline-start-run', () => ({ usePipelineStartRunByCanEdit: () => ({ handleStartWorkflowRun: vi.fn(), handleWorkflowStartRunInWorkflow: vi.fn(), diff --git a/web/app/components/rag-pipeline/components/panel/input-field/__tests__/index.spec.tsx b/web/app/components/rag-pipeline/components/panel/input-field/__tests__/index.spec.tsx index 84cc234ebb6..59918decc06 100644 --- a/web/app/components/rag-pipeline/components/panel/input-field/__tests__/index.spec.tsx +++ b/web/app/components/rag-pipeline/components/panel/input-field/__tests__/index.spec.tsx @@ -18,7 +18,7 @@ let mockIsPreviewing = false let mockIsEditing = false let mockCanEdit = true -vi.mock('@/app/components/rag-pipeline/hooks', () => ({ +vi.mock('../../../../hooks/use-input-field-panel', () => ({ useInputFieldPanel: () => ({ closeAllInputFieldPanels: mockCloseAllInputFieldPanels, toggleInputFieldPreviewPanel: mockToggleInputFieldPreviewPanel, @@ -61,7 +61,7 @@ vi.mock('@/app/components/workflow/store', () => ({ const mockHandleSyncWorkflowDraft = vi.fn() -vi.mock('@/app/components/workflow/hooks', () => ({ +vi.mock('@/app/components/workflow/hooks/use-nodes-sync-draft', () => ({ useNodesSyncDraft: () => ({ handleSyncWorkflowDraft: mockHandleSyncWorkflowDraft, }), diff --git a/web/app/components/rag-pipeline/components/panel/input-field/field-list/__tests__/hooks.spec.ts b/web/app/components/rag-pipeline/components/panel/input-field/field-list/__tests__/hooks.spec.ts index 3876c2d535d..25f62b86f38 100644 --- a/web/app/components/rag-pipeline/components/panel/input-field/field-list/__tests__/hooks.spec.ts +++ b/web/app/components/rag-pipeline/components/panel/input-field/field-list/__tests__/hooks.spec.ts @@ -5,7 +5,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { useFieldList } from '../hooks' const mockToggleInputFieldEditPanel = vi.fn() -vi.mock('@/app/components/rag-pipeline/hooks', () => ({ +vi.mock('../../../../../hooks/use-input-field-panel', () => ({ useInputFieldPanel: () => ({ toggleInputFieldEditPanel: mockToggleInputFieldEditPanel, }), diff --git a/web/app/components/rag-pipeline/components/panel/input-field/field-list/hooks.ts b/web/app/components/rag-pipeline/components/panel/input-field/field-list/hooks.ts index a85c90f7025..e7a99b0e46c 100644 --- a/web/app/components/rag-pipeline/components/panel/input-field/field-list/hooks.ts +++ b/web/app/components/rag-pipeline/components/panel/input-field/field-list/hooks.ts @@ -6,8 +6,8 @@ import { useBoolean } from 'ahooks' import { produce } from 'immer' import { useCallback, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' -import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks' import { ChangeType } from '@/app/components/workflow/types' +import { useInputFieldPanel } from '../../../../hooks/use-input-field-panel' import { usePipeline } from '../../../../hooks/use-pipeline' const VARIABLE_PREFIX = 'rag' diff --git a/web/app/components/rag-pipeline/components/panel/input-field/index.tsx b/web/app/components/rag-pipeline/components/panel/input-field/index.tsx index a59bae24638..a1544fbb702 100644 --- a/web/app/components/rag-pipeline/components/panel/input-field/index.tsx +++ b/web/app/components/rag-pipeline/components/panel/input-field/index.tsx @@ -9,11 +9,11 @@ import { useTranslation } from 'react-i18next' import { useNodes } from 'reactflow' import Divider from '@/app/components/base/divider' import { Infotip } from '@/app/components/base/infotip' -import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks' -import { useNodesSyncDraft } from '@/app/components/workflow/hooks' import { useHooksStore } from '@/app/components/workflow/hooks-store' +import { useNodesSyncDraft } from '@/app/components/workflow/hooks/use-nodes-sync-draft' import { useStore } from '@/app/components/workflow/store' import { BlockEnum } from '@/app/components/workflow/types' +import { useInputFieldPanel } from '../../../hooks/use-input-field-panel' import FieldList from './field-list' import FooterTip from './footer-tip' import Datasource from './label-right-content/datasource' diff --git a/web/app/components/rag-pipeline/components/panel/input-field/label-right-content/__tests__/datasource.spec.tsx b/web/app/components/rag-pipeline/components/panel/input-field/label-right-content/__tests__/datasource.spec.tsx index b0ab5d53125..5a15d0e035f 100644 --- a/web/app/components/rag-pipeline/components/panel/input-field/label-right-content/__tests__/datasource.spec.tsx +++ b/web/app/components/rag-pipeline/components/panel/input-field/label-right-content/__tests__/datasource.spec.tsx @@ -2,7 +2,7 @@ import type { DataSourceNodeType } from '@/app/components/workflow/nodes/data-so import { render, screen } from '@testing-library/react' import Datasource from '../datasource' -vi.mock('@/app/components/workflow/hooks', () => ({ +vi.mock('@/app/components/workflow/hooks/use-tool-icon', () => ({ useToolIcon: () => 'tool-icon', })) diff --git a/web/app/components/rag-pipeline/components/panel/input-field/label-right-content/datasource.tsx b/web/app/components/rag-pipeline/components/panel/input-field/label-right-content/datasource.tsx index 4c16a1b1af8..1455efc2451 100644 --- a/web/app/components/rag-pipeline/components/panel/input-field/label-right-content/datasource.tsx +++ b/web/app/components/rag-pipeline/components/panel/input-field/label-right-content/datasource.tsx @@ -1,7 +1,7 @@ import type { DataSourceNodeType } from '@/app/components/workflow/nodes/data-source/types' import * as React from 'react' import BlockIcon from '@/app/components/workflow/block-icon' -import { useToolIcon } from '@/app/components/workflow/hooks' +import { useToolIcon } from '@/app/components/workflow/hooks/use-tool-icon' import { BlockEnum } from '@/app/components/workflow/types' type DatasourceProps = { diff --git a/web/app/components/rag-pipeline/components/panel/input-field/preview/__tests__/form.spec.tsx b/web/app/components/rag-pipeline/components/panel/input-field/preview/__tests__/form.spec.tsx index e721b44984b..292e6572173 100644 --- a/web/app/components/rag-pipeline/components/panel/input-field/preview/__tests__/form.spec.tsx +++ b/web/app/components/rag-pipeline/components/panel/input-field/preview/__tests__/form.spec.tsx @@ -27,7 +27,7 @@ vi.mock('@/app/components/base/form/form-scenarios/base/field', () => ({ default: mockBaseField, })) -vi.mock('@/app/components/rag-pipeline/hooks/use-input-fields', () => ({ +vi.mock('../../../../../hooks/use-input-fields', () => ({ useInitialData: mockUseInitialData, useConfigurations: mockUseConfigurations, })) diff --git a/web/app/components/rag-pipeline/components/panel/input-field/preview/__tests__/index.spec.tsx b/web/app/components/rag-pipeline/components/panel/input-field/preview/__tests__/index.spec.tsx index c27ddd72c7a..c34c535c3f9 100644 --- a/web/app/components/rag-pipeline/components/panel/input-field/preview/__tests__/index.spec.tsx +++ b/web/app/components/rag-pipeline/components/panel/input-field/preview/__tests__/index.spec.tsx @@ -19,7 +19,7 @@ vi.mock('../../hooks', () => ({ })) const mockToggleInputFieldPreviewPanel = vi.fn() -vi.mock('@/app/components/rag-pipeline/hooks', () => ({ +vi.mock('../../../../../hooks/use-input-field-panel', () => ({ useInputFieldPanel: () => ({ toggleInputFieldPreviewPanel: mockToggleInputFieldPreviewPanel, isPreviewing: true, @@ -108,7 +108,7 @@ const mapOptionToObject = (option: string) => ({ value: option, }) -vi.mock('@/app/components/rag-pipeline/hooks/use-input-fields', () => ({ +vi.mock('../../../../../hooks/use-input-fields', () => ({ useInitialData: (variables: RAGPipelineVariables) => { return React.useMemo(() => { return variables.reduce( diff --git a/web/app/components/rag-pipeline/components/panel/input-field/preview/form.tsx b/web/app/components/rag-pipeline/components/panel/input-field/preview/form.tsx index fda2715f2eb..388bd091e21 100644 --- a/web/app/components/rag-pipeline/components/panel/input-field/preview/form.tsx +++ b/web/app/components/rag-pipeline/components/panel/input-field/preview/form.tsx @@ -1,10 +1,7 @@ import type { RAGPipelineVariables } from '@/models/pipeline' import { useAppForm } from '@/app/components/base/form' import BaseField from '@/app/components/base/form/form-scenarios/base/field' -import { - useConfigurations, - useInitialData, -} from '@/app/components/rag-pipeline/hooks/use-input-fields' +import { useConfigurations, useInitialData } from '../../../../hooks/use-input-fields' type FormProps = { variables: RAGPipelineVariables diff --git a/web/app/components/rag-pipeline/components/panel/input-field/preview/index.tsx b/web/app/components/rag-pipeline/components/panel/input-field/preview/index.tsx index 1b64009f8fb..e00d022d401 100644 --- a/web/app/components/rag-pipeline/components/panel/input-field/preview/index.tsx +++ b/web/app/components/rag-pipeline/components/panel/input-field/preview/index.tsx @@ -5,7 +5,7 @@ import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import Badge from '@/app/components/base/badge' import Divider from '@/app/components/base/divider' -import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks' +import { useInputFieldPanel } from '../../../../hooks/use-input-field-panel' import { useFloatingRight } from '../hooks' import DataSource from './data-source' import ProcessDocuments from './process-documents' diff --git a/web/app/components/rag-pipeline/components/panel/test-run/__tests__/header.spec.tsx b/web/app/components/rag-pipeline/components/panel/test-run/__tests__/header.spec.tsx index c420646e8d1..e4e4e69f8c9 100644 --- a/web/app/components/rag-pipeline/components/panel/test-run/__tests__/header.spec.tsx +++ b/web/app/components/rag-pipeline/components/panel/test-run/__tests__/header.spec.tsx @@ -17,7 +17,7 @@ vi.mock('@/app/components/workflow/store', () => ({ useWorkflowStore: () => mockWorkflowStore, })) -vi.mock('@/app/components/workflow/hooks', () => ({ +vi.mock('@/app/components/workflow/hooks/use-workflow-panel-interactions', () => ({ useWorkflowInteractions: () => ({ handleCancelDebugAndPreviewPanel: mockHandleCancelDebugAndPreviewPanel, }), diff --git a/web/app/components/rag-pipeline/components/panel/test-run/header.tsx b/web/app/components/rag-pipeline/components/panel/test-run/header.tsx index a9714da31b6..6521e91495a 100644 --- a/web/app/components/rag-pipeline/components/panel/test-run/header.tsx +++ b/web/app/components/rag-pipeline/components/panel/test-run/header.tsx @@ -2,7 +2,7 @@ import { RiCloseLine } from '@remixicon/react' import * as React from 'react' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' -import { useWorkflowInteractions } from '@/app/components/workflow/hooks' +import { useWorkflowInteractions } from '@/app/components/workflow/hooks/use-workflow-panel-interactions' import { useWorkflowStore } from '@/app/components/workflow/store' const Header = () => { diff --git a/web/app/components/rag-pipeline/components/panel/test-run/preparation/__tests__/index.spec.tsx b/web/app/components/rag-pipeline/components/panel/test-run/preparation/__tests__/index.spec.tsx index dd3f6468be3..0e55689be05 100644 --- a/web/app/components/rag-pipeline/components/panel/test-run/preparation/__tests__/index.spec.tsx +++ b/web/app/components/rag-pipeline/components/panel/test-run/preparation/__tests__/index.spec.tsx @@ -102,10 +102,13 @@ vi.mock('@/app/components/workflow/store', () => ({ const mockHandleRun = vi.fn() -vi.mock('@/app/components/workflow/hooks', () => ({ +vi.mock('@/app/components/workflow/hooks/use-workflow-run', () => ({ useWorkflowRun: () => ({ handleRun: mockHandleRun, }), +})) + +vi.mock('@/app/components/workflow/hooks/use-tool-icon', () => ({ useToolIcon: () => ({ type: 'icon', icon: 'test-icon' }), })) diff --git a/web/app/components/rag-pipeline/components/panel/test-run/preparation/data-source-options/__tests__/option-card.spec.tsx b/web/app/components/rag-pipeline/components/panel/test-run/preparation/data-source-options/__tests__/option-card.spec.tsx index 81edc1ab73c..4c10ee9fe08 100644 --- a/web/app/components/rag-pipeline/components/panel/test-run/preparation/data-source-options/__tests__/option-card.spec.tsx +++ b/web/app/components/rag-pipeline/components/panel/test-run/preparation/data-source-options/__tests__/option-card.spec.tsx @@ -2,7 +2,7 @@ import type { DataSourceNodeType } from '@/app/components/workflow/nodes/data-so import { fireEvent, render, screen } from '@testing-library/react' import OptionCard from '../option-card' -vi.mock('@/app/components/workflow/hooks', () => ({ +vi.mock('@/app/components/workflow/hooks/use-tool-icon', () => ({ useToolIcon: () => 'source-icon', })) diff --git a/web/app/components/rag-pipeline/components/panel/test-run/preparation/data-source-options/option-card.tsx b/web/app/components/rag-pipeline/components/panel/test-run/preparation/data-source-options/option-card.tsx index a15f5d05b3b..48aecf54a94 100644 --- a/web/app/components/rag-pipeline/components/panel/test-run/preparation/data-source-options/option-card.tsx +++ b/web/app/components/rag-pipeline/components/panel/test-run/preparation/data-source-options/option-card.tsx @@ -3,7 +3,7 @@ import { cn } from '@langgenius/dify-ui/cn' import * as React from 'react' import { useCallback } from 'react' import BlockIcon from '@/app/components/workflow/block-icon' -import { useToolIcon } from '@/app/components/workflow/hooks' +import { useToolIcon } from '@/app/components/workflow/hooks/use-tool-icon' import { BlockEnum } from '@/app/components/workflow/types' type OptionCardProps = { diff --git a/web/app/components/rag-pipeline/components/panel/test-run/preparation/document-processing/__tests__/index.spec.tsx b/web/app/components/rag-pipeline/components/panel/test-run/preparation/document-processing/__tests__/index.spec.tsx index 066e830fe78..6ab4683fb43 100644 --- a/web/app/components/rag-pipeline/components/panel/test-run/preparation/document-processing/__tests__/index.spec.tsx +++ b/web/app/components/rag-pipeline/components/panel/test-run/preparation/document-processing/__tests__/index.spec.tsx @@ -48,7 +48,7 @@ vi.mock('@/service/use-pipeline', () => ({ const mockUseInitialData = vi.fn() const mockUseConfigurations = vi.fn() -vi.mock('@/app/components/rag-pipeline/hooks/use-input-fields', () => ({ +vi.mock('../../../../../../hooks/use-input-fields', () => ({ useInitialData: (variables: RAGPipelineVariables) => mockUseInitialData(variables), useConfigurations: (variables: RAGPipelineVariables) => mockUseConfigurations(variables), })) diff --git a/web/app/components/rag-pipeline/components/panel/test-run/preparation/document-processing/index.tsx b/web/app/components/rag-pipeline/components/panel/test-run/preparation/document-processing/index.tsx index a22d1d7edf9..677847204cb 100644 --- a/web/app/components/rag-pipeline/components/panel/test-run/preparation/document-processing/index.tsx +++ b/web/app/components/rag-pipeline/components/panel/test-run/preparation/document-processing/index.tsx @@ -2,10 +2,7 @@ import type { CustomActionsProps } from '@/app/components/base/form/components/f import * as React from 'react' import { useCallback } from 'react' import { generateZodSchema } from '@/app/components/base/form/form-scenarios/base/utils' -import { - useConfigurations, - useInitialData, -} from '@/app/components/rag-pipeline/hooks/use-input-fields' +import { useConfigurations, useInitialData } from '../../../../../hooks/use-input-fields' import Actions from './actions' import { useInputVariables } from './hooks' import Options from './options' diff --git a/web/app/components/rag-pipeline/components/panel/test-run/preparation/index.tsx b/web/app/components/rag-pipeline/components/panel/test-run/preparation/index.tsx index 533af1fe847..bbd65538715 100644 --- a/web/app/components/rag-pipeline/components/panel/test-run/preparation/index.tsx +++ b/web/app/components/rag-pipeline/components/panel/test-run/preparation/index.tsx @@ -11,7 +11,7 @@ import { useDataSourceStoreWithSelector, } from '@/app/components/datasets/documents/create-from-pipeline/data-source/store' import WebsiteCrawl from '@/app/components/datasets/documents/create-from-pipeline/data-source/website-crawl' -import { useWorkflowRun } from '@/app/components/workflow/hooks' +import { useWorkflowRun } from '@/app/components/workflow/hooks/use-workflow-run' import { useWorkflowStore } from '@/app/components/workflow/store' import { DatasourceType } from '@/models/pipeline' import { TransferMethod } from '@/types/app' diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-children.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-children.tsx index 066f035ff88..38dd6103808 100644 --- a/web/app/components/rag-pipeline/components/rag-pipeline-children.tsx +++ b/web/app/components/rag-pipeline/components/rag-pipeline-children.tsx @@ -2,11 +2,12 @@ import type { EnvironmentVariable } from '@/app/components/workflow/types' import { memo, useState } from 'react' import { DSL_EXPORT_CHECK } from '@/app/components/workflow/constants' import DSLExportConfirmModal from '@/app/components/workflow/dsl-export-confirm-modal' -import { useDSL, usePanelInteractions } from '@/app/components/workflow/hooks' import { useHooksStore } from '@/app/components/workflow/hooks-store' +import { useDSL } from '@/app/components/workflow/hooks/use-DSL' +import { usePanelInteractions } from '@/app/components/workflow/hooks/use-panel-interactions' +import PluginDependency from '@/app/components/workflow/plugin-dependency' +import { useStore } from '@/app/components/workflow/store' import { useEventEmitterContextContext } from '@/context/event-emitter' -import PluginDependency from '../../workflow/plugin-dependency' -import { useStore } from '../../workflow/store' import { useRagPipelineSearch } from '../hooks/use-rag-pipeline-search' import RagPipelinePanel from './panel' import PublishToast from './publish-toast' diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-header/__tests__/run-mode.spec.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-header/__tests__/run-mode.spec.tsx index 205fa856edd..aeadb735879 100644 --- a/web/app/components/rag-pipeline/components/rag-pipeline-header/__tests__/run-mode.spec.tsx +++ b/web/app/components/rag-pipeline/components/rag-pipeline-header/__tests__/run-mode.spec.tsx @@ -33,10 +33,13 @@ vi.mock('@tanstack/react-hotkeys', async (importOriginal) => { let mockWorkflowRunningData: { task_id: string; result: { status: string } } | undefined let mockIsPreparingDataSource = false -vi.mock('@/app/components/workflow/hooks', () => ({ +vi.mock('@/app/components/workflow/hooks/use-workflow-run', () => ({ useWorkflowRun: () => ({ handleStopRun: mockHandleStopRun, }), +})) + +vi.mock('@/app/components/workflow/hooks/use-workflow-start-run', () => ({ useWorkflowStartRun: () => ({ handleWorkflowStartRunInWorkflow: mockHandleWorkflowStartRunInWorkflow, }), diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/index.spec.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/index.spec.tsx index 521b3bf1533..1f424db1a38 100644 --- a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/index.spec.tsx +++ b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/index.spec.tsx @@ -100,10 +100,13 @@ vi.mock('@/next/link', () => ({ const mockHandleSyncWorkflowDraft = vi.fn() const mockHandleCheckBeforePublish = vi.fn().mockResolvedValue(true) -vi.mock('@/app/components/workflow/hooks', () => ({ +vi.mock('@/app/components/workflow/hooks/use-nodes-sync-draft', () => ({ useNodesSyncDraft: () => ({ handleSyncWorkflowDraft: mockHandleSyncWorkflowDraft, }), +})) + +vi.mock('@/app/components/workflow/hooks/use-checklist', () => ({ useChecklistBeforePublish: () => ({ handleCheckBeforePublish: mockHandleCheckBeforePublish, }), diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/popup.spec.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/popup.spec.tsx index 946230c46ce..afa24f487aa 100644 --- a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/popup.spec.tsx +++ b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/popup.spec.tsx @@ -173,7 +173,7 @@ vi.mock('@/config', async (importOriginal) => ({ MARKETPLACE_API_PREFIX: '/marketplace/api', })) -vi.mock('@/app/components/workflow/hooks', () => ({ +vi.mock('@/app/components/workflow/hooks/use-checklist', () => ({ useChecklistBeforePublish: () => ({ handleCheckBeforePublish: mockHandleCheckBeforePublish, }), diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/index.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/index.tsx index d6222a20f1e..5757cf6fdbd 100644 --- a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/index.tsx +++ b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/index.tsx @@ -7,8 +7,8 @@ import { RiArrowDownSLine } from '@remixicon/react' import { useBoolean } from 'ahooks' import { memo, useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' -import { useNodesSyncDraft } from '@/app/components/workflow/hooks' import { useHooksStore } from '@/app/components/workflow/hooks-store' +import { useNodesSyncDraft } from '@/app/components/workflow/hooks/use-nodes-sync-draft' import { useStore } from '@/app/components/workflow/store' import { useDocLink } from '@/context/i18n' import Link from '@/next/link' diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/popup.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/popup.tsx index 32039faf5e9..b414e3eb394 100644 --- a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/popup.tsx +++ b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/popup.tsx @@ -23,7 +23,7 @@ import { trackEvent } from '@/app/components/base/amplitude' import Divider from '@/app/components/base/divider' import { SparklesSoft } from '@/app/components/base/icons/src/public/common' import PremiumBadge from '@/app/components/base/premium-badge' -import { useChecklistBeforePublish } from '@/app/components/workflow/hooks' +import { useChecklistBeforePublish } from '@/app/components/workflow/hooks/use-checklist' import { useStore, useWorkflowStore } from '@/app/components/workflow/store' import { userProfileIdAtom } from '@/context/account-state' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-header/run-mode.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-header/run-mode.tsx index 26ec0765d9d..273b7cd8567 100644 --- a/web/app/components/rag-pipeline/components/rag-pipeline-header/run-mode.tsx +++ b/web/app/components/rag-pipeline/components/rag-pipeline-header/run-mode.tsx @@ -5,8 +5,9 @@ import { formatForDisplay, useHotkey } from '@tanstack/react-hotkeys' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' import { StopCircle } from '@/app/components/base/icons/src/vender/line/mediaAndDevices' -import { useWorkflowRun, useWorkflowStartRun } from '@/app/components/workflow/hooks' import { useHooksStore } from '@/app/components/workflow/hooks-store' +import { useWorkflowRun } from '@/app/components/workflow/hooks/use-workflow-run' +import { useWorkflowStartRun } from '@/app/components/workflow/hooks/use-workflow-start-run' import { useStore, useWorkflowStore } from '@/app/components/workflow/store' import { WorkflowRunningStatus } from '@/app/components/workflow/types' import { EVENT_WORKFLOW_STOP } from '@/app/components/workflow/variable-inspect/types' diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-main.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-main.tsx index 6700c4ea744..c6a2b53fd88 100644 --- a/web/app/components/rag-pipeline/components/rag-pipeline-main.tsx +++ b/web/app/components/rag-pipeline/components/rag-pipeline-main.tsx @@ -9,17 +9,15 @@ import { userProfileIdAtom } from '@/context/account-state' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' import { workspacePermissionKeysAtom } from '@/context/permission-state' import { getDatasetACLCapabilities } from '@/utils/permission' -import { - useAvailableNodesMetaData, - useDSLByCanEdit, - useGetRunAndTraceUrl, - useNodesSyncDraftByCanEdit, - usePipelineRefreshDraft, - usePipelineRunByCanEdit, - usePipelineStartRunByCanEdit, -} from '../hooks' +import { useAvailableNodesMetaData } from '../hooks/use-available-nodes-meta-data' import { useConfigsMap } from '../hooks/use-configs-map' +import { useDSLByCanEdit } from '../hooks/use-DSL' +import { useGetRunAndTraceUrl } from '../hooks/use-get-run-and-trace-url' import { useInspectVarsCrud } from '../hooks/use-inspect-vars-crud' +import { useNodesSyncDraftByCanEdit } from '../hooks/use-nodes-sync-draft' +import { usePipelineRefreshDraft } from '../hooks/use-pipeline-refresh-draft' +import { usePipelineRunByCanEdit } from '../hooks/use-pipeline-run' +import { usePipelineStartRunByCanEdit } from '../hooks/use-pipeline-start-run' import RagPipelineChildren from './rag-pipeline-children' type RagPipelineMainProps = Pick diff --git a/web/app/components/rag-pipeline/hooks/__tests__/index.spec.ts b/web/app/components/rag-pipeline/hooks/__tests__/index.spec.ts deleted file mode 100644 index 1828399211c..00000000000 --- a/web/app/components/rag-pipeline/hooks/__tests__/index.spec.ts +++ /dev/null @@ -1,489 +0,0 @@ -import type { RAGPipelineVariables, VAR_TYPE_MAP } from '@/models/pipeline' -import { act } from 'react' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { BlockEnum } from '@/app/components/workflow/types' -import { renderHookWithConsoleQuery as renderHook } from '@/test/console/query-data' -import { Resolution, TransferMethod } from '@/types/app' -import { FlowType } from '@/types/common' -import { - useAvailableNodesMetaData, - useGetRunAndTraceUrl, - useInputFieldPanel, - useNodesSyncDraft, - usePipelineInit, - usePipelineRefreshDraft, -} from '../index' -import { useConfigsMap } from '../use-configs-map' -import { useConfigurations, useInitialData } from '../use-input-fields' -import { usePipelineTemplate } from '../use-pipeline-template' - -const _mockGetState = vi.fn() -const mockUseStore = vi.fn() -const mockUseWorkflowStore = vi.fn() -const toastMocks = vi.hoisted(() => ({ - error: vi.fn(), -})) - -vi.mock('@/app/components/workflow/store', () => ({ - useStore: (selector: (state: Record) => unknown) => mockUseStore(selector), - useWorkflowStore: () => mockUseWorkflowStore(), -})) - -vi.mock('@langgenius/dify-ui/toast', () => ({ - toast: { - error: toastMocks.error, - }, -})) - -const mockEventEmit = vi.fn() -vi.mock('@/context/event-emitter', () => ({ - useEventEmitterContextContext: () => ({ - eventEmitter: { - emit: mockEventEmit, - }, - }), -})) - -vi.mock('@/app/components/workflow/constants', () => ({ - DSL_EXPORT_CHECK: 'DSL_EXPORT_CHECK', - WORKFLOW_DATA_UPDATE: 'WORKFLOW_DATA_UPDATE', - START_INITIAL_POSITION: { x: 100, y: 100 }, -})) - -vi.mock('@/app/components/workflow/constants/node', () => ({ - WORKFLOW_COMMON_NODES: [ - { - metaData: { type: BlockEnum.Start }, - defaultValue: { type: BlockEnum.Start }, - }, - { - metaData: { type: BlockEnum.End }, - defaultValue: { type: BlockEnum.End }, - }, - ], -})) - -vi.mock('@/app/components/workflow/nodes/data-source-empty/default', () => ({ - default: { - metaData: { type: BlockEnum.DataSourceEmpty }, - defaultValue: { type: BlockEnum.DataSourceEmpty }, - }, -})) - -vi.mock('@/app/components/workflow/nodes/data-source/default', () => ({ - default: { - metaData: { type: BlockEnum.DataSource }, - defaultValue: { type: BlockEnum.DataSource }, - }, -})) - -vi.mock('@/app/components/workflow/nodes/knowledge-base/default', () => ({ - default: { - metaData: { type: BlockEnum.KnowledgeBase }, - defaultValue: { type: BlockEnum.KnowledgeBase }, - }, -})) - -vi.mock('@/app/components/workflow/utils', async (importOriginal) => { - const actual = (await importOriginal()) as Record - return { - ...actual, - generateNewNode: ({ - id, - data, - position, - }: { - id: string - data: object - position: { x: number; y: number } - }) => ({ - newNode: { id, data, position, type: 'custom' }, - }), - } -}) - -const mockExportPipelineConfig = vi.fn() -vi.mock('@/service/use-pipeline', () => ({ - useExportPipelineDSL: () => ({ - mutateAsync: mockExportPipelineConfig, - }), -})) - -vi.mock('@/service/workflow', () => ({ - fetchWorkflowDraft: vi.fn().mockResolvedValue({ - graph: { nodes: [], edges: [], viewport: {} }, - environment_variables: [], - }), -})) - -describe('useConfigsMap', () => { - beforeEach(() => { - vi.clearAllMocks() - mockUseStore.mockImplementation((selector: (state: Record) => unknown) => { - const state = { - pipelineId: 'test-pipeline-id', - fileUploadConfig: { max_file_size: 10 }, - } - return selector(state) - }) - }) - - it('should return config map with correct flowId', () => { - const { result } = renderHook(() => useConfigsMap()) - - expect(result.current.flowId).toBe('test-pipeline-id') - }) - - it('should return config map with correct flowType', () => { - const { result } = renderHook(() => useConfigsMap()) - - expect(result.current.flowType).toBe(FlowType.ragPipeline) - }) - - it('should return file settings with image config', () => { - const { result } = renderHook(() => useConfigsMap()) - - expect(result.current.fileSettings.image).toEqual({ - enabled: false, - detail: Resolution.high, - number_limits: 3, - transfer_methods: [TransferMethod.local_file, TransferMethod.remote_url], - }) - }) - - it('should include fileUploadConfig from store', () => { - const { result } = renderHook(() => useConfigsMap()) - - expect(result.current.fileSettings.fileUploadConfig).toEqual({ max_file_size: 10 }) - }) -}) - -describe('useGetRunAndTraceUrl', () => { - beforeEach(() => { - vi.clearAllMocks() - mockUseWorkflowStore.mockReturnValue({ - getState: () => ({ - pipelineId: 'pipeline-123', - }), - }) - }) - - it('should return getWorkflowRunAndTraceUrl function', () => { - const { result } = renderHook(() => useGetRunAndTraceUrl()) - - expect(result.current.getWorkflowRunAndTraceUrl).toBeDefined() - expect(typeof result.current.getWorkflowRunAndTraceUrl).toBe('function') - }) - - it('should generate correct run URL', () => { - const { result } = renderHook(() => useGetRunAndTraceUrl()) - - const { runUrl } = result.current.getWorkflowRunAndTraceUrl('run-456') - - expect(runUrl).toBe('/rag/pipelines/pipeline-123/workflow-runs/run-456') - }) - - it('should generate correct trace URL', () => { - const { result } = renderHook(() => useGetRunAndTraceUrl()) - - const { traceUrl } = result.current.getWorkflowRunAndTraceUrl('run-456') - - expect(traceUrl).toBe('/rag/pipelines/pipeline-123/workflow-runs/run-456/node-executions') - }) -}) - -describe('useInputFieldPanel', () => { - const mockSetShowInputFieldPanel = vi.fn() - const mockSetShowInputFieldPreviewPanel = vi.fn() - const mockSetInputFieldEditPanelProps = vi.fn() - - beforeEach(() => { - vi.clearAllMocks() - mockUseStore.mockImplementation((selector: (state: Record) => unknown) => { - const state = { - showInputFieldPreviewPanel: false, - inputFieldEditPanelProps: null, - } - return selector(state) - }) - mockUseWorkflowStore.mockReturnValue({ - getState: () => ({ - showInputFieldPreviewPanel: false, - setShowInputFieldPanel: mockSetShowInputFieldPanel, - setShowInputFieldPreviewPanel: mockSetShowInputFieldPreviewPanel, - setInputFieldEditPanelProps: mockSetInputFieldEditPanelProps, - }), - }) - }) - - it('should return isPreviewing as false when showInputFieldPreviewPanel is false', () => { - const { result } = renderHook(() => useInputFieldPanel()) - - expect(result.current.isPreviewing).toBe(false) - }) - - it('should return isPreviewing as true when showInputFieldPreviewPanel is true', () => { - mockUseStore.mockImplementation((selector: (state: Record) => unknown) => { - const state = { - showInputFieldPreviewPanel: true, - inputFieldEditPanelProps: null, - } - return selector(state) - }) - - const { result } = renderHook(() => useInputFieldPanel()) - - expect(result.current.isPreviewing).toBe(true) - }) - - it('should return isEditing as false when inputFieldEditPanelProps is null', () => { - const { result } = renderHook(() => useInputFieldPanel()) - - expect(result.current.isEditing).toBe(false) - }) - - it('should return isEditing as true when inputFieldEditPanelProps exists', () => { - mockUseStore.mockImplementation((selector: (state: Record) => unknown) => { - const state = { - showInputFieldPreviewPanel: false, - inputFieldEditPanelProps: { some: 'props' }, - } - return selector(state) - }) - - const { result } = renderHook(() => useInputFieldPanel()) - - expect(result.current.isEditing).toBe(true) - }) - - it('should call all setters when closeAllInputFieldPanels is called', () => { - const { result } = renderHook(() => useInputFieldPanel()) - - act(() => { - result.current.closeAllInputFieldPanels() - }) - - expect(mockSetShowInputFieldPanel).toHaveBeenCalledWith(false) - expect(mockSetShowInputFieldPreviewPanel).toHaveBeenCalledWith(false) - expect(mockSetInputFieldEditPanelProps).toHaveBeenCalledWith(null) - }) - - it('should toggle preview panel when toggleInputFieldPreviewPanel is called', () => { - const { result } = renderHook(() => useInputFieldPanel()) - - act(() => { - result.current.toggleInputFieldPreviewPanel() - }) - - expect(mockSetShowInputFieldPreviewPanel).toHaveBeenCalledWith(true) - }) - - it('should set edit panel props when toggleInputFieldEditPanel is called', () => { - const { result } = renderHook(() => useInputFieldPanel()) - const editContent = { onClose: vi.fn(), onSubmit: vi.fn() } - - act(() => { - result.current.toggleInputFieldEditPanel(editContent) - }) - - expect(mockSetInputFieldEditPanelProps).toHaveBeenCalledWith(editContent) - }) -}) - -describe('useInitialData', () => { - it('should return empty object for empty variables', () => { - const { result } = renderHook(() => useInitialData([], undefined)) - - expect(result.current).toEqual({}) - }) - - it('should handle text input type with default value', () => { - const variables: RAGPipelineVariables = [ - { - type: 'text-input' as keyof typeof VAR_TYPE_MAP, - variable: 'textVar', - label: 'Text', - required: false, - default_value: 'default text', - belong_to_node_id: 'node-1', - }, - ] - - const { result } = renderHook(() => useInitialData(variables, undefined)) - - expect(result.current.textVar).toBe('default text') - }) - - it('should use lastRunInputData over default value', () => { - const variables: RAGPipelineVariables = [ - { - type: 'text-input' as keyof typeof VAR_TYPE_MAP, - variable: 'textVar', - label: 'Text', - required: false, - default_value: 'default text', - belong_to_node_id: 'node-1', - }, - ] - - const { result } = renderHook(() => useInitialData(variables, { textVar: 'last run value' })) - - expect(result.current.textVar).toBe('last run value') - }) - - it('should handle number input type with default 0', () => { - const variables: RAGPipelineVariables = [ - { - type: 'number' as keyof typeof VAR_TYPE_MAP, - variable: 'numVar', - label: 'Number', - required: false, - belong_to_node_id: 'node-1', - }, - ] - - const { result } = renderHook(() => useInitialData(variables, undefined)) - - expect(result.current.numVar).toBe(0) - }) - - it('should handle file type with default empty array', () => { - const variables: RAGPipelineVariables = [ - { - type: 'file' as keyof typeof VAR_TYPE_MAP, - variable: 'fileVar', - label: 'File', - required: false, - belong_to_node_id: 'node-1', - }, - ] - - const { result } = renderHook(() => useInitialData(variables, undefined)) - - expect(result.current.fileVar).toEqual([]) - }) -}) - -describe('useConfigurations', () => { - it('should return empty array for empty variables', () => { - const { result } = renderHook(() => useConfigurations([])) - - expect(result.current).toEqual([]) - }) - - it('should transform variables to configurations', () => { - const variables: RAGPipelineVariables = [ - { - type: 'text-input' as keyof typeof VAR_TYPE_MAP, - variable: 'textVar', - label: 'Text Label', - required: true, - max_length: 100, - placeholder: 'Enter text', - tooltips: 'Help text', - belong_to_node_id: 'node-1', - }, - ] - - const { result } = renderHook(() => useConfigurations(variables)) - - expect(result.current.length).toBe(1) - expect(result.current[0]!.variable).toBe('textVar') - expect(result.current[0]!.label).toBe('Text Label') - expect(result.current[0]!.required).toBe(true) - expect(result.current[0]!.maxLength).toBe(100) - expect(result.current[0]!.placeholder).toBe('Enter text') - expect(result.current[0]!.tooltip).toBe('Help text') - }) - - it('should transform options correctly', () => { - const variables: RAGPipelineVariables = [ - { - type: 'select' as keyof typeof VAR_TYPE_MAP, - variable: 'selectVar', - label: 'Select', - required: false, - options: ['option1', 'option2', 'option3'], - belong_to_node_id: 'node-1', - }, - ] - - const { result } = renderHook(() => useConfigurations(variables)) - - expect(result.current[0]!.options).toEqual([ - { label: 'option1', value: 'option1' }, - { label: 'option2', value: 'option2' }, - { label: 'option3', value: 'option3' }, - ]) - }) -}) - -describe('useAvailableNodesMetaData', () => { - beforeEach(() => { - vi.clearAllMocks() - }) - - it('should return nodes array', () => { - const { result } = renderHook(() => useAvailableNodesMetaData()) - - expect(result.current.nodes).toBeDefined() - expect(Array.isArray(result.current.nodes)).toBe(true) - }) - - it('should return nodesMap object', () => { - const { result } = renderHook(() => useAvailableNodesMetaData()) - - expect(result.current.nodesMap).toBeDefined() - expect(typeof result.current.nodesMap).toBe('object') - }) -}) - -describe('usePipelineTemplate', () => { - beforeEach(() => { - vi.clearAllMocks() - }) - - it('should return nodes array with knowledge base node', () => { - const { result } = renderHook(() => usePipelineTemplate()) - - expect(result.current.nodes).toBeDefined() - expect(Array.isArray(result.current.nodes)).toBe(true) - expect(result.current.nodes.length).toBe(1) - }) - - it('should return empty edges array', () => { - const { result } = renderHook(() => usePipelineTemplate()) - - expect(result.current.edges).toEqual([]) - }) -}) - -describe('exports', () => { - it('should export useAvailableNodesMetaData', () => { - expect(useAvailableNodesMetaData).toBeDefined() - }) - - it('should export useGetRunAndTraceUrl', () => { - expect(useGetRunAndTraceUrl).toBeDefined() - }) - - it('should export useInputFieldPanel', () => { - expect(useInputFieldPanel).toBeDefined() - }) - - it('should export useNodesSyncDraft', () => { - expect(useNodesSyncDraft).toBeDefined() - }) - - it('should export usePipelineInit', () => { - expect(usePipelineInit).toBeDefined() - }) - - it('should export usePipelineRefreshDraft', () => { - expect(usePipelineRefreshDraft).toBeDefined() - }) -}) - -afterEach(() => { - vi.clearAllMocks() -}) diff --git a/web/app/components/rag-pipeline/hooks/__tests__/use-inspect-vars-crud.spec.ts b/web/app/components/rag-pipeline/hooks/__tests__/use-inspect-vars-crud.spec.ts index 691d168a751..71322e3f3e9 100644 --- a/web/app/components/rag-pipeline/hooks/__tests__/use-inspect-vars-crud.spec.ts +++ b/web/app/components/rag-pipeline/hooks/__tests__/use-inspect-vars-crud.spec.ts @@ -21,7 +21,7 @@ const mockApis = { } const mockUseInspectVarsCrudCommon = vi.fn(() => mockApis) -vi.mock('../../../workflow/hooks/use-inspect-vars-crud-common', () => ({ +vi.mock('@/app/components/workflow/hooks/use-inspect-vars-crud-common', () => ({ useInspectVarsCrudCommon: (...args: Parameters) => mockUseInspectVarsCrudCommon(...args), })) diff --git a/web/app/components/rag-pipeline/hooks/__tests__/use-nodes-sync-draft.spec.ts b/web/app/components/rag-pipeline/hooks/__tests__/use-nodes-sync-draft.spec.ts index f03700c20ee..b92978860c8 100644 --- a/web/app/components/rag-pipeline/hooks/__tests__/use-nodes-sync-draft.spec.ts +++ b/web/app/components/rag-pipeline/hooks/__tests__/use-nodes-sync-draft.spec.ts @@ -42,7 +42,7 @@ vi.mock('@/service/workflow', () => ({ })) const mockHandleRefreshWorkflowDraft = vi.fn() -vi.mock('@/app/components/rag-pipeline/hooks', () => ({ +vi.mock('../use-pipeline-refresh-draft', () => ({ usePipelineRefreshDraft: () => ({ handleRefreshWorkflowDraft: mockHandleRefreshWorkflowDraft, }), diff --git a/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-refresh-draft.spec.ts b/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-refresh-draft.spec.ts index 40978e324a2..e98976f1acc 100644 --- a/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-refresh-draft.spec.ts +++ b/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-refresh-draft.spec.ts @@ -11,7 +11,7 @@ vi.mock('@/app/components/workflow/store', () => ({ })) const mockHandleUpdateWorkflowCanvas = vi.fn() -vi.mock('@/app/components/workflow/hooks', () => ({ +vi.mock('@/app/components/workflow/hooks/use-workflow-update', () => ({ useWorkflowUpdate: () => ({ handleUpdateWorkflowCanvas: mockHandleUpdateWorkflowCanvas, }), diff --git a/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-run.spec.ts b/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-run.spec.ts index cef721bce08..2c7378493bb 100644 --- a/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-run.spec.ts +++ b/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-run.spec.ts @@ -41,7 +41,7 @@ vi.mock('@/app/components/workflow/hooks/use-fetch-workflow-inspect-vars', () => })) const mockHandleUpdateWorkflowCanvas = vi.fn() -vi.mock('@/app/components/workflow/hooks/use-workflow-interactions', () => ({ +vi.mock('@/app/components/workflow/hooks/use-workflow-update', () => ({ useWorkflowUpdate: () => ({ handleUpdateWorkflowCanvas: mockHandleUpdateWorkflowCanvas, }), diff --git a/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-start-run.spec.ts b/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-start-run.spec.ts index f84203a957a..68b7f3abac4 100644 --- a/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-start-run.spec.ts +++ b/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-start-run.spec.ts @@ -14,17 +14,20 @@ vi.mock('@/app/components/workflow/store', () => ({ })) const mockHandleCancelDebugAndPreviewPanel = vi.fn() -vi.mock('@/app/components/workflow/hooks', () => ({ +vi.mock('@/app/components/workflow/hooks/use-workflow-panel-interactions', () => ({ useWorkflowInteractions: () => ({ handleCancelDebugAndPreviewPanel: mockHandleCancelDebugAndPreviewPanel, }), })) const mockDoSyncWorkflowDraft = vi.fn() -vi.mock('@/app/components/rag-pipeline/hooks', () => ({ +vi.mock('../use-nodes-sync-draft', () => ({ useNodesSyncDraftByCanEdit: () => ({ doSyncWorkflowDraft: mockDoSyncWorkflowDraft, }), +})) + +vi.mock('../use-input-field-panel', () => ({ useInputFieldPanel: () => ({ closeAllInputFieldPanels: vi.fn(), }), diff --git a/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline.spec.ts b/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline.spec.ts index 514576382c9..6fe02495f03 100644 --- a/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline.spec.ts +++ b/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline.spec.ts @@ -26,12 +26,12 @@ vi.mock('reactflow', () => ({ const mockFindUsedVarNodes = vi.fn() const mockUpdateNodeVars = vi.fn() -vi.mock('../../../workflow/nodes/_base/components/variable/utils', () => ({ +vi.mock('@/app/components/workflow/nodes/_base/components/variable/utils', () => ({ findUsedVarNodes: (...args: unknown[]) => mockFindUsedVarNodes(...args), updateNodeVars: (...args: unknown[]) => mockUpdateNodeVars(...args), })) -vi.mock('../../../workflow/types', () => ({ +vi.mock('@/app/components/workflow/types', () => ({ BlockEnum: { DataSource: 'data-source', }, diff --git a/web/app/components/rag-pipeline/hooks/index.ts b/web/app/components/rag-pipeline/hooks/index.ts deleted file mode 100644 index c7ad7f6f92a..00000000000 --- a/web/app/components/rag-pipeline/hooks/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * from './use-available-nodes-meta-data' -export * from './use-DSL' -export * from './use-get-run-and-trace-url' -export * from './use-input-field-panel' -export * from './use-nodes-sync-draft' -export * from './use-pipeline-init' -export * from './use-pipeline-refresh-draft' -export * from './use-pipeline-run' -export * from './use-pipeline-start-run' diff --git a/web/app/components/rag-pipeline/hooks/use-inspect-vars-crud.ts b/web/app/components/rag-pipeline/hooks/use-inspect-vars-crud.ts index 48c65e6b301..d35d84fa86e 100644 --- a/web/app/components/rag-pipeline/hooks/use-inspect-vars-crud.ts +++ b/web/app/components/rag-pipeline/hooks/use-inspect-vars-crud.ts @@ -1,4 +1,4 @@ -import { useInspectVarsCrudCommon } from '../../workflow/hooks/use-inspect-vars-crud-common' +import { useInspectVarsCrudCommon } from '@/app/components/workflow/hooks/use-inspect-vars-crud-common' import { useConfigsMap } from './use-configs-map' export const useInspectVarsCrud = () => { diff --git a/web/app/components/rag-pipeline/hooks/use-nodes-sync-draft.ts b/web/app/components/rag-pipeline/hooks/use-nodes-sync-draft.ts index cf4ff6a8817..0c52fe4abc3 100644 --- a/web/app/components/rag-pipeline/hooks/use-nodes-sync-draft.ts +++ b/web/app/components/rag-pipeline/hooks/use-nodes-sync-draft.ts @@ -11,7 +11,7 @@ import { useWorkflowStore } from '@/app/components/workflow/store' import { API_PREFIX } from '@/config' import { postWithKeepalive } from '@/service/fetch' import { syncWorkflowDraft } from '@/service/workflow' -import { usePipelineRefreshDraft } from '.' +import { usePipelineRefreshDraft } from './use-pipeline-refresh-draft' const useNodesSyncDraftBase = (getNodesReadOnly: () => boolean) => { const store = useStoreApi() diff --git a/web/app/components/rag-pipeline/hooks/use-pipeline-refresh-draft.ts b/web/app/components/rag-pipeline/hooks/use-pipeline-refresh-draft.ts index e02a21d7a22..3e7c5bcbd32 100644 --- a/web/app/components/rag-pipeline/hooks/use-pipeline-refresh-draft.ts +++ b/web/app/components/rag-pipeline/hooks/use-pipeline-refresh-draft.ts @@ -1,6 +1,6 @@ import type { WorkflowDataUpdater } from '@/app/components/workflow/types' import { useCallback } from 'react' -import { useWorkflowUpdate } from '@/app/components/workflow/hooks' +import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-update' import { useWorkflowStore } from '@/app/components/workflow/store' import { fetchWorkflowDraft } from '@/service/workflow' import { processNodesWithoutDataSource } from '../utils' diff --git a/web/app/components/rag-pipeline/hooks/use-pipeline-run.ts b/web/app/components/rag-pipeline/hooks/use-pipeline-run.ts index 7652d62209e..e26a24f2a92 100644 --- a/web/app/components/rag-pipeline/hooks/use-pipeline-run.ts +++ b/web/app/components/rag-pipeline/hooks/use-pipeline-run.ts @@ -5,8 +5,8 @@ import { produce } from 'immer' import { useCallback, useRef } from 'react' import { useReactFlow, useStoreApi } from 'reactflow' import { useSetWorkflowVarsWithValue } from '@/app/components/workflow/hooks/use-fetch-workflow-inspect-vars' -import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-interactions' import { useWorkflowRunEvent } from '@/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event' +import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-update' import { useStore, useWorkflowStore } from '@/app/components/workflow/store' import { WorkflowRunningStatus } from '@/app/components/workflow/types' import { ssePost } from '@/service/base' diff --git a/web/app/components/rag-pipeline/hooks/use-pipeline-start-run.tsx b/web/app/components/rag-pipeline/hooks/use-pipeline-start-run.tsx index b7a5de93a6e..79a47adb54b 100644 --- a/web/app/components/rag-pipeline/hooks/use-pipeline-start-run.tsx +++ b/web/app/components/rag-pipeline/hooks/use-pipeline-start-run.tsx @@ -1,9 +1,10 @@ -import type { useNodesSyncDraft } from '.' +import type { useNodesSyncDraft } from './use-nodes-sync-draft' import { useCallback } from 'react' -import { useWorkflowInteractions } from '@/app/components/workflow/hooks' +import { useWorkflowInteractions } from '@/app/components/workflow/hooks/use-workflow-panel-interactions' import { useWorkflowStore } from '@/app/components/workflow/store' import { WorkflowRunningStatus } from '@/app/components/workflow/types' -import { useInputFieldPanel, useNodesSyncDraftByCanEdit } from '.' +import { useInputFieldPanel } from './use-input-field-panel' +import { useNodesSyncDraftByCanEdit } from './use-nodes-sync-draft' type DoSyncWorkflowDraft = ReturnType['doSyncWorkflowDraft'] diff --git a/web/app/components/rag-pipeline/hooks/use-pipeline.tsx b/web/app/components/rag-pipeline/hooks/use-pipeline.tsx index 42c610c4238..a4e54d1752c 100644 --- a/web/app/components/rag-pipeline/hooks/use-pipeline.tsx +++ b/web/app/components/rag-pipeline/hooks/use-pipeline.tsx @@ -1,13 +1,13 @@ -import type { DataSourceNodeType } from '../../workflow/nodes/data-source/types' -import type { Node, ValueSelector } from '../../workflow/types' +import type { DataSourceNodeType } from '@/app/components/workflow/nodes/data-source/types' +import type { Node, ValueSelector } from '@/app/components/workflow/types' import { uniqBy } from 'es-toolkit/compat' import { useCallback } from 'react' import { getOutgoers, useStoreApi } from 'reactflow' import { findUsedVarNodes, updateNodeVars, -} from '../../workflow/nodes/_base/components/variable/utils' -import { BlockEnum } from '../../workflow/types' +} from '@/app/components/workflow/nodes/_base/components/variable/utils' +import { BlockEnum } from '@/app/components/workflow/types' export const usePipeline = () => { const store = useStoreApi() diff --git a/web/app/components/rag-pipeline/index.tsx b/web/app/components/rag-pipeline/index.tsx index dd50fa25e7c..75c7e9bdfc8 100644 --- a/web/app/components/rag-pipeline/index.tsx +++ b/web/app/components/rag-pipeline/index.tsx @@ -7,7 +7,7 @@ import { initialEdges, initialNodes } from '@/app/components/workflow/utils' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' import Conversion from './components/conversion' import RagPipelineMain from './components/rag-pipeline-main' -import { usePipelineInit } from './hooks' +import { usePipelineInit } from './hooks/use-pipeline-init' import { createRagPipelineSliceSlice } from './store' import { processNodesWithoutDataSource } from './utils' diff --git a/web/app/components/snippets/components/__tests__/snippet-main.spec.tsx b/web/app/components/snippets/components/__tests__/snippet-main.spec.tsx index a488e1b86b0..b9cb9c000cf 100644 --- a/web/app/components/snippets/components/__tests__/snippet-main.spec.tsx +++ b/web/app/components/snippets/components/__tests__/snippet-main.spec.tsx @@ -82,7 +82,7 @@ vi.mock('@/service/use-snippet-workflows', () => ({ }), })) -vi.mock('@/app/components/snippets/hooks/use-configs-map', () => ({ +vi.mock('../../hooks/use-configs-map', () => ({ useConfigsMap: () => ({ flowId: 'snippet-1', flowType: 'snippet', @@ -102,15 +102,15 @@ vi.mock('@/app/components/workflow/hooks/use-checklist', () => ({ }), })) -vi.mock('@/app/components/workflow-app/hooks', () => ({ +vi.mock('@/app/components/workflow-app/hooks/use-available-nodes-meta-data', () => ({ useAvailableNodesMetaData: () => mockUseAvailableNodesMetaData(), })) -vi.mock('@/app/components/snippets/hooks/use-inspect-vars-crud', () => ({ +vi.mock('../../hooks/use-inspect-vars-crud', () => ({ useInspectVarsCrud: () => mockInspectVarsCrud, })) -vi.mock('@/app/components/snippets/hooks/use-nodes-sync-draft', () => ({ +vi.mock('../../hooks/use-nodes-sync-draft', () => ({ useNodesSyncDraft: () => ({ doSyncWorkflowDraft: mockDoSyncWorkflowDraft, syncInputFieldsDraft: mockSyncInputFieldsDraft, @@ -118,13 +118,13 @@ vi.mock('@/app/components/snippets/hooks/use-nodes-sync-draft', () => ({ }), })) -vi.mock('@/app/components/snippets/hooks/use-snippet-refresh-draft', () => ({ +vi.mock('../../hooks/use-snippet-refresh-draft', () => ({ useSnippetRefreshDraft: () => ({ handleRefreshWorkflowDraft: vi.fn(), }), })) -vi.mock('@/app/components/snippets/hooks/use-snippet-run', () => ({ +vi.mock('../../hooks/use-snippet-run', () => ({ useSnippetRun: () => ({ handleBackupDraft: mockHandleBackupDraft, handleLoadBackupDraft: mockHandleLoadBackupDraft, @@ -134,7 +134,7 @@ vi.mock('@/app/components/snippets/hooks/use-snippet-run', () => ({ }), })) -vi.mock('@/app/components/snippets/hooks/use-snippet-start-run', () => ({ +vi.mock('../../hooks/use-snippet-start-run', () => ({ useSnippetStartRun: () => ({ handleStartWorkflowRun: mockHandleStartWorkflowRun, handleWorkflowStartRunInWorkflow: mockHandleWorkflowStartRunInWorkflow, diff --git a/web/app/components/snippets/components/__tests__/snippet-run-panel.spec.tsx b/web/app/components/snippets/components/__tests__/snippet-run-panel.spec.tsx index 36f214d5452..baad1550a05 100644 --- a/web/app/components/snippets/components/__tests__/snippet-run-panel.spec.tsx +++ b/web/app/components/snippets/components/__tests__/snippet-run-panel.spec.tsx @@ -35,10 +35,13 @@ vi.mock('@/app/components/base/chat/chat/check-input-forms-hooks', () => ({ }), })) -vi.mock('@/app/components/workflow/hooks', () => ({ +vi.mock('@/app/components/workflow/hooks/use-workflow-panel-interactions', () => ({ useWorkflowInteractions: () => ({ handleCancelDebugAndPreviewPanel: workflowHookMocks.handleCancelDebugAndPreviewPanel, }), +})) + +vi.mock('@/app/components/workflow/hooks/use-workflow-run', () => ({ useWorkflowRun: () => ({ handleRun: workflowHookMocks.handleRun, }), diff --git a/web/app/components/snippets/components/snippet-header/__tests__/run-mode.spec.tsx b/web/app/components/snippets/components/snippet-header/__tests__/run-mode.spec.tsx index b29f0f6d182..d1c75ce93a2 100644 --- a/web/app/components/snippets/components/snippet-header/__tests__/run-mode.spec.tsx +++ b/web/app/components/snippets/components/snippet-header/__tests__/run-mode.spec.tsx @@ -21,15 +21,18 @@ const runningResult = { outputs_truncated: false, } -vi.mock('@/app/components/workflow/hooks', () => ({ - useWorkflowStartRun: () => ({ - handleWorkflowStartRunInWorkflow: workflowHookMocks.handleWorkflowStartRunInWorkflow, - }), +vi.mock('@/app/components/workflow/hooks/use-workflow-run', () => ({ useWorkflowRun: () => ({ handleStopRun: workflowHookMocks.handleStopRun, }), })) +vi.mock('@/app/components/workflow/hooks/use-workflow-start-run', () => ({ + useWorkflowStartRun: () => ({ + handleWorkflowStartRunInWorkflow: workflowHookMocks.handleWorkflowStartRunInWorkflow, + }), +})) + vi.mock('@/context/event-emitter', () => ({ useEventEmitterContextContext: () => ({ eventEmitter: { diff --git a/web/app/components/snippets/components/snippet-header/run-mode.tsx b/web/app/components/snippets/components/snippet-header/run-mode.tsx index 8da34b4ac4a..bce7af0988c 100644 --- a/web/app/components/snippets/components/snippet-header/run-mode.tsx +++ b/web/app/components/snippets/components/snippet-header/run-mode.tsx @@ -4,7 +4,8 @@ import { cn } from '@langgenius/dify-ui/cn' import * as React from 'react' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' -import { useWorkflowRun, useWorkflowStartRun } from '@/app/components/workflow/hooks' +import { useWorkflowRun } from '@/app/components/workflow/hooks/use-workflow-run' +import { useWorkflowStartRun } from '@/app/components/workflow/hooks/use-workflow-start-run' import { TEST_RUN_MENU_HOTKEY } from '@/app/components/workflow/hotkeys' import { ShortcutKbd } from '@/app/components/workflow/shortcuts/shortcut-kbd' import { useStore } from '@/app/components/workflow/store' diff --git a/web/app/components/snippets/components/snippet-main.tsx b/web/app/components/snippets/components/snippet-main.tsx index ef954aafd7c..84d3a7ee542 100644 --- a/web/app/components/snippets/components/snippet-main.tsx +++ b/web/app/components/snippets/components/snippet-main.tsx @@ -10,7 +10,7 @@ import { useCallback, useEffect, useLayoutEffect, useMemo, useState } from 'reac import { useTranslation } from 'react-i18next' import { useShallow } from 'zustand/react/shallow' import { WorkflowWithInnerContext } from '@/app/components/workflow' -import { useAvailableNodesMetaData } from '@/app/components/workflow-app/hooks' +import { useAvailableNodesMetaData } from '@/app/components/workflow-app/hooks/use-available-nodes-meta-data' import { useSetWorkflowVarsWithValue } from '@/app/components/workflow/hooks/use-fetch-workflow-inspect-vars' import { useStore, useWorkflowStore } from '@/app/components/workflow/store' import { BlockEnum } from '@/app/components/workflow/types' diff --git a/web/app/components/snippets/components/snippet-run-panel.tsx b/web/app/components/snippets/components/snippet-run-panel.tsx index d04f4351a81..718a4e6c28c 100644 --- a/web/app/components/snippets/components/snippet-run-panel.tsx +++ b/web/app/components/snippets/components/snippet-run-panel.tsx @@ -11,7 +11,8 @@ import { useTranslation } from 'react-i18next' import { useCheckInputsForms } from '@/app/components/base/chat/chat/check-input-forms-hooks' import { getProcessedInputs } from '@/app/components/base/chat/chat/utils' import Loading from '@/app/components/base/loading' -import { useWorkflowInteractions, useWorkflowRun } from '@/app/components/workflow/hooks' +import { useWorkflowInteractions } from '@/app/components/workflow/hooks/use-workflow-panel-interactions' +import { useWorkflowRun } from '@/app/components/workflow/hooks/use-workflow-run' import FormItem from '@/app/components/workflow/nodes/_base/components/before-run-form/form-item' import ResultPanel from '@/app/components/workflow/run/result-panel' import ResultText from '@/app/components/workflow/run/result-text' diff --git a/web/app/components/snippets/hooks/__tests__/use-inspect-vars-crud.spec.ts b/web/app/components/snippets/hooks/__tests__/use-inspect-vars-crud.spec.ts index 0110c837ad4..26719bc3a70 100644 --- a/web/app/components/snippets/hooks/__tests__/use-inspect-vars-crud.spec.ts +++ b/web/app/components/snippets/hooks/__tests__/use-inspect-vars-crud.spec.ts @@ -20,7 +20,7 @@ const mockApis = { } const mockUseInspectVarsCrudCommon = vi.fn(() => mockApis) -vi.mock('../../../workflow/hooks/use-inspect-vars-crud-common', () => ({ +vi.mock('@/app/components/workflow/hooks/use-inspect-vars-crud-common', () => ({ useInspectVarsCrudCommon: (...args: Parameters) => mockUseInspectVarsCrudCommon(...args), })) diff --git a/web/app/components/snippets/hooks/__tests__/use-snippet-refresh-draft.spec.ts b/web/app/components/snippets/hooks/__tests__/use-snippet-refresh-draft.spec.ts index 580783ed2f2..a7522ec0c37 100644 --- a/web/app/components/snippets/hooks/__tests__/use-snippet-refresh-draft.spec.ts +++ b/web/app/components/snippets/hooks/__tests__/use-snippet-refresh-draft.spec.ts @@ -19,7 +19,7 @@ vi.mock('@/service/use-snippet-workflows', () => ({ fetchSnippetDraftWorkflow: (...args: unknown[]) => mockFetchSnippetDraftWorkflow(...args), })) -vi.mock('@/app/components/workflow/hooks', () => ({ +vi.mock('@/app/components/workflow/hooks/use-workflow-update', () => ({ useWorkflowUpdate: () => ({ handleUpdateWorkflowCanvas: mockHandleUpdateWorkflowCanvas, }), diff --git a/web/app/components/snippets/hooks/__tests__/use-snippet-run.spec.ts b/web/app/components/snippets/hooks/__tests__/use-snippet-run.spec.ts index 1511430ece3..6c0edfe37ae 100644 --- a/web/app/components/snippets/hooks/__tests__/use-snippet-run.spec.ts +++ b/web/app/components/snippets/hooks/__tests__/use-snippet-run.spec.ts @@ -82,7 +82,7 @@ vi.mock('@/app/components/workflow/hooks/use-fetch-workflow-inspect-vars', () => }), })) -vi.mock('@/app/components/workflow/hooks/use-workflow-interactions', () => ({ +vi.mock('@/app/components/workflow/hooks/use-workflow-update', () => ({ useWorkflowUpdate: () => ({ handleUpdateWorkflowCanvas: mocks.mockHandleUpdateWorkflowCanvas, }), diff --git a/web/app/components/snippets/hooks/__tests__/use-snippet-start-run.spec.ts b/web/app/components/snippets/hooks/__tests__/use-snippet-start-run.spec.ts index cc789a7d5c1..03597494ee1 100644 --- a/web/app/components/snippets/hooks/__tests__/use-snippet-start-run.spec.ts +++ b/web/app/components/snippets/hooks/__tests__/use-snippet-start-run.spec.ts @@ -15,7 +15,7 @@ vi.mock('@/app/components/workflow/store', () => ({ })) const mockHandleCancelDebugAndPreviewPanel = vi.fn() -vi.mock('@/app/components/workflow/hooks', () => ({ +vi.mock('@/app/components/workflow/hooks/use-workflow-panel-interactions', () => ({ useWorkflowInteractions: () => ({ handleCancelDebugAndPreviewPanel: mockHandleCancelDebugAndPreviewPanel, }), diff --git a/web/app/components/snippets/hooks/use-inspect-vars-crud.ts b/web/app/components/snippets/hooks/use-inspect-vars-crud.ts index 71ae6df0681..290e4761380 100644 --- a/web/app/components/snippets/hooks/use-inspect-vars-crud.ts +++ b/web/app/components/snippets/hooks/use-inspect-vars-crud.ts @@ -1,4 +1,4 @@ -import { useInspectVarsCrudCommon } from '../../workflow/hooks/use-inspect-vars-crud-common' +import { useInspectVarsCrudCommon } from '@/app/components/workflow/hooks/use-inspect-vars-crud-common' import { useConfigsMap } from './use-configs-map' export const useInspectVarsCrud = (snippetId: string) => { diff --git a/web/app/components/snippets/hooks/use-snippet-refresh-draft.ts b/web/app/components/snippets/hooks/use-snippet-refresh-draft.ts index f2192178358..348fe361d57 100644 --- a/web/app/components/snippets/hooks/use-snippet-refresh-draft.ts +++ b/web/app/components/snippets/hooks/use-snippet-refresh-draft.ts @@ -2,7 +2,7 @@ import type { WorkflowDataUpdater } from '@/app/components/workflow/types' import type { SnippetInputField } from '@/models/snippet' import type { SnippetWorkflow } from '@/types/snippet' import { useCallback } from 'react' -import { useWorkflowUpdate } from '@/app/components/workflow/hooks' +import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-update' import { useWorkflowStore } from '@/app/components/workflow/store' import { fetchSnippetDraftWorkflow } from '@/service/use-snippet-workflows' import { useSnippetDraftStore } from '../draft-store' diff --git a/web/app/components/snippets/hooks/use-snippet-run.ts b/web/app/components/snippets/hooks/use-snippet-run.ts index e999ed80e44..b3fb9c18a47 100644 --- a/web/app/components/snippets/hooks/use-snippet-run.ts +++ b/web/app/components/snippets/hooks/use-snippet-run.ts @@ -5,8 +5,8 @@ import { produce } from 'immer' import { useCallback, useRef } from 'react' import { useReactFlow, useStoreApi } from 'reactflow' import { useSetWorkflowVarsWithValue } from '@/app/components/workflow/hooks/use-fetch-workflow-inspect-vars' -import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-interactions' import { useWorkflowRunEvent } from '@/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event' +import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-update' import { useWorkflowStore } from '@/app/components/workflow/store' import { WorkflowRunningStatus } from '@/app/components/workflow/types' import { ssePost } from '@/service/base' diff --git a/web/app/components/snippets/hooks/use-snippet-start-run.ts b/web/app/components/snippets/hooks/use-snippet-start-run.ts index a9ddf381921..91e3f734ffe 100644 --- a/web/app/components/snippets/hooks/use-snippet-start-run.ts +++ b/web/app/components/snippets/hooks/use-snippet-start-run.ts @@ -1,6 +1,6 @@ import type { SnippetDraftRunPayload } from '@/types/snippet' import { useCallback } from 'react' -import { useWorkflowInteractions } from '@/app/components/workflow/hooks' +import { useWorkflowInteractions } from '@/app/components/workflow/hooks/use-workflow-panel-interactions' import { useWorkflowStore } from '@/app/components/workflow/store' import { WorkflowRunningStatus } from '@/app/components/workflow/types' import { useSnippetDraftStore } from '../draft-store' diff --git a/web/app/components/workflow-app/__tests__/index.spec.tsx b/web/app/components/workflow-app/__tests__/index.spec.tsx index e7b99a0f57f..c0ffd014d50 100644 --- a/web/app/components/workflow-app/__tests__/index.spec.tsx +++ b/web/app/components/workflow-app/__tests__/index.spec.tsx @@ -127,11 +127,11 @@ vi.mock('@/service/use-tools', () => ({ useAppTriggers: () => appTriggersState, })) -vi.mock('@/app/components/workflow-app/hooks/use-workflow-init', () => ({ +vi.mock('../hooks/use-workflow-init', () => ({ useWorkflowInit: () => workflowInitState, })) -vi.mock('@/app/components/workflow-app/hooks/use-get-run-and-trace-url', () => ({ +vi.mock('../hooks/use-get-run-and-trace-url', () => ({ useGetRunAndTraceUrl: () => ({ getWorkflowRunAndTraceUrl: mockGetWorkflowRunAndTraceUrl, }), diff --git a/web/app/components/workflow-app/components/__tests__/workflow-children.spec.tsx b/web/app/components/workflow-app/components/__tests__/workflow-children.spec.tsx index 7b0a350ca1a..ec01ea95da5 100644 --- a/web/app/components/workflow-app/components/__tests__/workflow-children.spec.tsx +++ b/web/app/components/workflow-app/components/__tests__/workflow-children.spec.tsx @@ -86,23 +86,37 @@ vi.mock('@/context/event-emitter', () => ({ }), })) -vi.mock('@/app/components/workflow/hooks', () => ({ +vi.mock('@/app/components/workflow/hooks/use-DSL', () => ({ useAutoGenerateWebhookUrl: () => mockAutoGenerateWebhookUrl, useDSL: () => ({ exportCheck: mockExportCheck, handleExportDSL: mockHandleExportDSL, }), +})) + +vi.mock('@/app/components/workflow/hooks/use-workflow-panel-interactions', () => ({ usePanelInteractions: () => ({ handlePaneContextmenuCancel: mockHandlePaneContextmenuCancel, }), })) +vi.mock('@/app/components/workflow/hooks/use-panel-interactions', () => ({ + usePanelInteractions: () => ({ + handlePaneContextmenuCancel: mockHandlePaneContextmenuCancel, + handlePaneContextMenu: vi.fn(), + }), +})) + vi.mock('@/app/components/workflow/hooks/use-nodes-sync-draft', () => ({ useNodesSyncDraft: () => ({ handleSyncWorkflowDraft: mockHandleSyncWorkflowDraft, }), })) +vi.mock('@/app/components/workflow/hooks/use-auto-generate-webhook-url', () => ({ + useAutoGenerateWebhookUrl: () => mockAutoGenerateWebhookUrl, +})) + vi.mock('@/app/components/workflow/utils', async (importOriginal) => { const actual = await importOriginal() return { @@ -120,7 +134,7 @@ vi.mock('@/app/components/workflow/utils', async (importOriginal) => { } }) -vi.mock('@/app/components/workflow-app/hooks', () => ({ +vi.mock('../../hooks/use-available-nodes-meta-data', () => ({ useAvailableNodesMetaData: () => ({ nodesMap: { [BlockEnum.Start]: { @@ -145,7 +159,7 @@ vi.mock('@/app/components/workflow-app/hooks', () => ({ }), })) -vi.mock('@/app/components/workflow-app/hooks/use-auto-onboarding', () => ({ +vi.mock('../../hooks/use-auto-onboarding', () => ({ useAutoOnboarding: () => ({ handleOnboardingClose: mockHandleOnboardingClose, }), diff --git a/web/app/components/workflow-app/components/__tests__/workflow-main.spec.tsx b/web/app/components/workflow-app/components/__tests__/workflow-main.spec.tsx index 810dc214b17..72f9db49c6b 100644 --- a/web/app/components/workflow-app/components/__tests__/workflow-main.spec.tsx +++ b/web/app/components/workflow-app/components/__tests__/workflow-main.spec.tsx @@ -141,7 +141,7 @@ vi.mock('@/app/components/workflow/collaboration/hooks/use-collaboration', () => }), })) -vi.mock('@/app/components/workflow/hooks/use-workflow-interactions', () => ({ +vi.mock('@/app/components/workflow/hooks/use-workflow-update', () => ({ useWorkflowUpdate: () => ({ handleUpdateWorkflowCanvas: mockHandleUpdateWorkflowCanvas, }), @@ -274,18 +274,30 @@ vi.mock('@/app/components/workflow', () => ({ }, })) -vi.mock('@/app/components/workflow-app/hooks', () => ({ +vi.mock('../../hooks/use-available-nodes-meta-data', () => ({ useAvailableNodesMetaData: () => ({ nodes: [{ id: 'start' }], nodesMap: { start: { id: 'start' } }, }), +})) + +vi.mock('../../hooks/use-configs-map', () => ({ useConfigsMap: () => ({ flowId: 'app-1', flowType: 'app-flow', fileSettings: { enabled: true } }), +})) + +vi.mock('../../hooks/use-DSL', () => ({ useDSL: () => ({ exportCheck: hookFns.exportCheck, handleExportDSL: hookFns.handleExportDSL }), useDSLByCanEdit: () => ({ exportCheck: hookFns.exportCheck, handleExportDSL: hookFns.handleExportDSL, }), +})) + +vi.mock('../../hooks/use-get-run-and-trace-url', () => ({ useGetRunAndTraceUrl: () => ({ getWorkflowRunAndTraceUrl: hookFns.getWorkflowRunAndTraceUrl }), +})) + +vi.mock('../../hooks/use-inspect-vars-crud', () => ({ useInspectVarsCrud: () => ({ hasNodeInspectVars: hookFns.hasNodeInspectVars, hasSetInspectVar: hookFns.hasSetInspectVar, @@ -302,6 +314,9 @@ vi.mock('@/app/components/workflow-app/hooks', () => ({ resetConversationVar: hookFns.resetConversationVar, invalidateConversationVarValues: hookFns.invalidateConversationVarValues, }), +})) + +vi.mock('../../hooks/use-nodes-sync-draft', () => ({ useNodesSyncDraft: () => ({ doSyncWorkflowDraft: hookFns.doSyncWorkflowDraft, syncWorkflowDraftWhenPageClose: hookFns.syncWorkflowDraftWhenPageClose, @@ -310,12 +325,15 @@ vi.mock('@/app/components/workflow-app/hooks', () => ({ doSyncWorkflowDraft: hookFns.doSyncWorkflowDraft, syncWorkflowDraftWhenPageClose: hookFns.syncWorkflowDraftWhenPageClose, }), - useSetWorkflowVarsWithValue: () => ({ - fetchInspectVars: hookFns.fetchInspectVars, - }), +})) + +vi.mock('../../hooks/use-workflow-refresh-draft', () => ({ useWorkflowRefreshDraft: () => ({ handleRefreshWorkflowDraft: hookFns.handleRefreshWorkflowDraft, }), +})) + +vi.mock('../../hooks/use-workflow-run', () => ({ useWorkflowRun: () => ({ handleBackupDraft: hookFns.handleBackupDraft, handleLoadBackupDraft: hookFns.handleLoadBackupDraft, @@ -330,6 +348,9 @@ vi.mock('@/app/components/workflow-app/hooks', () => ({ handleRun: hookFns.handleRun, handleStopRun: hookFns.handleStopRun, }), +})) + +vi.mock('../../hooks/use-workflow-start-run', () => ({ useWorkflowStartRun: () => ({ handleStartWorkflowRun: hookFns.handleStartWorkflowRun, handleWorkflowStartRunInChatflow: hookFns.handleWorkflowStartRunInChatflow, @@ -350,7 +371,13 @@ vi.mock('@/app/components/workflow-app/hooks', () => ({ }), })) -vi.mock('@/app/components/workflow-app/hooks/use-workflow-draft-graph-for-canvas', () => ({ +vi.mock('@/app/components/workflow/hooks/use-fetch-workflow-inspect-vars', () => ({ + useSetWorkflowVarsWithValue: () => ({ + fetchInspectVars: hookFns.fetchInspectVars, + }), +})) + +vi.mock('../../hooks/use-workflow-draft-graph-for-canvas', () => ({ useWorkflowDraftGraphForCanvas: () => ({ getWorkflowDraftGraphForCanvas: (graph?: { nodes?: unknown[] @@ -366,7 +393,7 @@ vi.mock('@/app/components/workflow-app/hooks/use-workflow-draft-graph-for-canvas }), })) -vi.mock('@/app/components/workflow-app/hooks/use-workflow-draft-graph-for-canvas', () => ({ +vi.mock('../../hooks/use-workflow-draft-graph-for-canvas', () => ({ useWorkflowDraftGraphForCanvas: () => ({ getWorkflowDraftGraphForCanvas: (graph?: { nodes?: unknown[] diff --git a/web/app/components/workflow-app/components/__tests__/workflow-panel.spec.tsx b/web/app/components/workflow-app/components/__tests__/workflow-panel.spec.tsx index cb569cc02db..61d1712e409 100644 --- a/web/app/components/workflow-app/components/__tests__/workflow-panel.spec.tsx +++ b/web/app/components/workflow-app/components/__tests__/workflow-panel.spec.tsx @@ -130,7 +130,7 @@ vi.mock('@/app/components/workflow/panel/global-variable-panel', () => ({ default: () =>
global-variable
, })) -vi.mock('@/app/components/workflow-app/hooks', () => ({ +vi.mock('../../hooks/use-is-chat-mode', () => ({ useIsChatMode: () => mockUseIsChatMode(), })) diff --git a/web/app/components/workflow-app/components/workflow-children.tsx b/web/app/components/workflow-app/components/workflow-children.tsx index 89f09314786..d4558ed1f1f 100644 --- a/web/app/components/workflow-app/components/workflow-children.tsx +++ b/web/app/components/workflow-app/components/workflow-children.tsx @@ -6,21 +6,19 @@ import type { EnvironmentVariable } from '@/app/components/workflow/types' import { memo, useCallback, useState } from 'react' import { useStoreApi } from 'reactflow' import { DSL_EXPORT_CHECK, START_INITIAL_POSITION } from '@/app/components/workflow/constants' -import { - useAutoGenerateWebhookUrl, - useDSL, - usePanelInteractions, -} from '@/app/components/workflow/hooks' import { useHooksStore } from '@/app/components/workflow/hooks-store' +import { useAutoGenerateWebhookUrl } from '@/app/components/workflow/hooks/use-auto-generate-webhook-url' +import { useDSL } from '@/app/components/workflow/hooks/use-DSL' import { useNodesSyncDraft } from '@/app/components/workflow/hooks/use-nodes-sync-draft' +import { usePanelInteractions } from '@/app/components/workflow/hooks/use-panel-interactions' +import PluginDependency from '@/app/components/workflow/plugin-dependency' import { useStore } from '@/app/components/workflow/store' import { BlockEnum } from '@/app/components/workflow/types' import { generateNewNode } from '@/app/components/workflow/utils' import { useEventEmitterContextContext } from '@/context/event-emitter' import dynamic from '@/next/dynamic' -import PluginDependency from '../../workflow/plugin-dependency' -import { useAvailableNodesMetaData } from '../hooks' import { useAutoOnboarding } from '../hooks/use-auto-onboarding' +import { useAvailableNodesMetaData } from '../hooks/use-available-nodes-meta-data' import WorkflowHeader from './workflow-header' import WorkflowPanel from './workflow-panel' diff --git a/web/app/components/workflow-app/components/workflow-header/__tests__/chat-variable-trigger.spec.tsx b/web/app/components/workflow-app/components/workflow-header/__tests__/chat-variable-trigger.spec.tsx index 4d17f459759..343a6d26314 100644 --- a/web/app/components/workflow-app/components/workflow-header/__tests__/chat-variable-trigger.spec.tsx +++ b/web/app/components/workflow-app/components/workflow-header/__tests__/chat-variable-trigger.spec.tsx @@ -4,11 +4,11 @@ import ChatVariableTrigger from '../chat-variable-trigger' const mockUseNodesReadOnly = vi.fn() const mockUseIsChatMode = vi.fn() -vi.mock('@/app/components/workflow/hooks', () => ({ +vi.mock('@/app/components/workflow/hooks/use-workflow', () => ({ useNodesReadOnly: () => mockUseNodesReadOnly(), })) -vi.mock('../../../hooks', () => ({ +vi.mock('../../../hooks/use-is-chat-mode', () => ({ useIsChatMode: () => mockUseIsChatMode(), })) diff --git a/web/app/components/workflow-app/components/workflow-header/__tests__/features-trigger.spec.tsx b/web/app/components/workflow-app/components/workflow-header/__tests__/features-trigger.spec.tsx index 9005f2f50dd..b81b513f48e 100644 --- a/web/app/components/workflow-app/components/workflow-header/__tests__/features-trigger.spec.tsx +++ b/web/app/components/workflow-app/components/workflow-header/__tests__/features-trigger.spec.tsx @@ -75,12 +75,18 @@ const mockWorkflowStore = { setState: mockWorkflowStoreSetState, } -vi.mock('@/app/components/workflow/hooks', () => ({ +vi.mock('@/app/components/workflow/hooks/use-workflow', () => ({ + useNodesReadOnly: () => mockUseNodesReadOnly(), + useIsChatMode: () => mockUseIsChatMode(), +})) + +vi.mock('@/app/components/workflow/hooks/use-checklist', () => ({ useChecklist: (...args: unknown[]) => mockUseChecklist(...args), useChecklistBeforePublish: () => mockUseChecklistBeforePublish(), - useNodesReadOnly: () => mockUseNodesReadOnly(), +})) + +vi.mock('@/app/components/workflow/hooks/use-nodes-sync-draft', () => ({ useNodesSyncDraft: () => mockUseNodesSyncDraft(), - useIsChatMode: () => mockUseIsChatMode(), })) vi.mock('@/app/components/workflow/store', () => ({ diff --git a/web/app/components/workflow-app/components/workflow-header/chat-variable-trigger.tsx b/web/app/components/workflow-app/components/workflow-header/chat-variable-trigger.tsx index 92840d74a2d..e2709e2074e 100644 --- a/web/app/components/workflow-app/components/workflow-header/chat-variable-trigger.tsx +++ b/web/app/components/workflow-app/components/workflow-header/chat-variable-trigger.tsx @@ -1,7 +1,7 @@ import { memo } from 'react' import ChatVariableButton from '@/app/components/workflow/header/chat-variable-button' -import { useNodesReadOnly } from '@/app/components/workflow/hooks' -import { useIsChatMode } from '../../hooks' +import { useNodesReadOnly } from '@/app/components/workflow/hooks/use-workflow' +import { useIsChatMode } from '../../hooks/use-is-chat-mode' const ChatVariableTrigger = () => { const { nodesReadOnly } = useNodesReadOnly() diff --git a/web/app/components/workflow-app/components/workflow-header/features-trigger.tsx b/web/app/components/workflow-app/components/workflow-header/features-trigger.tsx index 43b1828b73b..604d02fcb37 100644 --- a/web/app/components/workflow-app/components/workflow-header/features-trigger.tsx +++ b/web/app/components/workflow-app/components/workflow-header/features-trigger.tsx @@ -13,15 +13,14 @@ import { AppPublisher } from '@/app/components/app/app-publisher' import { useStore as useAppStore } from '@/app/components/app/store' import { useFeatures } from '@/app/components/base/features/hooks' import { Plan } from '@/app/components/billing/type' +// useWorkflowRunValidation, +import { useHooksStore } from '@/app/components/workflow/hooks-store' import { useChecklist, useChecklistBeforePublish, - useIsChatMode, - useNodesReadOnly, - useNodesSyncDraft, - // useWorkflowRunValidation, -} from '@/app/components/workflow/hooks' -import { useHooksStore } from '@/app/components/workflow/hooks-store' +} from '@/app/components/workflow/hooks/use-checklist' +import { useNodesSyncDraft } from '@/app/components/workflow/hooks/use-nodes-sync-draft' +import { useIsChatMode, useNodesReadOnly } from '@/app/components/workflow/hooks/use-workflow' import { isAgentV2NodeData } from '@/app/components/workflow/nodes/agent-v2/types' import { useStore, useWorkflowStore } from '@/app/components/workflow/store' import useNodes from '@/app/components/workflow/store/workflow/use-nodes' diff --git a/web/app/components/workflow-app/components/workflow-header/index.tsx b/web/app/components/workflow-app/components/workflow-header/index.tsx index da2434f1ac2..2fe6b6325cf 100644 --- a/web/app/components/workflow-app/components/workflow-header/index.tsx +++ b/web/app/components/workflow-app/components/workflow-header/index.tsx @@ -4,7 +4,7 @@ import { useShallow } from 'zustand/react/shallow' import { useStore as useAppStore } from '@/app/components/app/store' import Header from '@/app/components/workflow/header' import { useResetWorkflowVersionHistory } from '@/service/use-workflow' -import { useIsChatMode } from '../../hooks' +import { useIsChatMode } from '../../hooks/use-is-chat-mode' import ChatVariableTrigger from './chat-variable-trigger' import FeaturesTrigger from './features-trigger' diff --git a/web/app/components/workflow-app/components/workflow-main.tsx b/web/app/components/workflow-app/components/workflow-main.tsx index 449f4f66e27..c218d14cac8 100644 --- a/web/app/components/workflow-app/components/workflow-main.tsx +++ b/web/app/components/workflow-app/components/workflow-main.tsx @@ -12,28 +12,26 @@ import { useStore as useAppStore } from '@/app/components/app/store' import { useFeaturesStore } from '@/app/components/base/features/hooks' import { FILE_EXTS } from '@/app/components/base/prompt-editor/constants' import { WorkflowWithInnerContext } from '@/app/components/workflow' -import { useWorkflowDraftGraphForCanvas } from '@/app/components/workflow-app/hooks/use-workflow-draft-graph-for-canvas' import { collaborationManager } from '@/app/components/workflow/collaboration/core/collaboration-manager' import { useCollaboration } from '@/app/components/workflow/collaboration/hooks/use-collaboration' -import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-interactions' +import { useSetWorkflowVarsWithValue } from '@/app/components/workflow/hooks/use-fetch-workflow-inspect-vars' +import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-update' import { useStore, useWorkflowStore } from '@/app/components/workflow/store' import { SupportUploadFileTypes } from '@/app/components/workflow/types' import { userProfileIdAtom } from '@/context/account-state' import { workspacePermissionKeysAtom } from '@/context/permission-state' import { fetchWorkflowDraft } from '@/service/workflow' import { getAppACLCapabilities } from '@/utils/permission' -import { - useAvailableNodesMetaData, - useConfigsMap, - useDSLByCanEdit, - useGetRunAndTraceUrl, - useInspectVarsCrud, - useNodesSyncDraftByCanEdit, - useSetWorkflowVarsWithValue, - useWorkflowRefreshDraft, - useWorkflowRunByCanEdit, - useWorkflowStartRunByCanEdit, -} from '../hooks' +import { useAvailableNodesMetaData } from '../hooks/use-available-nodes-meta-data' +import { useConfigsMap } from '../hooks/use-configs-map' +import { useDSLByCanEdit } from '../hooks/use-DSL' +import { useGetRunAndTraceUrl } from '../hooks/use-get-run-and-trace-url' +import { useInspectVarsCrud } from '../hooks/use-inspect-vars-crud' +import { useNodesSyncDraftByCanEdit } from '../hooks/use-nodes-sync-draft' +import { useWorkflowDraftGraphForCanvas } from '../hooks/use-workflow-draft-graph-for-canvas' +import { useWorkflowRefreshDraft } from '../hooks/use-workflow-refresh-draft' +import { useWorkflowRunByCanEdit } from '../hooks/use-workflow-run' +import { useWorkflowStartRunByCanEdit } from '../hooks/use-workflow-start-run' import WorkflowChildren from './workflow-children' type WorkflowMainProps = Pick diff --git a/web/app/components/workflow-app/components/workflow-panel.tsx b/web/app/components/workflow-app/components/workflow-panel.tsx index 4e7abbfef84..2636a24a87b 100644 --- a/web/app/components/workflow-app/components/workflow-panel.tsx +++ b/web/app/components/workflow-app/components/workflow-panel.tsx @@ -6,7 +6,7 @@ import Panel from '@/app/components/workflow/panel' import CommentsPanel from '@/app/components/workflow/panel/comments-panel' import { useStore } from '@/app/components/workflow/store' import dynamic from '@/next/dynamic' -import { useIsChatMode } from '../hooks' +import { useIsChatMode } from '../hooks/use-is-chat-mode' const MessageLogModal = dynamic(() => import('@/app/components/base/message-log-modal'), { ssr: false, diff --git a/web/app/components/workflow-app/hooks/__tests__/use-available-nodes-meta-data.spec.ts b/web/app/components/workflow-app/hooks/__tests__/use-available-nodes-meta-data.spec.ts index e6e0927a6bf..2354776da63 100644 --- a/web/app/components/workflow-app/hooks/__tests__/use-available-nodes-meta-data.spec.ts +++ b/web/app/components/workflow-app/hooks/__tests__/use-available-nodes-meta-data.spec.ts @@ -5,7 +5,7 @@ import { useAvailableNodesMetaData } from '../use-available-nodes-meta-data' const mockUseIsChatMode = vi.fn() const mockIsAgentV2Enabled = vi.hoisted(() => vi.fn(() => true)) -vi.mock('@/app/components/workflow-app/hooks/use-is-chat-mode', () => ({ +vi.mock('../use-is-chat-mode', () => ({ useIsChatMode: () => mockUseIsChatMode(), })) diff --git a/web/app/components/workflow-app/hooks/__tests__/use-nodes-sync-draft.spec.ts b/web/app/components/workflow-app/hooks/__tests__/use-nodes-sync-draft.spec.ts index 90e9c27cc48..27a475f093e 100644 --- a/web/app/components/workflow-app/hooks/__tests__/use-nodes-sync-draft.spec.ts +++ b/web/app/components/workflow-app/hooks/__tests__/use-nodes-sync-draft.spec.ts @@ -93,7 +93,7 @@ vi.mock('@/config', async (importOriginal) => { }) const mockHandleRefreshWorkflowDraft = vi.fn() -vi.mock('@/app/components/workflow-app/hooks', () => ({ +vi.mock('../use-workflow-refresh-draft', () => ({ useWorkflowRefreshDraft: () => ({ handleRefreshWorkflowDraft: mockHandleRefreshWorkflowDraft }), })) diff --git a/web/app/components/workflow-app/hooks/__tests__/use-workflow-refresh-draft.spec.ts b/web/app/components/workflow-app/hooks/__tests__/use-workflow-refresh-draft.spec.ts index f94134b8b4a..db94d06d73c 100644 --- a/web/app/components/workflow-app/hooks/__tests__/use-workflow-refresh-draft.spec.ts +++ b/web/app/components/workflow-app/hooks/__tests__/use-workflow-refresh-draft.spec.ts @@ -40,7 +40,7 @@ vi.mock('@/app/components/app/store', () => ({ useStore: (selector: (state: typeof appStoreState) => T): T => selector(appStoreState), })) -vi.mock('@/app/components/workflow/hooks', () => ({ +vi.mock('@/app/components/workflow/hooks/use-workflow-update', () => ({ useWorkflowUpdate: () => ({ handleUpdateWorkflowCanvas: mockHandleUpdateWorkflowCanvas }), })) diff --git a/web/app/components/workflow-app/hooks/__tests__/use-workflow-run.spec.ts b/web/app/components/workflow-app/hooks/__tests__/use-workflow-run.spec.ts index 230ad3ea63b..74c24c9ac83 100644 --- a/web/app/components/workflow-app/hooks/__tests__/use-workflow-run.spec.ts +++ b/web/app/components/workflow-app/hooks/__tests__/use-workflow-run.spec.ts @@ -154,7 +154,7 @@ vi.mock('@/app/components/base/features/hooks', () => ({ }), })) -vi.mock('@/app/components/workflow/hooks/use-workflow-interactions', () => ({ +vi.mock('@/app/components/workflow/hooks/use-workflow-update', () => ({ useWorkflowUpdate: () => ({ handleUpdateWorkflowCanvas: mocks.mockHandleUpdateWorkflowCanvas, }), diff --git a/web/app/components/workflow-app/hooks/__tests__/use-workflow-start-run.spec.tsx b/web/app/components/workflow-app/hooks/__tests__/use-workflow-start-run.spec.tsx index 6943f8b9aa0..30339007207 100644 --- a/web/app/components/workflow-app/hooks/__tests__/use-workflow-start-run.spec.tsx +++ b/web/app/components/workflow-app/hooks/__tests__/use-workflow-start-run.spec.tsx @@ -37,7 +37,7 @@ vi.mock('@/app/components/base/features/hooks', () => ({ }), })) -vi.mock('@/app/components/workflow/hooks', () => ({ +vi.mock('@/app/components/workflow/hooks/use-workflow-panel-interactions', () => ({ useWorkflowInteractions: () => ({ handleCancelDebugAndPreviewPanel: mockHandleCancelDebugAndPreviewPanel, }), @@ -49,11 +49,17 @@ vi.mock('@/app/components/workflow/store', () => ({ }), })) -vi.mock('@/app/components/workflow-app/hooks', () => ({ +vi.mock('@/app/components/workflow/hooks/use-workflow', () => ({ useIsChatMode: () => mockUseIsChatMode(), +})) + +vi.mock('../use-nodes-sync-draft', () => ({ useNodesSyncDraftByCanEdit: () => ({ doSyncWorkflowDraft: mockDoSyncWorkflowDraft, }), +})) + +vi.mock('../use-workflow-run', () => ({ useWorkflowRunByCanEdit: () => ({ handleRun: mockHandleRun, }), diff --git a/web/app/components/workflow-app/hooks/__tests__/use-workflow-template.spec.ts b/web/app/components/workflow-app/hooks/__tests__/use-workflow-template.spec.ts index 930c8e66971..bb96a226665 100644 --- a/web/app/components/workflow-app/hooks/__tests__/use-workflow-template.spec.ts +++ b/web/app/components/workflow-app/hooks/__tests__/use-workflow-template.spec.ts @@ -10,7 +10,7 @@ let appStoreState: { } } -vi.mock('@/app/components/workflow-app/hooks/use-is-chat-mode', () => ({ +vi.mock('../use-is-chat-mode', () => ({ useIsChatMode: () => mockUseIsChatMode(), })) diff --git a/web/app/components/workflow-app/hooks/index.ts b/web/app/components/workflow-app/hooks/index.ts deleted file mode 100644 index 2a8c8068596..00000000000 --- a/web/app/components/workflow-app/hooks/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -export * from '../../workflow/hooks/use-fetch-workflow-inspect-vars' -export * from './use-available-nodes-meta-data' -export * from './use-configs-map' -export * from './use-DSL' -export * from './use-get-run-and-trace-url' -export * from './use-inspect-vars-crud' -export * from './use-is-chat-mode' -export * from './use-nodes-sync-draft' -export * from './use-workflow-init' -export * from './use-workflow-refresh-draft' -export * from './use-workflow-run' -export * from './use-workflow-start-run' -export * from './use-workflow-template' diff --git a/web/app/components/workflow-app/hooks/use-inspect-vars-crud.ts b/web/app/components/workflow-app/hooks/use-inspect-vars-crud.ts index 48c65e6b301..d35d84fa86e 100644 --- a/web/app/components/workflow-app/hooks/use-inspect-vars-crud.ts +++ b/web/app/components/workflow-app/hooks/use-inspect-vars-crud.ts @@ -1,4 +1,4 @@ -import { useInspectVarsCrudCommon } from '../../workflow/hooks/use-inspect-vars-crud-common' +import { useInspectVarsCrudCommon } from '@/app/components/workflow/hooks/use-inspect-vars-crud-common' import { useConfigsMap } from './use-configs-map' export const useInspectVarsCrud = () => { diff --git a/web/app/components/workflow-app/hooks/use-nodes-sync-draft.ts b/web/app/components/workflow-app/hooks/use-nodes-sync-draft.ts index 6767f77c628..028907cba4a 100644 --- a/web/app/components/workflow-app/hooks/use-nodes-sync-draft.ts +++ b/web/app/components/workflow-app/hooks/use-nodes-sync-draft.ts @@ -25,7 +25,7 @@ import { API_PREFIX } from '@/config' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { postWithKeepalive } from '@/service/fetch' import { syncWorkflowDraft } from '@/service/workflow' -import { useWorkflowRefreshDraft } from '.' +import { useWorkflowRefreshDraft } from './use-workflow-refresh-draft' const useNodesSyncDraftBase = (getNodesReadOnly: () => boolean) => { const store = useStoreApi() diff --git a/web/app/components/workflow-app/hooks/use-workflow-refresh-draft.ts b/web/app/components/workflow-app/hooks/use-workflow-refresh-draft.ts index 834a43eebea..d68d3c4cc37 100644 --- a/web/app/components/workflow-app/hooks/use-workflow-refresh-draft.ts +++ b/web/app/components/workflow-app/hooks/use-workflow-refresh-draft.ts @@ -1,6 +1,6 @@ import { useCallback, useRef } from 'react' import { useStore as useAppStore } from '@/app/components/app/store' -import { useWorkflowUpdate } from '@/app/components/workflow/hooks' +import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-update' import { useWorkflowStore } from '@/app/components/workflow/store' import { fetchWorkflowDraft } from '@/service/workflow' import { useWorkflowDraftGraphForCanvas } from './use-workflow-draft-graph-for-canvas' diff --git a/web/app/components/workflow-app/hooks/use-workflow-run.ts b/web/app/components/workflow-app/hooks/use-workflow-run.ts index ae199e8cd9c..30626962983 100644 --- a/web/app/components/workflow-app/hooks/use-workflow-run.ts +++ b/web/app/components/workflow-app/hooks/use-workflow-run.ts @@ -13,15 +13,15 @@ import { trackEvent } from '@/app/components/base/amplitude' import { AudioPlayerManager } from '@/app/components/base/audio-btn/audio.player.manager' import { useFeaturesStore } from '@/app/components/base/features/hooks' import { TriggerType } from '@/app/components/workflow/header/test-run-menu' -import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-interactions' +import { useSetWorkflowVarsWithValue } from '@/app/components/workflow/hooks/use-fetch-workflow-inspect-vars' import { useWorkflowRunEvent } from '@/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event' +import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-update' import { useWorkflowStore } from '@/app/components/workflow/store' import { usePathname } from '@/next/navigation' import { ssePost } from '@/service/base' import { useInvalidAllLastRun, useInvalidateWorkflowRunHistory } from '@/service/use-workflow' import { stopWorkflowRun } from '@/service/workflow' import { AppModeEnum } from '@/types/app' -import { useSetWorkflowVarsWithValue } from '../../workflow/hooks/use-fetch-workflow-inspect-vars' import { useConfigsMap } from './use-configs-map' import { useNodesSyncDraft, useNodesSyncDraftByCanEdit } from './use-nodes-sync-draft' import { diff --git a/web/app/components/workflow-app/hooks/use-workflow-start-run.tsx b/web/app/components/workflow-app/hooks/use-workflow-start-run.tsx index 0e8440791aa..7f85ef37f5b 100644 --- a/web/app/components/workflow-app/hooks/use-workflow-start-run.tsx +++ b/web/app/components/workflow-app/hooks/use-workflow-start-run.tsx @@ -1,12 +1,15 @@ -import type { useNodesSyncDraft, useWorkflowRun } from '.' +import type { useNodesSyncDraft } from './use-nodes-sync-draft' +import type { useWorkflowRun } from './use-workflow-run' import { useCallback } from 'react' import { useStoreApi } from 'reactflow' import { useFeaturesStore } from '@/app/components/base/features/hooks' import { TriggerType } from '@/app/components/workflow/header/test-run-menu' -import { useWorkflowInteractions } from '@/app/components/workflow/hooks' +import { useIsChatMode } from '@/app/components/workflow/hooks/use-workflow' +import { useWorkflowInteractions } from '@/app/components/workflow/hooks/use-workflow-panel-interactions' import { useWorkflowStore } from '@/app/components/workflow/store' import { BlockEnum, WorkflowRunningStatus } from '@/app/components/workflow/types' -import { useIsChatMode, useNodesSyncDraftByCanEdit, useWorkflowRunByCanEdit } from '.' +import { useNodesSyncDraftByCanEdit } from './use-nodes-sync-draft' +import { useWorkflowRunByCanEdit } from './use-workflow-run' type HandleRun = ReturnType['handleRun'] type DoSyncWorkflowDraft = ReturnType['doSyncWorkflowDraft'] diff --git a/web/app/components/workflow/__tests__/candidate-node-main.spec.tsx b/web/app/components/workflow/__tests__/candidate-node-main.spec.tsx index 3e8aafa489d..09bd67c188e 100644 --- a/web/app/components/workflow/__tests__/candidate-node-main.spec.tsx +++ b/web/app/components/workflow/__tests__/candidate-node-main.spec.tsx @@ -47,11 +47,20 @@ vi.mock('@/app/components/workflow/store', () => ({ useWorkflowStore: () => mockUseWorkflowStore(), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesInteractions: () => mockUseHooks().useNodesInteractions(), - useNodesSyncDraft: () => mockUseHooks().useNodesSyncDraft(), - useWorkflowHistory: () => mockUseHooks().useWorkflowHistory(), +vi.mock('../hooks/use-auto-generate-webhook-url', () => ({ useAutoGenerateWebhookUrl: () => mockUseHooks().useAutoGenerateWebhookUrl(), +})) + +vi.mock('../hooks/use-nodes-interactions', () => ({ + useNodesInteractions: () => mockUseHooks().useNodesInteractions(), +})) + +vi.mock('../hooks/use-nodes-sync-draft', () => ({ + useNodesSyncDraft: () => mockUseHooks().useNodesSyncDraft(), +})) + +vi.mock('../hooks/use-workflow-history', () => ({ + useWorkflowHistory: () => mockUseHooks().useWorkflowHistory(), WorkflowHistoryEvent: { NodeAdd: 'NodeAdd', NoteAdd: 'NoteAdd', diff --git a/web/app/components/workflow/__tests__/custom-edge.spec.tsx b/web/app/components/workflow/__tests__/custom-edge.spec.tsx index b7459679245..eaff72bfe0c 100644 --- a/web/app/components/workflow/__tests__/custom-edge.spec.tsx +++ b/web/app/components/workflow/__tests__/custom-edge.spec.tsx @@ -41,10 +41,23 @@ vi.mock('reactflow', () => ({ }, })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useAvailableBlocks: (...args: unknown[]) => mockUseAvailableBlocks(...args), - useNodesInteractions: () => mockUseNodesInteractions(), -})) +vi.mock('../hooks/use-available-blocks', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useAvailableBlocks: (...args: unknown[]) => mockUseAvailableBlocks(...args), + } +}) + +vi.mock('../hooks/use-nodes-interactions', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesInteractions: () => mockUseNodesInteractions(), + } +}) vi.mock('@/app/components/workflow/block-selector', () => ({ __esModule: true, diff --git a/web/app/components/workflow/__tests__/edge-contextmenu.spec.tsx b/web/app/components/workflow/__tests__/edge-contextmenu.spec.tsx index dbb8e33ca6b..879f93fce7a 100644 --- a/web/app/components/workflow/__tests__/edge-contextmenu.spec.tsx +++ b/web/app/components/workflow/__tests__/edge-contextmenu.spec.tsx @@ -35,16 +35,6 @@ vi.mock('../utils', async (importOriginal) => { } }) -vi.mock('../hooks', async () => { - const { useEdgesInteractions } = await import('../hooks/use-edges-interactions') - const { usePanelInteractions } = await import('../hooks/use-panel-interactions') - - return { - useEdgesInteractions, - usePanelInteractions, - } -}) - type EdgeRuntimeState = { _hovering?: boolean _isBundled?: boolean diff --git a/web/app/components/workflow/__tests__/features.spec.tsx b/web/app/components/workflow/__tests__/features.spec.tsx index 5dee84b1e28..5d9da98e74c 100644 --- a/web/app/components/workflow/__tests__/features.spec.tsx +++ b/web/app/components/workflow/__tests__/features.spec.tsx @@ -31,8 +31,8 @@ const mockFeaturesStore = { let mockIsChatMode = true let mockNodesReadOnly = false -vi.mock('../hooks', async () => { - const actual = await vi.importActual('../hooks') +vi.mock('../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() return { ...actual, useIsChatMode: () => mockIsChatMode, diff --git a/web/app/components/workflow/__tests__/panel-contextmenu.spec.tsx b/web/app/components/workflow/__tests__/panel-contextmenu.spec.tsx index 478d722104c..1a6fdf7ca4d 100644 --- a/web/app/components/workflow/__tests__/panel-contextmenu.spec.tsx +++ b/web/app/components/workflow/__tests__/panel-contextmenu.spec.tsx @@ -24,17 +24,78 @@ vi.mock('react-i18next', () => ({ useTranslation: () => mockUseTranslation(), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useAvailableBlocks: () => mockUseAvailableBlocks(), - useDSL: () => mockUseDSL(), - useIsChatMode: () => mockUseIsChatMode(), - useNodesInteractions: () => mockUseNodesInteractions(), - useNodesMetaData: () => mockUseNodesMetaData(), - useNodesReadOnly: () => mockUseNodesReadOnly(), - usePanelInteractions: () => mockUsePanelInteractions(), - useWorkflowMoveMode: () => mockUseWorkflowMoveMode(), - useWorkflowStartRun: () => mockUseWorkflowStartRun(), -})) +vi.mock('../hooks/use-DSL', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useDSL: () => mockUseDSL(), + } +}) + +vi.mock('../hooks/use-available-blocks', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useAvailableBlocks: () => mockUseAvailableBlocks(), + } +}) + +vi.mock('../hooks/use-nodes-interactions', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesInteractions: () => mockUseNodesInteractions(), + } +}) + +vi.mock('../hooks/use-nodes-meta-data', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesMetaData: () => mockUseNodesMetaData(), + } +}) + +vi.mock('../hooks/use-panel-interactions', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + usePanelInteractions: () => mockUsePanelInteractions(), + } +}) + +vi.mock('../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useIsChatMode: () => mockUseIsChatMode(), + useNodesReadOnly: () => mockUseNodesReadOnly(), + } +}) + +vi.mock('../hooks/use-workflow-panel-interactions', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflowMoveMode: () => mockUseWorkflowMoveMode(), + } +}) + +vi.mock('../hooks/use-workflow-start-run', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflowStartRun: () => mockUseWorkflowStartRun(), + } +}) vi.mock('@/app/components/workflow/operator/hooks', () => ({ useOperator: () => mockUseOperator(), diff --git a/web/app/components/workflow/__tests__/selection-contextmenu.spec.tsx b/web/app/components/workflow/__tests__/selection-contextmenu.spec.tsx index 39b0dd3a93c..105f9089f1c 100644 --- a/web/app/components/workflow/__tests__/selection-contextmenu.spec.tsx +++ b/web/app/components/workflow/__tests__/selection-contextmenu.spec.tsx @@ -65,13 +65,20 @@ vi.mock('@/app/components/snippets/create-snippet-dialog', () => ({ }, })) -vi.mock('../hooks', async () => { - const actual = await vi.importActual('../hooks') +vi.mock('../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() return { ...actual, useNodesReadOnly: () => ({ getNodesReadOnly: mockGetNodesReadOnly, }), + } +}) + +vi.mock('../hooks/use-nodes-interactions', async (importOriginal) => { + const actual = await importOriginal() + return { + ...actual, useNodesInteractions: () => ({ handleNodesCopy: mockHandleNodesCopy, handleNodesDuplicate: mockHandleNodesDuplicate, diff --git a/web/app/components/workflow/__tests__/workflow-edge-events.spec.tsx b/web/app/components/workflow/__tests__/workflow-edge-events.spec.tsx index 6e188a05b80..ac8e4c9ef29 100644 --- a/web/app/components/workflow/__tests__/workflow-edge-events.spec.tsx +++ b/web/app/components/workflow/__tests__/workflow-edge-events.spec.tsx @@ -374,13 +374,16 @@ vi.mock('../shortcuts/use-workflow-hotkeys', () => ({ useWorkflowHotkeys: workflowHookMocks.useShortcuts, })) -vi.mock('../hooks', () => ({ +vi.mock('../hooks/use-edges-interactions', () => ({ useEdgesInteractions: () => ({ handleEdgeEnter: workflowHookMocks.handleEdgeEnter, handleEdgeLeave: workflowHookMocks.handleEdgeLeave, handleEdgesChange: workflowHookMocks.handleEdgesChange, handleEdgeContextMenu: workflowHookMocks.handleEdgeContextMenu, }), +})) + +vi.mock('../hooks/use-nodes-interactions', () => ({ useNodesInteractions: () => ({ handleNodesCopy: vi.fn(), handleNodesDelete: vi.fn(), @@ -399,43 +402,69 @@ vi.mock('../hooks', () => ({ handleHistoryBack: workflowHookMocks.handleHistoryBack, handleHistoryForward: workflowHookMocks.handleHistoryForward, }), +})) + +vi.mock('../hooks/use-workflow', () => ({ useNodesReadOnly: () => ({ nodesReadOnly: false, getNodesReadOnly: () => false, }), - useNodesSyncDraft: () => ({ - handleSyncWorkflowDraft: workflowHookMocks.handleSyncWorkflowDraft, - syncWorkflowDraftWhenPageClose: vi.fn(), - }), - usePanelInteractions: () => ({ - handlePaneContextMenu: workflowHookMocks.handlePaneContextMenu, - }), - useDSL: () => ({ - exportCheck: vi.fn(), - }), useIsChatMode: () => false, - useSelectionInteractions: () => ({ - handleSelectionStart: workflowHookMocks.handleSelectionStart, - handleSelectionChange: workflowHookMocks.handleSelectionChange, - handleSelectionDrag: workflowHookMocks.handleSelectionDrag, - handleSelectionContextMenu: workflowHookMocks.handleSelectionContextMenu, - }), - useSetWorkflowVarsWithValue: () => ({ - fetchInspectVars: workflowHookMocks.fetchInspectVars, - }), - useShortcuts: workflowHookMocks.useShortcuts, useWorkflow: () => ({ isValidConnection: workflowHookMocks.isValidConnection, }), useWorkflowReadOnly: () => ({ workflowReadOnly: false, }), +})) + +vi.mock('../hooks/use-nodes-sync-draft', () => ({ + useNodesSyncDraft: () => ({ + handleSyncWorkflowDraft: workflowHookMocks.handleSyncWorkflowDraft, + syncWorkflowDraftWhenPageClose: vi.fn(), + }), +})) + +vi.mock('../hooks/use-panel-interactions', () => ({ + usePanelInteractions: () => ({ + handlePaneContextMenu: workflowHookMocks.handlePaneContextMenu, + }), +})) + +vi.mock('../hooks/use-DSL', () => ({ + useDSL: () => ({ + exportCheck: vi.fn(), + }), +})) + +vi.mock('../hooks/use-selection-interactions', () => ({ + useSelectionInteractions: () => ({ + handleSelectionStart: workflowHookMocks.handleSelectionStart, + handleSelectionChange: workflowHookMocks.handleSelectionChange, + handleSelectionDrag: workflowHookMocks.handleSelectionDrag, + handleSelectionContextMenu: workflowHookMocks.handleSelectionContextMenu, + }), +})) + +vi.mock('../hooks/use-set-workflow-vars-with-value', () => ({ + useSetWorkflowVarsWithValue: () => ({ + fetchInspectVars: workflowHookMocks.fetchInspectVars, + }), +})) + +vi.mock('../hooks/use-workflow-panel-interactions', () => ({ useWorkflowMoveMode: () => ({ isCommentModeAvailable: false, }), +})) + +vi.mock('../hooks/use-workflow-refresh-draft', () => ({ useWorkflowRefreshDraft: () => ({ handleRefreshWorkflowDraft: vi.fn(), }), +})) + +vi.mock('../hooks/use-workflow-start-run', () => ({ useWorkflowStartRun: () => ({ handleStartWorkflowRun: vi.fn(), handleWorkflowStartRunInChatflow: vi.fn(), diff --git a/web/app/components/workflow/block-selector/__tests__/all-start-blocks.spec.tsx b/web/app/components/workflow/block-selector/__tests__/all-start-blocks.spec.tsx index f4c769df7b5..ecb901cc0e6 100644 --- a/web/app/components/workflow/block-selector/__tests__/all-start-blocks.spec.tsx +++ b/web/app/components/workflow/block-selector/__tests__/all-start-blocks.spec.tsx @@ -5,13 +5,13 @@ import userEvent from '@testing-library/user-event' import { useMarketplacePlugins } from '@/app/components/plugins/marketplace/query' import { PluginCategoryEnum } from '@/app/components/plugins/types' import { CollectionType } from '@/app/components/tools/types' +import { useAvailableNodesMetaData } from '@/app/components/workflow-app/hooks/use-available-nodes-meta-data' import { useGetLanguage, useLocale } from '@/context/i18n' import useTheme from '@/hooks/use-theme' import { useFeaturedTriggersRecommendations } from '@/service/use-plugins' import { useAllTriggerPlugins, useInvalidateAllTriggerPlugins } from '@/service/use-triggers' import { renderWithConsoleQuery } from '@/test/console/query-data' import { Theme } from '@/types/app' -import { useAvailableNodesMetaData } from '../../../workflow-app/hooks' import useNodes from '../../store/workflow/use-nodes' import { BlockEnum } from '../../types' import AllStartBlocks from '../all-start-blocks' @@ -43,7 +43,7 @@ vi.mock('../../store/workflow/use-nodes', () => ({ default: vi.fn(), })) -vi.mock('../../../workflow-app/hooks', () => ({ +vi.mock('@/app/components/workflow-app/hooks/use-available-nodes-meta-data', () => ({ useAvailableNodesMetaData: vi.fn(), })) diff --git a/web/app/components/workflow/block-selector/__tests__/start-blocks.spec.tsx b/web/app/components/workflow/block-selector/__tests__/start-blocks.spec.tsx index 7ec86860008..bf757ae1a05 100644 --- a/web/app/components/workflow/block-selector/__tests__/start-blocks.spec.tsx +++ b/web/app/components/workflow/block-selector/__tests__/start-blocks.spec.tsx @@ -1,8 +1,8 @@ import type { CommonNodeType } from '../../types' import { render, screen, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' +import { useAvailableNodesMetaData } from '@/app/components/workflow-app/hooks/use-available-nodes-meta-data' import useNodes from '@/app/components/workflow/store/workflow/use-nodes' -import { useAvailableNodesMetaData } from '../../../workflow-app/hooks' import { BlockEnum } from '../../types' import StartBlocks from '../start-blocks' @@ -10,7 +10,7 @@ vi.mock('@/app/components/workflow/store/workflow/use-nodes', () => ({ default: vi.fn(), })) -vi.mock('../../../workflow-app/hooks', () => ({ +vi.mock('@/app/components/workflow-app/hooks/use-available-nodes-meta-data', () => ({ useAvailableNodesMetaData: vi.fn(), })) diff --git a/web/app/components/workflow/block-selector/snippets/__tests__/use-insert-snippet.spec.tsx b/web/app/components/workflow/block-selector/snippets/__tests__/use-insert-snippet.spec.tsx index be5559e79f3..9ec90476499 100644 --- a/web/app/components/workflow/block-selector/snippets/__tests__/use-insert-snippet.spec.tsx +++ b/web/app/components/workflow/block-selector/snippets/__tests__/use-insert-snippet.spec.tsx @@ -59,10 +59,13 @@ vi.mock('reactflow', () => ({ }), })) -vi.mock('../../../hooks', () => ({ +vi.mock('../../../hooks/use-nodes-sync-draft', () => ({ useNodesSyncDraft: () => ({ handleSyncWorkflowDraft: mockHandleSyncWorkflowDraft, }), +})) + +vi.mock('../../../hooks/use-workflow-history', () => ({ useWorkflowHistory: () => ({ saveStateToHistory: mockSaveStateToHistory, }), diff --git a/web/app/components/workflow/block-selector/snippets/use-insert-snippet.ts b/web/app/components/workflow/block-selector/snippets/use-insert-snippet.ts index fc7ed250ab7..0e2e5b5de98 100644 --- a/web/app/components/workflow/block-selector/snippets/use-insert-snippet.ts +++ b/web/app/components/workflow/block-selector/snippets/use-insert-snippet.ts @@ -7,7 +7,8 @@ import { useStoreApi } from 'reactflow' import { consoleQuery } from '@/service/client' import { useIncrementSnippetUseCountMutation } from '@/service/use-snippets' import { CUSTOM_EDGE, NESTED_ELEMENT_Z_INDEX, NODE_WIDTH_X_OFFSET, X_OFFSET } from '../../constants' -import { useNodesSyncDraft, useWorkflowHistory, WorkflowHistoryEvent } from '../../hooks' +import { useNodesSyncDraft } from '../../hooks/use-nodes-sync-draft' +import { useWorkflowHistory, WorkflowHistoryEvent } from '../../hooks/use-workflow-history' import { BlockEnum } from '../../types' import { getNodesConnectedSourceOrTargetHandleIdsMap } from '../../utils' diff --git a/web/app/components/workflow/candidate-node-main.tsx b/web/app/components/workflow/candidate-node-main.tsx index 2d4af22960c..79ac1184cd0 100644 --- a/web/app/components/workflow/candidate-node-main.tsx +++ b/web/app/components/workflow/candidate-node-main.tsx @@ -4,15 +4,12 @@ import { useEventListener } from 'ahooks' import { produce } from 'immer' import { memo } from 'react' import { useReactFlow, useViewport } from 'reactflow' -import { useCollaborativeWorkflow } from '@/app/components/workflow/hooks/use-collaborative-workflow' import { CUSTOM_NODE } from './constants' -import { - useAutoGenerateWebhookUrl, - useNodesInteractions, - useNodesSyncDraft, - useWorkflowHistory, - WorkflowHistoryEvent, -} from './hooks' +import { useAutoGenerateWebhookUrl } from './hooks/use-auto-generate-webhook-url' +import { useCollaborativeWorkflow } from './hooks/use-collaborative-workflow' +import { useNodesInteractions } from './hooks/use-nodes-interactions' +import { useNodesSyncDraft } from './hooks/use-nodes-sync-draft' +import { useWorkflowHistory, WorkflowHistoryEvent } from './hooks/use-workflow-history' import CustomNode from './nodes' import { useCreateInlineAgentBinding } from './nodes/agent-v2/hooks' import { isAgentV2NodeData, needsInlineAgentBindingCreation } from './nodes/agent-v2/types' diff --git a/web/app/components/workflow/custom-edge.tsx b/web/app/components/workflow/custom-edge.tsx index 871b0b4f7c4..f5803064c00 100644 --- a/web/app/components/workflow/custom-edge.tsx +++ b/web/app/components/workflow/custom-edge.tsx @@ -7,7 +7,8 @@ import { ErrorHandleTypeEnum } from '@/app/components/workflow/nodes/_base/compo import BlockSelector from './block-selector' import { NESTED_ELEMENT_Z_INDEX } from './constants' import CustomEdgeLinearGradientRender from './custom-edge-linear-gradient-render' -import { useAvailableBlocks, useNodesInteractions } from './hooks' +import { useAvailableBlocks } from './hooks/use-available-blocks' +import { useNodesInteractions } from './hooks/use-nodes-interactions' import { NodeRunningStatus } from './types' import { getEdgeColor } from './utils' diff --git a/web/app/components/workflow/edge-contextmenu.tsx b/web/app/components/workflow/edge-contextmenu.tsx index ff351020f7c..8c87472a2e9 100644 --- a/web/app/components/workflow/edge-contextmenu.tsx +++ b/web/app/components/workflow/edge-contextmenu.tsx @@ -1,7 +1,7 @@ import { ContextMenuContent, ContextMenuItem } from '@langgenius/dify-ui/context-menu' import { useTranslation } from 'react-i18next' import { useEdges } from 'reactflow' -import { useEdgesInteractions } from './hooks' +import { useEdgesInteractions } from './hooks/use-edges-interactions' import { ShortcutKbd } from './shortcuts/shortcut-kbd' import { useStore } from './store' diff --git a/web/app/components/workflow/features.tsx b/web/app/components/workflow/features.tsx index f466ab1a580..91150b44f88 100644 --- a/web/app/components/workflow/features.tsx +++ b/web/app/components/workflow/features.tsx @@ -8,7 +8,7 @@ import { useFeaturesStore } from '@/app/components/base/features/hooks' import NewFeaturePanel from '@/app/components/base/features/new-feature-panel' import { webSocketClient } from '@/app/components/workflow/collaboration/core/websocket-manager' import { updateFeatures } from '@/service/workflow' -import { useIsChatMode, useNodesReadOnly } from './hooks' +import { useIsChatMode, useNodesReadOnly } from './hooks/use-workflow' import useConfig from './nodes/start/use-config' import { useStore } from './store' import { InputVarType } from './types' diff --git a/web/app/components/workflow/header/__tests__/env-button.spec.tsx b/web/app/components/workflow/header/__tests__/env-button.spec.tsx index 0f579d37a0f..beae77fa277 100644 --- a/web/app/components/workflow/header/__tests__/env-button.spec.tsx +++ b/web/app/components/workflow/header/__tests__/env-button.spec.tsx @@ -11,7 +11,7 @@ vi.mock('@/hooks/use-theme', () => ({ }), })) -vi.mock('@/app/components/rag-pipeline/hooks', () => ({ +vi.mock('@/app/components/rag-pipeline/hooks/use-input-field-panel', () => ({ useInputFieldPanel: () => ({ closeAllInputFieldPanels: mockCloseAllInputFieldPanels, }), diff --git a/web/app/components/workflow/header/__tests__/global-variable-button.spec.tsx b/web/app/components/workflow/header/__tests__/global-variable-button.spec.tsx index 33df5bc4d8b..a5010bd6ce2 100644 --- a/web/app/components/workflow/header/__tests__/global-variable-button.spec.tsx +++ b/web/app/components/workflow/header/__tests__/global-variable-button.spec.tsx @@ -11,7 +11,7 @@ vi.mock('@/hooks/use-theme', () => ({ }), })) -vi.mock('@/app/components/rag-pipeline/hooks', () => ({ +vi.mock('@/app/components/rag-pipeline/hooks/use-input-field-panel', () => ({ useInputFieldPanel: () => ({ closeAllInputFieldPanels: mockCloseAllInputFieldPanels, }), diff --git a/web/app/components/workflow/header/__tests__/header-in-restoring.spec.tsx b/web/app/components/workflow/header/__tests__/header-in-restoring.spec.tsx index a08079b708e..06d5070759b 100644 --- a/web/app/components/workflow/header/__tests__/header-in-restoring.spec.tsx +++ b/web/app/components/workflow/header/__tests__/header-in-restoring.spec.tsx @@ -58,10 +58,13 @@ vi.mock('@/service/use-workflow', () => ({ }), })) -vi.mock('../../hooks', () => ({ +vi.mock('../../hooks/use-workflow-run', () => ({ useWorkflowRun: () => ({ handleLoadBackupDraft: mockHandleLoadBackupDraft, }), +})) + +vi.mock('../../hooks/use-workflow-refresh-draft', () => ({ useWorkflowRefreshDraft: () => ({ handleRefreshWorkflowDraft: mockHandleRefreshWorkflowDraft, }), diff --git a/web/app/components/workflow/header/__tests__/header-layouts.spec.tsx b/web/app/components/workflow/header/__tests__/header-layouts.spec.tsx index cf999af8fcd..1c63792f9bb 100644 --- a/web/app/components/workflow/header/__tests__/header-layouts.spec.tsx +++ b/web/app/components/workflow/header/__tests__/header-layouts.spec.tsx @@ -41,22 +41,34 @@ vi.mock('reactflow', () => ({ useNodes: () => mockUseNodes(), })) -vi.mock('../../hooks', () => ({ +vi.mock('../../hooks/use-workflow', () => ({ useNodesReadOnly: () => ({ nodesReadOnly: mockNodesReadOnly }), +})) + +vi.mock('../../hooks/use-nodes-interactions', () => ({ useNodesInteractions: () => ({ handleNodeSelect: mockHandleNodeSelect }), +})) + +vi.mock('../../hooks/use-workflow-run', () => ({ useWorkflowRun: () => ({ handleBackupDraft: mockHandleBackupDraft, handleLoadBackupDraft: mockHandleLoadBackupDraft, }), +})) + +vi.mock('../../hooks/use-nodes-sync-draft', () => ({ useNodesSyncDraft: () => ({ handleSyncWorkflowDraft: vi.fn(), }), +})) + +vi.mock('../../hooks/use-workflow-refresh-draft', () => ({ useWorkflowRefreshDraft: () => ({ handleRefreshWorkflowDraft: mockHandleRefreshWorkflowDraft, }), })) -vi.mock('@/app/components/rag-pipeline/hooks', () => ({ +vi.mock('@/app/components/rag-pipeline/hooks/use-input-field-panel', () => ({ useInputFieldPanel: () => ({ closeAllInputFieldPanels: mockCloseAllInputFieldPanels, }), diff --git a/web/app/components/workflow/header/__tests__/index.spec.tsx b/web/app/components/workflow/header/__tests__/index.spec.tsx index aeb5fd13478..759a4714f24 100644 --- a/web/app/components/workflow/header/__tests__/index.spec.tsx +++ b/web/app/components/workflow/header/__tests__/index.spec.tsx @@ -27,7 +27,7 @@ function DynamicHeaderRestoring(props: Record) { ) } -vi.mock('../../hooks', () => ({ +vi.mock('../../hooks/use-workflow-mode', () => ({ useWorkflowMode: () => mockWorkflowMode, })) diff --git a/web/app/components/workflow/header/__tests__/run-and-history.spec.tsx b/web/app/components/workflow/header/__tests__/run-and-history.spec.tsx index f75637df96b..eb817564b31 100644 --- a/web/app/components/workflow/header/__tests__/run-and-history.spec.tsx +++ b/web/app/components/workflow/header/__tests__/run-and-history.spec.tsx @@ -8,8 +8,11 @@ const mockState = vi.hoisted(() => ({ const mockRunMode = vi.hoisted(() => vi.fn()) const mockHandleWorkflowStartRunInChatflow = vi.hoisted(() => vi.fn()) -vi.mock('../../hooks', () => ({ +vi.mock('../../hooks/use-workflow', () => ({ useNodesReadOnly: () => ({ nodesReadOnly: mockState.nodesReadOnly }), +})) + +vi.mock('../../hooks/use-workflow-start-run', () => ({ useWorkflowStartRun: () => ({ handleWorkflowStartRunInChatflow: mockHandleWorkflowStartRunInChatflow, }), diff --git a/web/app/components/workflow/header/__tests__/run-mode.spec.tsx b/web/app/components/workflow/header/__tests__/run-mode.spec.tsx index 6544d93f874..2e3c6720656 100644 --- a/web/app/components/workflow/header/__tests__/run-mode.spec.tsx +++ b/web/app/components/workflow/header/__tests__/run-mode.spec.tsx @@ -33,21 +33,42 @@ let mockIsListening = false let mockCanRun = true let mockDynamicOptions = [{ type: TriggerType.UserInput, nodeId: 'start-node' }] -vi.mock('@/app/components/workflow/hooks', () => ({ - useWorkflowStartRun: () => ({ - handleWorkflowStartRunInWorkflow: mockHandleWorkflowStartRunInWorkflow, - handleWorkflowTriggerScheduleRunInWorkflow: mockHandleWorkflowTriggerScheduleRunInWorkflow, - handleWorkflowTriggerWebhookRunInWorkflow: mockHandleWorkflowTriggerWebhookRunInWorkflow, - handleWorkflowTriggerPluginRunInWorkflow: mockHandleWorkflowTriggerPluginRunInWorkflow, - handleWorkflowRunAllTriggersInWorkflow: mockHandleWorkflowRunAllTriggersInWorkflow, - }), - useWorkflowRun: () => ({ - handleStopRun: mockHandleStopRun, - }), - useWorkflowRunValidation: () => ({ - warningNodes: mockWarningNodes, - }), -})) +vi.mock('../../hooks/use-checklist', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflowRunValidation: () => ({ + warningNodes: mockWarningNodes, + }), + } +}) + +vi.mock('../../hooks/use-workflow-run', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflowRun: () => ({ + handleStopRun: mockHandleStopRun, + }), + } +}) + +vi.mock('../../hooks/use-workflow-start-run', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflowStartRun: () => ({ + handleWorkflowStartRunInWorkflow: mockHandleWorkflowStartRunInWorkflow, + handleWorkflowTriggerScheduleRunInWorkflow: mockHandleWorkflowTriggerScheduleRunInWorkflow, + handleWorkflowTriggerWebhookRunInWorkflow: mockHandleWorkflowTriggerWebhookRunInWorkflow, + handleWorkflowTriggerPluginRunInWorkflow: mockHandleWorkflowTriggerPluginRunInWorkflow, + handleWorkflowRunAllTriggersInWorkflow: mockHandleWorkflowRunAllTriggersInWorkflow, + }), + } +}) vi.mock('@/app/components/workflow/store/workflow', () => ({ useStore: ( diff --git a/web/app/components/workflow/header/__tests__/running-title.spec.tsx b/web/app/components/workflow/header/__tests__/running-title.spec.tsx index 7d904ed74a2..bdc62573a2c 100644 --- a/web/app/components/workflow/header/__tests__/running-title.spec.tsx +++ b/web/app/components/workflow/header/__tests__/running-title.spec.tsx @@ -4,7 +4,7 @@ import RunningTitle from '../running-title' let mockIsChatMode = false const mockFormatWorkflowRunIdentifier = vi.fn() -vi.mock('../../hooks', () => ({ +vi.mock('../../hooks/use-workflow', () => ({ useIsChatMode: () => mockIsChatMode, })) diff --git a/web/app/components/workflow/header/__tests__/undo-redo.spec.tsx b/web/app/components/workflow/header/__tests__/undo-redo.spec.tsx index 4f3b6616760..18a4f79b38d 100644 --- a/web/app/components/workflow/header/__tests__/undo-redo.spec.tsx +++ b/web/app/components/workflow/header/__tests__/undo-redo.spec.tsx @@ -15,11 +15,16 @@ vi.mock('@/app/components/workflow/header/view-workflow-history', () => ({ default: () =>
, })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: () => ({ - nodesReadOnly: mockNodesReadOnly, - }), -})) +vi.mock('../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: () => ({ + nodesReadOnly: mockNodesReadOnly, + }), + } +}) vi.mock('@/app/components/workflow/workflow-history-store', () => ({ useWorkflowHistoryStore: () => ({ diff --git a/web/app/components/workflow/header/__tests__/view-history.spec.tsx b/web/app/components/workflow/header/__tests__/view-history.spec.tsx index 1d8dec6beeb..e2b4553fef3 100644 --- a/web/app/components/workflow/header/__tests__/view-history.spec.tsx +++ b/web/app/components/workflow/header/__tests__/view-history.spec.tsx @@ -17,20 +17,27 @@ const mockFormatWorkflowRunIdentifier = vi.fn( let mockIsChatMode = false -vi.mock('../../hooks', () => { - return { - useIsChatMode: () => mockIsChatMode, - useNodesInteractions: () => ({ - handleNodesCancelSelected: mockHandleNodesCancelSelected, - }), - useWorkflowInteractions: () => ({ - handleCancelDebugAndPreviewPanel: mockHandleCancelDebugAndPreviewPanel, - }), - useWorkflowRun: () => ({ - handleBackupDraft: mockHandleBackupDraft, - }), - } -}) +vi.mock('../../hooks/use-workflow', () => ({ + useIsChatMode: () => mockIsChatMode, +})) + +vi.mock('../../hooks/use-nodes-interactions', () => ({ + useNodesInteractions: () => ({ + handleNodesCancelSelected: mockHandleNodesCancelSelected, + }), +})) + +vi.mock('../../hooks/use-workflow-panel-interactions', () => ({ + useWorkflowInteractions: () => ({ + handleCancelDebugAndPreviewPanel: mockHandleCancelDebugAndPreviewPanel, + }), +})) + +vi.mock('../../hooks/use-workflow-run', () => ({ + useWorkflowRun: () => ({ + handleBackupDraft: mockHandleBackupDraft, + }), +})) vi.mock('@/service/use-workflow', () => ({ useWorkflowRunHistory: (url?: string, enabled?: boolean) => @@ -43,7 +50,7 @@ vi.mock('@/hooks/use-format-time-from-now', () => ({ }), })) -vi.mock('@/app/components/rag-pipeline/hooks', () => ({ +vi.mock('@/app/components/rag-pipeline/hooks/use-input-field-panel', () => ({ useInputFieldPanel: () => ({ closeAllInputFieldPanels: mockCloseAllInputFieldPanels, }), diff --git a/web/app/components/workflow/header/checklist/__tests__/index.spec.tsx b/web/app/components/workflow/header/checklist/__tests__/index.spec.tsx index fcafc724c11..9255d13bd3b 100644 --- a/web/app/components/workflow/header/checklist/__tests__/index.spec.tsx +++ b/web/app/components/workflow/header/checklist/__tests__/index.spec.tsx @@ -40,8 +40,11 @@ vi.mock('@/app/components/workflow/store/workflow/use-nodes', () => ({ default: () => [], })) -vi.mock('../../../hooks', () => ({ +vi.mock('../../../hooks/use-checklist', () => ({ useChecklist: () => mockChecklistItems, +})) + +vi.mock('../../../hooks/use-nodes-interactions', () => ({ useNodesInteractions: () => ({ handleNodeSelect: mockHandleNodeSelect, }), diff --git a/web/app/components/workflow/header/checklist/index.tsx b/web/app/components/workflow/header/checklist/index.tsx index bad1fc3162e..da1e1b4ee80 100644 --- a/web/app/components/workflow/header/checklist/index.tsx +++ b/web/app/components/workflow/header/checklist/index.tsx @@ -13,8 +13,9 @@ import { memo, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useEdges } from 'reactflow' import useNodes from '@/app/components/workflow/store/workflow/use-nodes' -import { useChecklist, useNodesInteractions } from '../../hooks' import { useHooksStore } from '../../hooks-store/store' +import { useChecklist } from '../../hooks/use-checklist' +import { useNodesInteractions } from '../../hooks/use-nodes-interactions' import { ChecklistNodeGroup } from './node-group' import { ChecklistPluginGroup } from './plugin-group' diff --git a/web/app/components/workflow/header/env-button.tsx b/web/app/components/workflow/header/env-button.tsx index 9859abfebee..1d52b04fe6e 100644 --- a/web/app/components/workflow/header/env-button.tsx +++ b/web/app/components/workflow/header/env-button.tsx @@ -2,7 +2,7 @@ import { Button } from '@langgenius/dify-ui/button' import { cn } from '@langgenius/dify-ui/cn' import { memo } from 'react' import { Env } from '@/app/components/base/icons/src/vender/line/others' -import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks' +import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks/use-input-field-panel' import { useStore } from '@/app/components/workflow/store' import useTheme from '@/hooks/use-theme' diff --git a/web/app/components/workflow/header/global-variable-button.tsx b/web/app/components/workflow/header/global-variable-button.tsx index 091aca99b97..ec335c7a9f5 100644 --- a/web/app/components/workflow/header/global-variable-button.tsx +++ b/web/app/components/workflow/header/global-variable-button.tsx @@ -2,7 +2,7 @@ import { Button } from '@langgenius/dify-ui/button' import { cn } from '@langgenius/dify-ui/cn' import { memo } from 'react' import { GlobalVariable } from '@/app/components/base/icons/src/vender/line/others' -import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks' +import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks/use-input-field-panel' import { useStore } from '@/app/components/workflow/store' import useTheme from '@/hooks/use-theme' diff --git a/web/app/components/workflow/header/header-in-normal.tsx b/web/app/components/workflow/header/header-in-normal.tsx index 643265d6d4f..132984cc3fa 100644 --- a/web/app/components/workflow/header/header-in-normal.tsx +++ b/web/app/components/workflow/header/header-in-normal.tsx @@ -2,10 +2,12 @@ import type { StartNodeType } from '../nodes/start/types' import type { RunAndHistoryProps } from './run-and-history' import { useCallback } from 'react' import { useNodes } from 'reactflow' -import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks' +import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks/use-input-field-panel' import Divider from '../../base/divider' -import { useNodesInteractions, useNodesReadOnly, useWorkflowRun } from '../hooks' import { useHooksStore } from '../hooks-store' +import { useNodesInteractions } from '../hooks/use-nodes-interactions' +import { useNodesReadOnly } from '../hooks/use-workflow' +import { useWorkflowRun } from '../hooks/use-workflow-run' import { useStore, useWorkflowStore } from '../store' import EditingTitle from './editing-title' import EnvButton from './env-button' diff --git a/web/app/components/workflow/header/header-in-restoring.tsx b/web/app/components/workflow/header/header-in-restoring.tsx index 2c6418fcd01..0d699a19a79 100644 --- a/web/app/components/workflow/header/header-in-restoring.tsx +++ b/web/app/components/workflow/header/header-in-restoring.tsx @@ -16,8 +16,9 @@ import { useRestoreWorkflow, } from '@/service/use-workflow' import { FlowType } from '@/types/common' -import { useWorkflowRefreshDraft, useWorkflowRun } from '../hooks' import { useHooksStore } from '../hooks-store' +import { useWorkflowRefreshDraft } from '../hooks/use-workflow-refresh-draft' +import { useWorkflowRun } from '../hooks/use-workflow-run' import { useStore, useWorkflowStore } from '../store' import { WorkflowVersion } from '../types' import RestoringTitle from './restoring-title' diff --git a/web/app/components/workflow/header/header-in-view-history.tsx b/web/app/components/workflow/header/header-in-view-history.tsx index f89ce3ccd2c..d130e91d2ec 100644 --- a/web/app/components/workflow/header/header-in-view-history.tsx +++ b/web/app/components/workflow/header/header-in-view-history.tsx @@ -4,7 +4,7 @@ import { useCallback } from 'react' import { useTranslation } from 'react-i18next' import { ArrowNarrowLeft } from '@/app/components/base/icons/src/vender/line/arrows' import Divider from '../../base/divider' -import { useWorkflowRun } from '../hooks' +import { useWorkflowRun } from '../hooks/use-workflow-run' import { useWorkflowStore } from '../store' import RunningTitle from './running-title' import ViewHistory from './view-history' diff --git a/web/app/components/workflow/header/index.tsx b/web/app/components/workflow/header/index.tsx index a460821ae71..9e9c08ea3b2 100644 --- a/web/app/components/workflow/header/index.tsx +++ b/web/app/components/workflow/header/index.tsx @@ -2,7 +2,7 @@ import type { HeaderInNormalProps } from './header-in-normal' import type { HeaderInRestoringProps } from './header-in-restoring' import type { HeaderInHistoryProps } from './header-in-view-history' import dynamic from '@/next/dynamic' -import { useWorkflowMode } from '../hooks' +import { useWorkflowMode } from '../hooks/use-workflow-mode' import HeaderInNormal from './header-in-normal' const HeaderInHistory = dynamic(() => import('./header-in-view-history'), { diff --git a/web/app/components/workflow/header/run-and-history.tsx b/web/app/components/workflow/header/run-and-history.tsx index 2c98874e5cd..6f330ef8eca 100644 --- a/web/app/components/workflow/header/run-and-history.tsx +++ b/web/app/components/workflow/header/run-and-history.tsx @@ -2,8 +2,9 @@ import type { ViewHistoryProps } from './view-history' import { cn } from '@langgenius/dify-ui/cn' import { memo } from 'react' import { useTranslation } from 'react-i18next' -import { useNodesReadOnly, useWorkflowStartRun } from '../hooks' import { useHooksStore } from '../hooks-store' +import { useNodesReadOnly } from '../hooks/use-workflow' +import { useWorkflowStartRun } from '../hooks/use-workflow-start-run' import Checklist from './checklist' import RunMode from './run-mode' import ViewHistory from './view-history' diff --git a/web/app/components/workflow/header/run-mode.tsx b/web/app/components/workflow/header/run-mode.tsx index e3433d68ee9..a3b0d964b89 100644 --- a/web/app/components/workflow/header/run-mode.tsx +++ b/web/app/components/workflow/header/run-mode.tsx @@ -7,18 +7,16 @@ import * as React from 'react' import { useCallback, useRef } from 'react' import { useTranslation } from 'react-i18next' import { trackEvent } from '@/app/components/base/amplitude' -import { - useWorkflowRun, - useWorkflowRunValidation, - useWorkflowStartRun, -} from '@/app/components/workflow/hooks' import { useHooksStore } from '@/app/components/workflow/hooks-store' import { ShortcutKbd } from '@/app/components/workflow/shortcuts/shortcut-kbd' import { useStore } from '@/app/components/workflow/store/workflow' import { WorkflowRunningStatus } from '@/app/components/workflow/types' import { EVENT_WORKFLOW_STOP } from '@/app/components/workflow/variable-inspect/types' import { useEventEmitterContextContext } from '@/context/event-emitter' +import { useWorkflowRunValidation } from '../hooks/use-checklist' import { useDynamicTestRunOptions } from '../hooks/use-dynamic-test-run-options' +import { useWorkflowRun } from '../hooks/use-workflow-run' +import { useWorkflowStartRun } from '../hooks/use-workflow-start-run' import { TEST_RUN_MENU_HOTKEY } from '../hotkeys' import TestRunMenu, { TriggerType } from './test-run-menu' diff --git a/web/app/components/workflow/header/running-title.tsx b/web/app/components/workflow/header/running-title.tsx index 63c3279396a..2a663b4f89e 100644 --- a/web/app/components/workflow/header/running-title.tsx +++ b/web/app/components/workflow/header/running-title.tsx @@ -1,7 +1,7 @@ import { memo } from 'react' import { useTranslation } from 'react-i18next' import { ClockPlay } from '@/app/components/base/icons/src/vender/line/time' -import { useIsChatMode } from '../hooks' +import { useIsChatMode } from '../hooks/use-workflow' import { useStore } from '../store' import { formatWorkflowRunIdentifier } from '../utils' diff --git a/web/app/components/workflow/header/undo-redo.tsx b/web/app/components/workflow/header/undo-redo.tsx index 3aeaef9adf6..90be74c86ef 100644 --- a/web/app/components/workflow/header/undo-redo.tsx +++ b/web/app/components/workflow/header/undo-redo.tsx @@ -3,9 +3,9 @@ import { cn } from '@langgenius/dify-ui/cn' import { memo, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import ViewWorkflowHistory from '@/app/components/workflow/header/view-workflow-history' -import { useNodesReadOnly } from '@/app/components/workflow/hooks' import { useWorkflowHistoryStore } from '@/app/components/workflow/workflow-history-store' import Divider from '../../base/divider' +import { useNodesReadOnly } from '../hooks/use-workflow' import TipPopup from '../operator/tip-popup' type UndoRedoProps = { handleUndo: () => void; handleRedo: () => void } diff --git a/web/app/components/workflow/header/view-history.tsx b/web/app/components/workflow/header/view-history.tsx index 3b52c3a5e45..98f1ac8dccb 100644 --- a/web/app/components/workflow/header/view-history.tsx +++ b/web/app/components/workflow/header/view-history.tsx @@ -4,16 +4,14 @@ import { Tooltip, TooltipContent, TooltipTrigger } from '@langgenius/dify-ui/too import { memo, useState } from 'react' import { useTranslation } from 'react-i18next' import Loading from '@/app/components/base/loading' -import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks' +import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks/use-input-field-panel' import { useStore, useWorkflowStore } from '@/app/components/workflow/store' import { useFormatTimeFromNow } from '@/hooks/use-format-time-from-now' import { useWorkflowRunHistory } from '@/service/use-workflow' -import { - useIsChatMode, - useNodesInteractions, - useWorkflowInteractions, - useWorkflowRun, -} from '../hooks' +import { useNodesInteractions } from '../hooks/use-nodes-interactions' +import { useIsChatMode } from '../hooks/use-workflow' +import { useWorkflowInteractions } from '../hooks/use-workflow-panel-interactions' +import { useWorkflowRun } from '../hooks/use-workflow-run' import { ControlMode, WorkflowRunningStatus } from '../types' import { formatWorkflowRunIdentifier } from '../utils' diff --git a/web/app/components/workflow/header/view-workflow-history.tsx b/web/app/components/workflow/header/view-workflow-history.tsx index 285866aa842..fbf27def6fd 100644 --- a/web/app/components/workflow/header/view-workflow-history.tsx +++ b/web/app/components/workflow/header/view-workflow-history.tsx @@ -8,8 +8,9 @@ import { useShallow } from 'zustand/react/shallow' import { useStore as useAppStore } from '@/app/components/app/store' import Divider from '../../base/divider' import { collaborationManager } from '../collaboration/core/collaboration-manager' -import { useNodesReadOnly, useWorkflowHistory } from '../hooks' import { useCollaborativeWorkflow } from '../hooks/use-collaborative-workflow' +import { useNodesReadOnly } from '../hooks/use-workflow' +import { useWorkflowHistory } from '../hooks/use-workflow-history' import TipPopup from '../operator/tip-popup' type ChangeHistoryEntry = { diff --git a/web/app/components/workflow/hooks/__tests__/use-nodes-available-var-list.spec.ts b/web/app/components/workflow/hooks/__tests__/use-nodes-available-var-list.spec.ts index 9201ec39f5e..c2b6d41b2f6 100644 --- a/web/app/components/workflow/hooks/__tests__/use-nodes-available-var-list.spec.ts +++ b/web/app/components/workflow/hooks/__tests__/use-nodes-available-var-list.spec.ts @@ -15,16 +15,29 @@ const mockFlowType = vi.hoisted(() => ({ value: undefined as FlowType | undefined, })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useIsChatMode: () => true, - useWorkflow: () => ({ - getTreeLeafNodes: mockGetTreeLeafNodes, - getBeforeNodesInSameBranchIncludeParent: mockGetBeforeNodesInSameBranchIncludeParent, - }), - useWorkflowVariables: () => ({ - getNodeAvailableVars: mockGetNodeAvailableVars, - }), -})) +vi.mock('../use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useIsChatMode: () => true, + useWorkflow: () => ({ + getTreeLeafNodes: mockGetTreeLeafNodes, + getBeforeNodesInSameBranchIncludeParent: mockGetBeforeNodesInSameBranchIncludeParent, + }), + } +}) + +vi.mock('../use-workflow-variables', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflowVariables: () => ({ + getNodeAvailableVars: mockGetNodeAvailableVars, + }), + } +}) vi.mock('@/app/components/workflow/hooks-store/store', () => ({ useHooksStore: (selector: (state: { configsMap?: { flowType?: FlowType } }) => unknown) => diff --git a/web/app/components/workflow/hooks/index.ts b/web/app/components/workflow/hooks/index.ts deleted file mode 100644 index 8dc5def829e..00000000000 --- a/web/app/components/workflow/hooks/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -export * from './use-auto-generate-webhook-url' -export * from './use-available-blocks' -export * from './use-checklist' -export * from './use-DSL' -export * from './use-edges-interactions' -export * from './use-inspect-vars-crud' -export * from './use-node-data-update' -export * from './use-nodes-interactions' -export * from './use-nodes-meta-data' -export * from './use-nodes-sync-draft' -export * from './use-panel-interactions' -export * from './use-selection-interactions' -export * from './use-serial-async-callback' -export * from './use-set-workflow-vars-with-value' -export * from './use-tool-icon' -export * from './use-workflow' -export * from './use-workflow-comment' -export * from './use-workflow-history' -export * from './use-workflow-interactions' -export * from './use-workflow-mode' -export * from './use-workflow-refresh-draft' -export * from './use-workflow-run' -export * from './use-workflow-search' -export * from './use-workflow-start-run' -export * from './use-workflow-variables' diff --git a/web/app/components/workflow/hooks/use-checklist.ts b/web/app/components/workflow/hooks/use-checklist.ts index c1f4587467e..ea9ebb9d45b 100644 --- a/web/app/components/workflow/hooks/use-checklist.ts +++ b/web/app/components/workflow/hooks/use-checklist.ts @@ -44,7 +44,6 @@ import { AppModeEnum } from '@/types/app' import { FlowType } from '@/types/common' import { CUSTOM_NODE } from '../constants' import { useDatasetsDetailStore } from '../datasets-detail-store/store' -import { useGetToolIcon, useNodesMetaData } from '../hooks' import { useHooksStore } from '../hooks-store/store' import { getNodeUsedVars, isSpecialVar } from '../nodes/_base/components/variable/utils' import { hasValidInlineAgentBinding, isAgentV2NodeData } from '../nodes/agent-v2/types' @@ -68,6 +67,8 @@ import { getTriggerCheckParams } from '../utils/trigger' import useNodesAvailableVarList, { useGetNodesAvailableVarList, } from './use-nodes-available-var-list' +import { useNodesMetaData } from './use-nodes-meta-data' +import { useGetToolIcon } from './use-tool-icon' export type ChecklistItem = { id: string diff --git a/web/app/components/workflow/hooks/use-fetch-workflow-inspect-vars.ts b/web/app/components/workflow/hooks/use-fetch-workflow-inspect-vars.ts index 6a84508e480..e5f30df4438 100644 --- a/web/app/components/workflow/hooks/use-fetch-workflow-inspect-vars.ts +++ b/web/app/components/workflow/hooks/use-fetch-workflow-inspect-vars.ts @@ -4,7 +4,6 @@ import type { FlowType } from '@/types/common' import type { NodeWithVar, VarInInspect } from '@/types/workflow' import { useCallback, useMemo } from 'react' import { useStoreApi } from 'reactflow' -import { useNodesInteractionsWithoutSync } from '@/app/components/workflow/hooks/use-nodes-interactions-without-sync' import { useStore, useWorkflowStore } from '@/app/components/workflow/store' import { useAllBuiltInTools, @@ -19,6 +18,7 @@ import { import { fetchAllInspectVars } from '@/service/workflow' import useMatchSchemaType from '../nodes/_base/components/variable/use-match-schema-type' import { toNodeOutputVars } from '../nodes/_base/components/variable/utils' +import { useNodesInteractionsWithoutSync } from './use-nodes-interactions-without-sync' type Params = { flowType: FlowType diff --git a/web/app/components/workflow/hooks/use-inspect-vars-crud-common.ts b/web/app/components/workflow/hooks/use-inspect-vars-crud-common.ts index b3c8a4ea4a0..d8913d5a5fc 100644 --- a/web/app/components/workflow/hooks/use-inspect-vars-crud-common.ts +++ b/web/app/components/workflow/hooks/use-inspect-vars-crud-common.ts @@ -5,8 +5,6 @@ import type { VarInInspect } from '@/types/workflow' import { produce } from 'immer' import { useCallback } from 'react' import { useStoreApi } from 'reactflow' -import { useEdgesInteractionsWithoutSync } from '@/app/components/workflow/hooks/use-edges-interactions-without-sync' -import { useNodesInteractionsWithoutSync } from '@/app/components/workflow/hooks/use-nodes-interactions-without-sync' import { isConversationVar, isENV, @@ -23,6 +21,8 @@ import { } from '@/service/use-tools' import { fetchNodeInspectVars } from '@/service/workflow' import { VarInInspectType } from '@/types/workflow' +import { useEdgesInteractionsWithoutSync } from './use-edges-interactions-without-sync' +import { useNodesInteractionsWithoutSync } from './use-nodes-interactions-without-sync' type Params = { flowId: string diff --git a/web/app/components/workflow/hooks/use-nodes-available-var-list.ts b/web/app/components/workflow/hooks/use-nodes-available-var-list.ts index 38030ec1109..6ea5e52a315 100644 --- a/web/app/components/workflow/hooks/use-nodes-available-var-list.ts +++ b/web/app/components/workflow/hooks/use-nodes-available-var-list.ts @@ -2,7 +2,6 @@ import type { Node, NodeOutPutVar, ValueSelector, Var } from '@/app/components/w import { useCallback } from 'react' import { useTranslation } from 'react-i18next' import { useSnippetDraftStore } from '@/app/components/snippets/draft-store' -import { useIsChatMode, useWorkflow, useWorkflowVariables } from '@/app/components/workflow/hooks' import { useHooksStore } from '@/app/components/workflow/hooks-store/store' import { appendSnippetInputFieldVars, @@ -11,6 +10,8 @@ import { } from '@/app/components/workflow/nodes/_base/hooks/snippet-input-field-vars' import { BlockEnum } from '@/app/components/workflow/types' import { FlowType } from '@/types/common' +import { useIsChatMode, useWorkflow } from './use-workflow' +import { useWorkflowVariables } from './use-workflow-variables' type Params = { onlyLeafNodeVar?: boolean diff --git a/web/app/components/workflow/hooks/use-workflow-interactions.ts b/web/app/components/workflow/hooks/use-workflow-interactions.ts deleted file mode 100644 index b75771c836a..00000000000 --- a/web/app/components/workflow/hooks/use-workflow-interactions.ts +++ /dev/null @@ -1,4 +0,0 @@ -/* oxlint-disable no-barrel-files/no-barrel-files */ -export { useWorkflowOrganize } from './use-workflow-organize' -export { useWorkflowInteractions, useWorkflowMoveMode } from './use-workflow-panel-interactions' -export { useWorkflowUpdate } from './use-workflow-update' diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/__tests__/use-workflow-run-event.spec.ts b/web/app/components/workflow/hooks/use-workflow-run-event/__tests__/use-workflow-run-event.spec.ts index 62c45551d81..e886445230c 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/__tests__/use-workflow-run-event.spec.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/__tests__/use-workflow-run-event.spec.ts @@ -24,43 +24,79 @@ const handlers = vi.hoisted(() => ({ handleWorkflowNodeHumanInputFormTimeout: vi.fn(), })) -vi.mock('..', () => ({ +vi.mock('../use-workflow-started', () => ({ useWorkflowStarted: () => ({ handleWorkflowStarted: handlers.handleWorkflowStarted }), +})) +vi.mock('../use-workflow-finished', () => ({ useWorkflowFinished: () => ({ handleWorkflowFinished: handlers.handleWorkflowFinished }), +})) +vi.mock('../use-workflow-failed', () => ({ useWorkflowFailed: () => ({ handleWorkflowFailed: handlers.handleWorkflowFailed }), +})) +vi.mock('../use-workflow-node-started', () => ({ useWorkflowNodeStarted: () => ({ handleWorkflowNodeStarted: handlers.handleWorkflowNodeStarted }), +})) +vi.mock('../use-workflow-node-finished', () => ({ useWorkflowNodeFinished: () => ({ handleWorkflowNodeFinished: handlers.handleWorkflowNodeFinished, }), +})) +vi.mock('../use-workflow-node-iteration-started', () => ({ useWorkflowNodeIterationStarted: () => ({ handleWorkflowNodeIterationStarted: handlers.handleWorkflowNodeIterationStarted, }), +})) +vi.mock('../use-workflow-node-iteration-next', () => ({ useWorkflowNodeIterationNext: () => ({ handleWorkflowNodeIterationNext: handlers.handleWorkflowNodeIterationNext, }), +})) +vi.mock('../use-workflow-node-iteration-finished', () => ({ useWorkflowNodeIterationFinished: () => ({ handleWorkflowNodeIterationFinished: handlers.handleWorkflowNodeIterationFinished, }), +})) +vi.mock('../use-workflow-node-loop-started', () => ({ useWorkflowNodeLoopStarted: () => ({ handleWorkflowNodeLoopStarted: handlers.handleWorkflowNodeLoopStarted, }), +})) +vi.mock('../use-workflow-node-loop-next', () => ({ useWorkflowNodeLoopNext: () => ({ handleWorkflowNodeLoopNext: handlers.handleWorkflowNodeLoopNext, }), +})) +vi.mock('../use-workflow-node-loop-finished', () => ({ useWorkflowNodeLoopFinished: () => ({ handleWorkflowNodeLoopFinished: handlers.handleWorkflowNodeLoopFinished, }), +})) +vi.mock('../use-workflow-node-retry', () => ({ useWorkflowNodeRetry: () => ({ handleWorkflowNodeRetry: handlers.handleWorkflowNodeRetry }), +})) +vi.mock('../use-workflow-text-chunk', () => ({ useWorkflowTextChunk: () => ({ handleWorkflowTextChunk: handlers.handleWorkflowTextChunk }), +})) +vi.mock('../use-workflow-text-replace', () => ({ useWorkflowTextReplace: () => ({ handleWorkflowTextReplace: handlers.handleWorkflowTextReplace }), +})) +vi.mock('../use-workflow-agent-log', () => ({ useWorkflowAgentLog: () => ({ handleWorkflowAgentLog: handlers.handleWorkflowAgentLog }), +})) +vi.mock('../use-workflow-paused', () => ({ useWorkflowPaused: () => ({ handleWorkflowPaused: handlers.handleWorkflowPaused }), +})) +vi.mock('../use-workflow-node-human-input-required', () => ({ useWorkflowNodeHumanInputRequired: () => ({ handleWorkflowNodeHumanInputRequired: handlers.handleWorkflowNodeHumanInputRequired, }), +})) +vi.mock('../use-workflow-node-human-input-form-filled', () => ({ useWorkflowNodeHumanInputFormFilled: () => ({ handleWorkflowNodeHumanInputFormFilled: handlers.handleWorkflowNodeHumanInputFormFilled, }), +})) +vi.mock('../use-workflow-node-human-input-form-timeout', () => ({ useWorkflowNodeHumanInputFormTimeout: () => ({ handleWorkflowNodeHumanInputFormTimeout: handlers.handleWorkflowNodeHumanInputFormTimeout, }), diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/index.ts b/web/app/components/workflow/hooks/use-workflow-run-event/index.ts deleted file mode 100644 index 43486873339..00000000000 --- a/web/app/components/workflow/hooks/use-workflow-run-event/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -export * from './use-workflow-agent-log' -export * from './use-workflow-failed' -export * from './use-workflow-finished' -export * from './use-workflow-node-finished' -export * from './use-workflow-node-human-input-form-filled' -export * from './use-workflow-node-human-input-form-timeout' -export * from './use-workflow-node-human-input-required' -export * from './use-workflow-node-iteration-finished' -export * from './use-workflow-node-iteration-next' -export * from './use-workflow-node-iteration-started' -export * from './use-workflow-node-loop-finished' -export * from './use-workflow-node-loop-next' -export * from './use-workflow-node-loop-started' -export * from './use-workflow-node-retry' -export * from './use-workflow-node-started' -export * from './use-workflow-paused' -export * from './use-workflow-started' -export * from './use-workflow-text-chunk' -export * from './use-workflow-text-replace' diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event.ts b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event.ts index 2366fdd9684..ff3f5cb1965 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event.ts @@ -1,25 +1,23 @@ -import { - useWorkflowAgentLog, - useWorkflowFailed, - useWorkflowFinished, - useWorkflowNodeFinished, - useWorkflowNodeHumanInputFormFilled, - useWorkflowNodeHumanInputFormTimeout, - useWorkflowNodeHumanInputRequired, - useWorkflowNodeIterationFinished, - useWorkflowNodeIterationNext, - useWorkflowNodeIterationStarted, - useWorkflowNodeLoopFinished, - useWorkflowNodeLoopNext, - useWorkflowNodeLoopStarted, - useWorkflowNodeRetry, - useWorkflowNodeStarted, - useWorkflowPaused, - useWorkflowStarted, - useWorkflowTextChunk, - useWorkflowTextReplace, -} from '.' +import { useWorkflowAgentLog } from './use-workflow-agent-log' +import { useWorkflowFailed } from './use-workflow-failed' +import { useWorkflowFinished } from './use-workflow-finished' +import { useWorkflowNodeFinished } from './use-workflow-node-finished' +import { useWorkflowNodeHumanInputFormFilled } from './use-workflow-node-human-input-form-filled' +import { useWorkflowNodeHumanInputFormTimeout } from './use-workflow-node-human-input-form-timeout' +import { useWorkflowNodeHumanInputRequired } from './use-workflow-node-human-input-required' +import { useWorkflowNodeIterationFinished } from './use-workflow-node-iteration-finished' +import { useWorkflowNodeIterationNext } from './use-workflow-node-iteration-next' +import { useWorkflowNodeIterationStarted } from './use-workflow-node-iteration-started' +import { useWorkflowNodeLoopFinished } from './use-workflow-node-loop-finished' +import { useWorkflowNodeLoopNext } from './use-workflow-node-loop-next' +import { useWorkflowNodeLoopStarted } from './use-workflow-node-loop-started' +import { useWorkflowNodeRetry } from './use-workflow-node-retry' +import { useWorkflowNodeStarted } from './use-workflow-node-started' +import { useWorkflowPaused } from './use-workflow-paused' import { useWorkflowReasoning } from './use-workflow-reasoning' +import { useWorkflowStarted } from './use-workflow-started' +import { useWorkflowTextChunk } from './use-workflow-text-chunk' +import { useWorkflowTextReplace } from './use-workflow-text-replace' export const useWorkflowRunEvent = () => { const { handleWorkflowStarted } = useWorkflowStarted() diff --git a/web/app/components/workflow/hooks/use-workflow.ts b/web/app/components/workflow/hooks/use-workflow.ts index e957ed467f5..dd4127f8472 100644 --- a/web/app/components/workflow/hooks/use-workflow.ts +++ b/web/app/components/workflow/hooks/use-workflow.ts @@ -6,11 +6,9 @@ import { uniqBy } from 'es-toolkit/compat' import { useCallback } from 'react' import { getIncomers, getOutgoers } from 'reactflow' import { useStore as useAppStore } from '@/app/components/app/store' -import { useCollaborativeWorkflow } from '@/app/components/workflow/hooks/use-collaborative-workflow' import { CUSTOM_ITERATION_START_NODE } from '@/app/components/workflow/nodes/iteration-start/constants' import { CUSTOM_LOOP_START_NODE } from '@/app/components/workflow/nodes/loop-start/constants' import { AppModeEnum } from '@/types/app' -import { useNodesMetaData } from '.' import { SUPPORT_OUTPUT_VARS_NODE } from '../constants' import { useHooksStore } from '../hooks-store' import { @@ -24,6 +22,8 @@ import { WorkflowRunningStatus } from '../types' import { getNodeCatalogType } from '../utils' import { getWorkflowEntryNode, isWorkflowEntryNode } from '../utils/workflow-entry' import { useAvailableBlocks } from './use-available-blocks' +import { useCollaborativeWorkflow } from './use-collaborative-workflow' +import { useNodesMetaData } from './use-nodes-meta-data' export const useIsChatMode = () => { const appDetail = useAppStore((s) => s.appDetail) diff --git a/web/app/components/workflow/index.tsx b/web/app/components/workflow/index.tsx index aae1f8bf018..30fb9578b13 100644 --- a/web/app/components/workflow/index.tsx +++ b/web/app/components/workflow/index.tsx @@ -67,21 +67,17 @@ import CustomConnectionLine from './custom-connection-line' import CustomEdge from './custom-edge' import DatasetsDetailProvider from './datasets-detail-store/provider' import HelpLine from './help-line' -import { - useEdgesInteractions, - useNodesInteractions, - useNodesReadOnly, - useNodesSyncDraft, - usePanelInteractions, - useSelectionInteractions, - useSetWorkflowVarsWithValue, - useWorkflow, - useWorkflowReadOnly, - useWorkflowRefreshDraft, -} from './hooks' import { HooksStoreContextProvider, useHooksStore } from './hooks-store' +import { useEdgesInteractions } from './hooks/use-edges-interactions' import { useLocateNode } from './hooks/use-locate-node' +import { useNodesInteractions } from './hooks/use-nodes-interactions' +import { useNodesSyncDraft } from './hooks/use-nodes-sync-draft' +import { usePanelInteractions } from './hooks/use-panel-interactions' +import { useSelectionInteractions } from './hooks/use-selection-interactions' +import { useSetWorkflowVarsWithValue } from './hooks/use-set-workflow-vars-with-value' +import { useNodesReadOnly, useWorkflow, useWorkflowReadOnly } from './hooks/use-workflow' import { useWorkflowComment } from './hooks/use-workflow-comment' +import { useWorkflowRefreshDraft } from './hooks/use-workflow-refresh-draft' import { useWorkflowSearch } from './hooks/use-workflow-search' import { shouldPreventWorkflowBrowserDefault } from './hotkeys' import CustomNode from './nodes' diff --git a/web/app/components/workflow/node-actions-menu/__tests__/details.spec.tsx b/web/app/components/workflow/node-actions-menu/__tests__/details.spec.tsx index 4ffb14f12ee..1bedad990da 100644 --- a/web/app/components/workflow/node-actions-menu/__tests__/details.spec.tsx +++ b/web/app/components/workflow/node-actions-menu/__tests__/details.spec.tsx @@ -7,18 +7,15 @@ import { import { render, screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { renderWorkflowFlowComponent } from '@/app/components/workflow/__tests__/workflow-test-env' -import { - useAvailableBlocks, - useIsChatMode, - useNodeMetaData, - useNodesInteractions, - useNodesReadOnly, -} from '@/app/components/workflow/hooks' import { useHooksStore } from '@/app/components/workflow/hooks-store' import useNodes from '@/app/components/workflow/store/workflow/use-nodes' import { BlockEnum, NodeRunningStatus } from '@/app/components/workflow/types' import { useAllWorkflowTools } from '@/service/use-tools' import { FlowType } from '@/types/common' +import { useAvailableBlocks } from '../../hooks/use-available-blocks' +import { useNodesInteractions } from '../../hooks/use-nodes-interactions' +import { useNodeMetaData } from '../../hooks/use-nodes-meta-data' +import { useIsChatMode, useNodesReadOnly } from '../../hooks/use-workflow' import { ChangeBlockMenuTrigger } from '../change-block-menu-trigger' import { NodeActionsDropdownContent } from '../dropdown-content' @@ -48,14 +45,39 @@ vi.mock('@/app/components/workflow/block-selector', () => ({ ), })) -vi.mock('@/app/components/workflow/hooks', async (importOriginal) => { - const actual = await importOriginal() +vi.mock('../../hooks/use-available-blocks', async (importOriginal) => { + const actual = await importOriginal() + return { ...actual, useAvailableBlocks: vi.fn(), - useIsChatMode: vi.fn(), - useNodeMetaData: vi.fn(), + } +}) + +vi.mock('../../hooks/use-nodes-interactions', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, useNodesInteractions: vi.fn(), + } +}) + +vi.mock('../../hooks/use-nodes-meta-data', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodeMetaData: vi.fn(), + } +}) + +vi.mock('../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useIsChatMode: vi.fn(), useNodesReadOnly: vi.fn(), } }) diff --git a/web/app/components/workflow/node-actions-menu/__tests__/index.spec.tsx b/web/app/components/workflow/node-actions-menu/__tests__/index.spec.tsx index 99927fa9a73..d5a595881ff 100644 --- a/web/app/components/workflow/node-actions-menu/__tests__/index.spec.tsx +++ b/web/app/components/workflow/node-actions-menu/__tests__/index.spec.tsx @@ -3,21 +3,36 @@ import type { ToolWithProvider } from '@/app/components/workflow/types' import { screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { renderWorkflowFlowComponent } from '@/app/components/workflow/__tests__/workflow-test-env' -import { - useNodeMetaData, - useNodesInteractions, - useNodesReadOnly, -} from '@/app/components/workflow/hooks' import { BlockEnum } from '@/app/components/workflow/types' import { useAllWorkflowTools } from '@/service/use-tools' +import { useNodesInteractions } from '../../hooks/use-nodes-interactions' +import { useNodeMetaData } from '../../hooks/use-nodes-meta-data' +import { useNodesReadOnly } from '../../hooks/use-workflow' import { NodeActionsDropdown } from '../index' -vi.mock('@/app/components/workflow/hooks', async (importOriginal) => { - const actual = await importOriginal() +vi.mock('../../hooks/use-nodes-interactions', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesInteractions: vi.fn(), + } +}) + +vi.mock('../../hooks/use-nodes-meta-data', async (importOriginal) => { + const actual = await importOriginal() + return { ...actual, useNodeMetaData: vi.fn(), - useNodesInteractions: vi.fn(), + } +}) + +vi.mock('../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, useNodesReadOnly: vi.fn(), } }) diff --git a/web/app/components/workflow/node-actions-menu/change-block-menu-trigger.tsx b/web/app/components/workflow/node-actions-menu/change-block-menu-trigger.tsx index a9e9ba82faf..51f60f4bbff 100644 --- a/web/app/components/workflow/node-actions-menu/change-block-menu-trigger.tsx +++ b/web/app/components/workflow/node-actions-menu/change-block-menu-trigger.tsx @@ -3,16 +3,14 @@ import { intersection } from 'es-toolkit/array' import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import BlockSelector from '@/app/components/workflow/block-selector' -import { - useAvailableBlocks, - useIsChatMode, - useNodesInteractions, -} from '@/app/components/workflow/hooks' import { useHooksStore } from '@/app/components/workflow/hooks-store' import useNodes from '@/app/components/workflow/store/workflow/use-nodes' import { BlockEnum, isTriggerNode } from '@/app/components/workflow/types' import { getNodeCatalogType } from '@/app/components/workflow/utils' import { FlowType } from '@/types/common' +import { useAvailableBlocks } from '../hooks/use-available-blocks' +import { useNodesInteractions } from '../hooks/use-nodes-interactions' +import { useIsChatMode } from '../hooks/use-workflow' type ChangeBlockMenuTriggerProps = { nodeId: string diff --git a/web/app/components/workflow/node-actions-menu/use-node-actions-menu-model.ts b/web/app/components/workflow/node-actions-menu/use-node-actions-menu-model.ts index affd9e63460..a0c46f95440 100644 --- a/web/app/components/workflow/node-actions-menu/use-node-actions-menu-model.ts +++ b/web/app/components/workflow/node-actions-menu/use-node-actions-menu-model.ts @@ -2,17 +2,15 @@ import type { Node } from '@/app/components/workflow/types' import { useCallback, useMemo } from 'react' import { useEdges } from 'reactflow' import { CollectionType } from '@/app/components/tools/types' -import { - useNodeMetaData, - useNodesInteractions, - useNodesReadOnly, -} from '@/app/components/workflow/hooks' import { useHooksStore } from '@/app/components/workflow/hooks-store' import { useWorkflowStore } from '@/app/components/workflow/store' import { BlockEnum, NodeRunningStatus } from '@/app/components/workflow/types' import { canRunBySingle } from '@/app/components/workflow/utils' import { useAllWorkflowTools } from '@/service/use-tools' import { canFindTool } from '@/utils' +import { useNodesInteractions } from '../hooks/use-nodes-interactions' +import { useNodeMetaData } from '../hooks/use-nodes-meta-data' +import { useNodesReadOnly } from '../hooks/use-workflow' type UseNodeActionsMenuModelParams = { id: string diff --git a/web/app/components/workflow/nodes/_base/__tests__/node.spec.tsx b/web/app/components/workflow/nodes/_base/__tests__/node.spec.tsx index 5d963a9f550..5c495c7fa56 100644 --- a/web/app/components/workflow/nodes/_base/__tests__/node.spec.tsx +++ b/web/app/components/workflow/nodes/_base/__tests__/node.spec.tsx @@ -26,22 +26,35 @@ vi.mock('@/context/account-state', async () => { return createAccountStateModuleMock(() => mockConsoleState) }) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: () => ({ nodesReadOnly: false }), - useToolIcon: () => undefined, -})) +vi.mock('../../../hooks/use-tool-icon', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useToolIcon: () => undefined, + } +}) + +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: () => ({ nodesReadOnly: false }), + } +}) vi.mock('@/app/components/workflow/collaboration/hooks/use-collaboration', () => ({ useCollaboration: (...args: unknown[]) => mockUseCollaboration(...args), })) -vi.mock('@/app/components/workflow/hooks/use-inspect-vars-crud', () => ({ +vi.mock('../../../hooks/use-inspect-vars-crud', () => ({ default: () => ({ hasNodeInspectVars: mockHasNodeInspectVars, }), })) -vi.mock('@/app/components/workflow/hooks/use-node-plugin-installation', () => ({ +vi.mock('../../../hooks/use-node-plugin-installation', () => ({ useNodePluginInstallation: (...args: unknown[]) => mockUseNodePluginInstallation(...args), })) diff --git a/web/app/components/workflow/nodes/_base/components/__tests__/form-input-item.branches.spec.tsx b/web/app/components/workflow/nodes/_base/components/__tests__/form-input-item.branches.spec.tsx index 68484a67b1e..164e7e2489d 100644 --- a/web/app/components/workflow/nodes/_base/components/__tests__/form-input-item.branches.spec.tsx +++ b/web/app/components/workflow/nodes/_base/components/__tests__/form-input-item.branches.spec.tsx @@ -34,17 +34,30 @@ vi.mock('@/service/use-triggers', () => ({ useTriggerPluginDynamicOptions: () => mockTriggerDynamicOptionsState, })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useIsChatMode: () => false, - useWorkflow: () => ({ - getTreeLeafNodes: () => [], - getNodeById: () => undefined, - getBeforeNodesInSameBranchIncludeParent: () => [], - }), - useWorkflowVariables: () => ({ - getNodeAvailableVars: () => [], - }), -})) +vi.mock('../../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useIsChatMode: () => false, + useWorkflow: () => ({ + getTreeLeafNodes: () => [], + getNodeById: () => undefined, + getBeforeNodesInSameBranchIncludeParent: () => [], + }), + } +}) + +vi.mock('../../../../hooks/use-workflow-variables', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflowVariables: () => ({ + getNodeAvailableVars: () => [], + }), + } +}) vi.mock('@/app/components/plugins/plugin-detail-panel/app-selector', () => ({ AppSelector: ({ onSelect }: { onSelect: (value: AppSelectorValue) => void }) => ( diff --git a/web/app/components/workflow/nodes/_base/components/__tests__/form-input-item.spec.tsx b/web/app/components/workflow/nodes/_base/components/__tests__/form-input-item.spec.tsx index 73b2b888673..167d396ef25 100644 --- a/web/app/components/workflow/nodes/_base/components/__tests__/form-input-item.spec.tsx +++ b/web/app/components/workflow/nodes/_base/components/__tests__/form-input-item.spec.tsx @@ -9,17 +9,30 @@ import { renderWorkflowFlowComponent } from '@/app/components/workflow/__tests__ import { VarKindType } from '../../types' import FormInputItem from '../form-input-item' -vi.mock('@/app/components/workflow/hooks', () => ({ - useIsChatMode: () => false, - useWorkflow: () => ({ - getTreeLeafNodes: () => [], - getNodeById: () => undefined, - getBeforeNodesInSameBranchIncludeParent: () => [], - }), - useWorkflowVariables: () => ({ - getNodeAvailableVars: () => [], - }), -})) +vi.mock('../../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useIsChatMode: () => false, + useWorkflow: () => ({ + getTreeLeafNodes: () => [], + getNodeById: () => undefined, + getBeforeNodesInSameBranchIncludeParent: () => [], + }), + } +}) + +vi.mock('../../../../hooks/use-workflow-variables', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflowVariables: () => ({ + getNodeAvailableVars: () => [], + }), + } +}) const createSchema = ( overrides: Partial< diff --git a/web/app/components/workflow/nodes/_base/components/__tests__/node-control.spec.tsx b/web/app/components/workflow/nodes/_base/components/__tests__/node-control.spec.tsx index fc6494a3fb5..478ffc576dc 100644 --- a/web/app/components/workflow/nodes/_base/components/__tests__/node-control.spec.tsx +++ b/web/app/components/workflow/nodes/_base/components/__tests__/node-control.spec.tsx @@ -14,13 +14,20 @@ const { mockHandleNodeSelect, mockCanRunBySingle, mockUseNodesReadOnly } = vi.ho let mockPluginInstallLocked = false -vi.mock('../../../../hooks', async () => { - const actual = await vi.importActual('../../../../hooks') +vi.mock('../../../../hooks/use-nodes-interactions', async (importOriginal) => { + const actual = await importOriginal() return { ...actual, useNodesInteractions: () => ({ handleNodeSelect: mockHandleNodeSelect, }), + } +}) + +vi.mock('../../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + return { + ...actual, useNodesReadOnly: mockUseNodesReadOnly, } }) diff --git a/web/app/components/workflow/nodes/_base/components/__tests__/node-handle.spec.tsx b/web/app/components/workflow/nodes/_base/components/__tests__/node-handle.spec.tsx index e7e0e08d461..17032d49034 100644 --- a/web/app/components/workflow/nodes/_base/components/__tests__/node-handle.spec.tsx +++ b/web/app/components/workflow/nodes/_base/components/__tests__/node-handle.spec.tsx @@ -104,19 +104,40 @@ vi.mock('@/app/components/workflow/block-selector', () => ({ ), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useAvailableBlocks: () => ({ - availablePrevBlocks: mockHooksState.availablePrevBlocks, - availableNextBlocks: mockHooksState.availableNextBlocks, - }), - useIsChatMode: () => mockHooksState.isChatMode, - useNodesInteractions: () => ({ - handleNodeAdd: mockHandleNodeAdd, - }), - useNodesReadOnly: () => ({ - getNodesReadOnly: () => mockHooksState.isReadOnly, - }), -})) +vi.mock('../../../../hooks/use-available-blocks', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useAvailableBlocks: () => ({ + availablePrevBlocks: mockHooksState.availablePrevBlocks, + availableNextBlocks: mockHooksState.availableNextBlocks, + }), + } +}) + +vi.mock('../../../../hooks/use-nodes-interactions', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesInteractions: () => ({ + handleNodeAdd: mockHandleNodeAdd, + }), + } +}) + +vi.mock('../../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useIsChatMode: () => mockHooksState.isChatMode, + useNodesReadOnly: () => ({ + getNodesReadOnly: () => mockHooksState.isReadOnly, + }), + } +}) vi.mock('@/app/components/workflow/store', () => ({ useStore: (selector: (state: MockStoreState) => T) => selector(mockStoreState), diff --git a/web/app/components/workflow/nodes/_base/components/add-variable-popup-with-position.tsx b/web/app/components/workflow/nodes/_base/components/add-variable-popup-with-position.tsx index 14804583920..6db6d22be37 100644 --- a/web/app/components/workflow/nodes/_base/components/add-variable-popup-with-position.tsx +++ b/web/app/components/workflow/nodes/_base/components/add-variable-popup-with-position.tsx @@ -1,7 +1,9 @@ import type { ValueSelector, Var, VarType } from '../../../types' import { useClickAway } from 'ahooks' import { memo, useCallback, useMemo, useRef } from 'react' -import { useIsChatMode, useNodeDataUpdate, useWorkflow, useWorkflowVariables } from '../../../hooks' +import { useNodeDataUpdate } from '../../../hooks/use-node-data-update' +import { useIsChatMode, useWorkflow } from '../../../hooks/use-workflow' +import { useWorkflowVariables } from '../../../hooks/use-workflow-variables' import { useStore } from '../../../store' import { useVariableAssigner } from '../../variable-assigner/hooks' import { filterVar } from '../../variable-assigner/utils' diff --git a/web/app/components/workflow/nodes/_base/components/error-handle/hooks.ts b/web/app/components/workflow/nodes/_base/components/error-handle/hooks.ts index 07186480b02..84424bade49 100644 --- a/web/app/components/workflow/nodes/_base/components/error-handle/hooks.ts +++ b/web/app/components/workflow/nodes/_base/components/error-handle/hooks.ts @@ -1,7 +1,8 @@ import type { DefaultValueForm } from './types' import type { CommonNodeType } from '@/app/components/workflow/types' import { useCallback, useMemo, useState } from 'react' -import { useEdgesInteractions, useNodeDataUpdate } from '@/app/components/workflow/hooks' +import { useEdgesInteractions } from '../../../../hooks/use-edges-interactions' +import { useNodeDataUpdate } from '../../../../hooks/use-node-data-update' import { ErrorHandleTypeEnum } from './types' import { getDefaultValue } from './utils' diff --git a/web/app/components/workflow/nodes/_base/components/next-step/__tests__/index.spec.tsx b/web/app/components/workflow/nodes/_base/components/next-step/__tests__/index.spec.tsx index 6e9317bcd49..773568142c2 100644 --- a/web/app/components/workflow/nodes/_base/components/next-step/__tests__/index.spec.tsx +++ b/web/app/components/workflow/nodes/_base/components/next-step/__tests__/index.spec.tsx @@ -3,14 +3,12 @@ import type { Edge, Node } from '@/app/components/workflow/types' import { screen } from '@testing-library/react' import { createEdge, createNode } from '@/app/components/workflow/__tests__/fixtures' import { renderWorkflowFlowComponent } from '@/app/components/workflow/__tests__/workflow-test-env' -import { - useAvailableBlocks, - useNodesInteractions, - useNodesReadOnly, - useToolIcon, -} from '@/app/components/workflow/hooks' import { ErrorHandleTypeEnum } from '@/app/components/workflow/nodes/_base/components/error-handle/types' import { BlockEnum } from '@/app/components/workflow/types' +import { useAvailableBlocks } from '../../../../../hooks/use-available-blocks' +import { useNodesInteractions } from '../../../../../hooks/use-nodes-interactions' +import { useToolIcon } from '../../../../../hooks/use-tool-icon' +import { useNodesReadOnly } from '../../../../../hooks/use-workflow' import NextStep from '../index' vi.mock('@/app/components/workflow/block-selector', () => ({ @@ -23,17 +21,43 @@ vi.mock('@/app/components/workflow/block-selector', () => ({ }, })) -vi.mock('@/app/components/workflow/hooks', async (importOriginal) => { - const actual = await importOriginal() +vi.mock('../../../../../hooks/use-available-blocks', async (importOriginal) => { + const actual = await importOriginal() + return { ...actual, useAvailableBlocks: vi.fn(), + } +}) + +vi.mock('../../../../../hooks/use-nodes-interactions', async (importOriginal) => { + const actual = + await importOriginal() + + return { + ...actual, useNodesInteractions: vi.fn(), - useNodesReadOnly: vi.fn(), + } +}) + +vi.mock('../../../../../hooks/use-tool-icon', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, useToolIcon: vi.fn(), } }) +vi.mock('../../../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: vi.fn(), + } +}) + const mockUseAvailableBlocks = vi.mocked(useAvailableBlocks) const mockUseNodesInteractions = vi.mocked(useNodesInteractions) const mockUseNodesReadOnly = vi.mocked(useNodesReadOnly) diff --git a/web/app/components/workflow/nodes/_base/components/next-step/__tests__/operator.spec.tsx b/web/app/components/workflow/nodes/_base/components/next-step/__tests__/operator.spec.tsx index 0846cc69b61..bfec891cd70 100644 --- a/web/app/components/workflow/nodes/_base/components/next-step/__tests__/operator.spec.tsx +++ b/web/app/components/workflow/nodes/_base/components/next-step/__tests__/operator.spec.tsx @@ -3,8 +3,9 @@ import type { CommonNodeType } from '@/app/components/workflow/types' import { render, screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { useState } from 'react' -import { useAvailableBlocks, useNodesInteractions } from '@/app/components/workflow/hooks' import { BlockEnum } from '@/app/components/workflow/types' +import { useAvailableBlocks } from '../../../../../hooks/use-available-blocks' +import { useNodesInteractions } from '../../../../../hooks/use-nodes-interactions' import Operator from '../operator' vi.mock('@langgenius/dify-ui/dropdown-menu', async () => { @@ -96,11 +97,21 @@ vi.mock('@/app/components/workflow/block-selector', () => ({ ), })) -vi.mock('@/app/components/workflow/hooks', async (importOriginal) => { - const actual = await importOriginal() +vi.mock('../../../../../hooks/use-available-blocks', async (importOriginal) => { + const actual = await importOriginal() + return { ...actual, useAvailableBlocks: vi.fn(), + } +}) + +vi.mock('../../../../../hooks/use-nodes-interactions', async (importOriginal) => { + const actual = + await importOriginal() + + return { + ...actual, useNodesInteractions: vi.fn(), } }) diff --git a/web/app/components/workflow/nodes/_base/components/next-step/add.tsx b/web/app/components/workflow/nodes/_base/components/next-step/add.tsx index 568b3c8ec1a..e478f8ecd46 100644 --- a/web/app/components/workflow/nodes/_base/components/next-step/add.tsx +++ b/web/app/components/workflow/nodes/_base/components/next-step/add.tsx @@ -4,12 +4,10 @@ import { RiAddLine } from '@remixicon/react' import { memo, useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import BlockSelector from '@/app/components/workflow/block-selector' -import { - useAvailableBlocks, - useNodesInteractions, - useNodesReadOnly, -} from '@/app/components/workflow/hooks' import { getNodeCatalogType } from '@/app/components/workflow/utils' +import { useAvailableBlocks } from '../../../../hooks/use-available-blocks' +import { useNodesInteractions } from '../../../../hooks/use-nodes-interactions' +import { useNodesReadOnly } from '../../../../hooks/use-workflow' type AddProps = { nodeId: string diff --git a/web/app/components/workflow/nodes/_base/components/next-step/index.tsx b/web/app/components/workflow/nodes/_base/components/next-step/index.tsx index 6d9424e1b36..6b3d7497728 100644 --- a/web/app/components/workflow/nodes/_base/components/next-step/index.tsx +++ b/web/app/components/workflow/nodes/_base/components/next-step/index.tsx @@ -6,7 +6,7 @@ import { getConnectedEdges, getOutgoers, useStore } from 'reactflow' import { ErrorHandleTypeEnum } from '@/app/components/workflow/nodes/_base/components/error-handle/types' import { hasErrorHandleNode } from '@/app/components/workflow/utils' import BlockIcon from '../../../../block-icon' -import { useToolIcon } from '../../../../hooks' +import { useToolIcon } from '../../../../hooks/use-tool-icon' import { BlockEnum } from '../../../../types' import Container from './container' import Line from './line' diff --git a/web/app/components/workflow/nodes/_base/components/next-step/item.tsx b/web/app/components/workflow/nodes/_base/components/next-step/item.tsx index 49de337b509..dd2a9739edb 100644 --- a/web/app/components/workflow/nodes/_base/components/next-step/item.tsx +++ b/web/app/components/workflow/nodes/_base/components/next-step/item.tsx @@ -4,11 +4,9 @@ import { cn } from '@langgenius/dify-ui/cn' import { memo, useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import BlockIcon from '@/app/components/workflow/block-icon' -import { - useNodesInteractions, - useNodesReadOnly, - useToolIcon, -} from '@/app/components/workflow/hooks' +import { useNodesInteractions } from '../../../../hooks/use-nodes-interactions' +import { useToolIcon } from '../../../../hooks/use-tool-icon' +import { useNodesReadOnly } from '../../../../hooks/use-workflow' import Operator from './operator' type ItemProps = { diff --git a/web/app/components/workflow/nodes/_base/components/next-step/operator.tsx b/web/app/components/workflow/nodes/_base/components/next-step/operator.tsx index 1683e4258d6..2d3bdfc939f 100644 --- a/web/app/components/workflow/nodes/_base/components/next-step/operator.tsx +++ b/web/app/components/workflow/nodes/_base/components/next-step/operator.tsx @@ -9,8 +9,9 @@ import { intersection } from 'es-toolkit/array' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' import BlockSelector from '@/app/components/workflow/block-selector' -import { useAvailableBlocks, useNodesInteractions } from '@/app/components/workflow/hooks' import { getNodeCatalogType } from '@/app/components/workflow/utils' +import { useAvailableBlocks } from '../../../../hooks/use-available-blocks' +import { useNodesInteractions } from '../../../../hooks/use-nodes-interactions' type ChangeItemProps = { data: CommonNodeType diff --git a/web/app/components/workflow/nodes/_base/components/node-control.tsx b/web/app/components/workflow/nodes/_base/components/node-control.tsx index 7e530f3ffaf..13699a140c5 100644 --- a/web/app/components/workflow/nodes/_base/components/node-control.tsx +++ b/web/app/components/workflow/nodes/_base/components/node-control.tsx @@ -8,7 +8,8 @@ import { Stop } from '@/app/components/base/icons/src/vender/line/mediaAndDevice import { useHooksStore } from '@/app/components/workflow/hooks-store' import { NodeActionsDropdown } from '@/app/components/workflow/node-actions-menu' import { useWorkflowStore } from '@/app/components/workflow/store' -import { useNodesInteractions, useNodesReadOnly } from '../../../hooks' +import { useNodesInteractions } from '../../../hooks/use-nodes-interactions' +import { useNodesReadOnly } from '../../../hooks/use-workflow' import { NodeRunningStatus } from '../../../types' import { canRunBySingle } from '../../../utils' diff --git a/web/app/components/workflow/nodes/_base/components/node-handle.tsx b/web/app/components/workflow/nodes/_base/components/node-handle.tsx index 549676132c0..324ea9d7b0c 100644 --- a/web/app/components/workflow/nodes/_base/components/node-handle.tsx +++ b/web/app/components/workflow/nodes/_base/components/node-handle.tsx @@ -6,12 +6,9 @@ import { memo, useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { Handle, Position } from 'reactflow' import BlockSelector from '../../../block-selector' -import { - useAvailableBlocks, - useIsChatMode, - useNodesInteractions, - useNodesReadOnly, -} from '../../../hooks' +import { useAvailableBlocks } from '../../../hooks/use-available-blocks' +import { useNodesInteractions } from '../../../hooks/use-nodes-interactions' +import { useIsChatMode, useNodesReadOnly } from '../../../hooks/use-workflow' import { useStore, useWorkflowStore } from '../../../store' import { BlockEnum, NodeRunningStatus } from '../../../types' import { getNodeCatalogType } from '../../../utils' diff --git a/web/app/components/workflow/nodes/_base/components/node-resizer.tsx b/web/app/components/workflow/nodes/_base/components/node-resizer.tsx index ce1df3d2e34..eb7b00520e0 100644 --- a/web/app/components/workflow/nodes/_base/components/node-resizer.tsx +++ b/web/app/components/workflow/nodes/_base/components/node-resizer.tsx @@ -3,7 +3,7 @@ import type { CommonNodeType } from '../../../types' import { cn } from '@langgenius/dify-ui/cn' import { memo, useCallback } from 'react' import { NodeResizeControl } from 'reactflow' -import { useNodesInteractions } from '../../../hooks' +import { useNodesInteractions } from '../../../hooks/use-nodes-interactions' const Icon = () => { return ( diff --git a/web/app/components/workflow/nodes/_base/components/prompt/editor.tsx b/web/app/components/workflow/nodes/_base/components/prompt/editor.tsx index a853be7373f..08c8dd127b9 100644 --- a/web/app/components/workflow/nodes/_base/components/prompt/editor.tsx +++ b/web/app/components/workflow/nodes/_base/components/prompt/editor.tsx @@ -17,12 +17,12 @@ import { Variable02 } from '@/app/components/base/icons/src/vender/solid/develop import { Jinja } from '@/app/components/base/icons/src/vender/workflow' import PromptEditor from '@/app/components/base/prompt-editor' import { PROMPT_EDITOR_INSERT_QUICKLY } from '@/app/components/base/prompt-editor/plugins/update-block' -import { useWorkflowVariableType } from '@/app/components/workflow/hooks' import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor/editor-support-vars' import ToggleExpandBtn from '@/app/components/workflow/nodes/_base/components/toggle-expand-btn' import useToggleExpend from '@/app/components/workflow/nodes/_base/hooks/use-toggle-expend' import { useStore } from '@/app/components/workflow/store' import { useEventEmitterContextContext } from '@/context/event-emitter' +import { useWorkflowVariableType } from '../../../../hooks/use-workflow-variables' import { BlockEnum, EditionType } from '../../../../types' import { CodeLanguage } from '../../../code/types' import PromptGeneratorBtn from '../../../llm/components/prompt-generator-btn' diff --git a/web/app/components/workflow/nodes/_base/components/readonly-input-with-select-var.tsx b/web/app/components/workflow/nodes/_base/components/readonly-input-with-select-var.tsx index 6b72fd99141..e0827e93085 100644 --- a/web/app/components/workflow/nodes/_base/components/readonly-input-with-select-var.tsx +++ b/web/app/components/workflow/nodes/_base/components/readonly-input-with-select-var.tsx @@ -3,7 +3,7 @@ import type { FC } from 'react' import { cn } from '@langgenius/dify-ui/cn' import * as React from 'react' import { VariableLabelInText } from '@/app/components/workflow/nodes/_base/components/variable/variable-label' -import { useWorkflow } from '../../../hooks' +import { useWorkflow } from '../../../hooks/use-workflow' import { BlockEnum } from '../../../types' import { getNodeInfoById, isSystemVar } from './variable/utils' diff --git a/web/app/components/workflow/nodes/_base/components/retry/hooks.ts b/web/app/components/workflow/nodes/_base/components/retry/hooks.ts index 17dba94a249..25b2942801c 100644 --- a/web/app/components/workflow/nodes/_base/components/retry/hooks.ts +++ b/web/app/components/workflow/nodes/_base/components/retry/hooks.ts @@ -1,6 +1,6 @@ import type { WorkflowRetryConfig } from './types' import { useCallback } from 'react' -import { useNodeDataUpdate } from '@/app/components/workflow/hooks' +import { useNodeDataUpdate } from '../../../../hooks/use-node-data-update' export const useRetryConfig = (id: string) => { const { handleNodeDataUpdateWithSyncDraft } = useNodeDataUpdate() diff --git a/web/app/components/workflow/nodes/_base/components/variable/__tests__/var-reference-picker.branches.spec.tsx b/web/app/components/workflow/nodes/_base/components/variable/__tests__/var-reference-picker.branches.spec.tsx index 3bc81767863..875763a3d1c 100644 --- a/web/app/components/workflow/nodes/_base/components/variable/__tests__/var-reference-picker.branches.spec.tsx +++ b/web/app/components/workflow/nodes/_base/components/variable/__tests__/var-reference-picker.branches.spec.tsx @@ -22,18 +22,32 @@ vi.mock('@/service/use-plugins', () => ({ }), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useIsChatMode: () => false, - useWorkflow: () => ({ - getTreeLeafNodes: () => [], - getNodeById: () => undefined, - getBeforeNodesInSameBranchIncludeParent: () => [], - }), - useWorkflowVariables: () => ({ - getNodeAvailableVars: () => [], - getCurrentVariableType: () => undefined, - }), -})) +vi.mock('../../../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useIsChatMode: () => false, + useWorkflow: () => ({ + getTreeLeafNodes: () => [], + getNodeById: () => undefined, + getBeforeNodesInSameBranchIncludeParent: () => [], + }), + } +}) + +vi.mock('../../../../../hooks/use-workflow-variables', async (importOriginal) => { + const actual = + await importOriginal() + + return { + ...actual, + useWorkflowVariables: () => ({ + getNodeAvailableVars: () => [], + getCurrentVariableType: () => undefined, + }), + } +}) vi.mock('../var-reference-popup', () => ({ default: ({ diff --git a/web/app/components/workflow/nodes/_base/components/variable/__tests__/var-reference-picker.spec.tsx b/web/app/components/workflow/nodes/_base/components/variable/__tests__/var-reference-picker.spec.tsx index 2a76386b33e..8f4248fc90e 100644 --- a/web/app/components/workflow/nodes/_base/components/variable/__tests__/var-reference-picker.spec.tsx +++ b/web/app/components/workflow/nodes/_base/components/variable/__tests__/var-reference-picker.spec.tsx @@ -10,18 +10,32 @@ import { renderWorkflowFlowComponent } from '@/app/components/workflow/__tests__ import { BlockEnum, InputVarType, VarType } from '@/app/components/workflow/types' import VarReferencePicker from '../var-reference-picker' -vi.mock('@/app/components/workflow/hooks', () => ({ - useIsChatMode: () => false, - useWorkflow: () => ({ - getTreeLeafNodes: () => [], - getNodeById: () => undefined, - getBeforeNodesInSameBranchIncludeParent: () => [], - }), - useWorkflowVariables: () => ({ - getNodeAvailableVars: () => [], - getCurrentVariableType: () => undefined, - }), -})) +vi.mock('../../../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useIsChatMode: () => false, + useWorkflow: () => ({ + getTreeLeafNodes: () => [], + getNodeById: () => undefined, + getBeforeNodesInSameBranchIncludeParent: () => [], + }), + } +}) + +vi.mock('../../../../../hooks/use-workflow-variables', async (importOriginal) => { + const actual = + await importOriginal() + + return { + ...actual, + useWorkflowVariables: () => ({ + getNodeAvailableVars: () => [], + getCurrentVariableType: () => undefined, + }), + } +}) describe('VarReferencePicker', () => { const startNode = createStartNode({ diff --git a/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx b/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx index ae932f7f2f5..dc778b85427 100644 --- a/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx +++ b/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx @@ -25,13 +25,14 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useNodes, useReactFlow, useStoreApi } from 'reactflow' import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' -import { useIsChatMode, useWorkflowVariables } from '@/app/components/workflow/hooks' // import type { BaseResource, BaseResourceProvider } from '@/app/components/workflow/nodes/_base/types' import { VarType as VarKindType } from '@/app/components/workflow/nodes/tool/types' import { useStore as useWorkflowStore } from '@/app/components/workflow/store' import { BlockEnum } from '@/app/components/workflow/types' import { isExceptionVariable } from '@/app/components/workflow/utils' import { useFetchDynamicOptions } from '@/service/use-plugins' +import { useIsChatMode } from '../../../../hooks/use-workflow' +import { useWorkflowVariables } from '../../../../hooks/use-workflow-variables' import useAvailableVarList from '../../hooks/use-available-var-list' import { removeFileVars, varTypeToStructType } from './utils' import VarFullPathPanel from './var-full-path-panel' diff --git a/web/app/components/workflow/nodes/_base/components/workflow-panel/__tests__/index.spec.tsx b/web/app/components/workflow/nodes/_base/components/workflow-panel/__tests__/index.spec.tsx index 7aebb57ca17..dc530886182 100644 --- a/web/app/components/workflow/nodes/_base/components/workflow-panel/__tests__/index.spec.tsx +++ b/web/app/components/workflow/nodes/_base/components/workflow-panel/__tests__/index.spec.tsx @@ -104,36 +104,99 @@ vi.mock('@/app/components/plugins/plugin-detail-panel/store', () => ({ }), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useAvailableBlocks: () => ({ availableNextBlocks: [] }), - useEdgesInteractions: () => ({ - handleEdgeDeleteByDeleteBranch: vi.fn(), - }), - useNodeDataUpdate: () => ({ - handleNodeDataUpdate: mockHandleNodeDataUpdate, - handleNodeDataUpdateWithSyncDraft: mockHandleNodeDataUpdateWithSyncDraft, - }), - useNodesInteractions: () => ({ - handleNodeSelect: mockHandleNodeSelect, - }), - useNodesMetaData: () => ({ - nodesMap: { - [BlockEnum.Tool]: { defaultRunInputData: {}, metaData: { helpLinkUri: '' } }, - [BlockEnum.DataSource]: { defaultRunInputData: {}, metaData: { helpLinkUri: '' } }, +vi.mock('../../../../../hooks/use-available-blocks', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useAvailableBlocks: () => ({ availableNextBlocks: [] }), + } +}) + +vi.mock('../../../../../hooks/use-edges-interactions', async (importOriginal) => { + const actual = + await importOriginal() + + return { + ...actual, + useEdgesInteractions: () => ({ + handleEdgeDeleteByDeleteBranch: vi.fn(), + }), + } +}) + +vi.mock('../../../../../hooks/use-node-data-update', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodeDataUpdate: () => ({ + handleNodeDataUpdate: mockHandleNodeDataUpdate, + handleNodeDataUpdateWithSyncDraft: mockHandleNodeDataUpdateWithSyncDraft, + }), + } +}) + +vi.mock('../../../../../hooks/use-nodes-interactions', async (importOriginal) => { + const actual = + await importOriginal() + + return { + ...actual, + useNodesInteractions: () => ({ + handleNodeSelect: mockHandleNodeSelect, + }), + } +}) + +vi.mock('../../../../../hooks/use-nodes-meta-data', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesMetaData: () => ({ + nodesMap: { + [BlockEnum.Tool]: { defaultRunInputData: {}, metaData: { helpLinkUri: '' } }, + [BlockEnum.DataSource]: { defaultRunInputData: {}, metaData: { helpLinkUri: '' } }, + }, + }), + } +}) + +vi.mock('../../../../../hooks/use-tool-icon', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useToolIcon: () => undefined, + } +}) + +vi.mock('../../../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: () => ({ + nodesReadOnly: mockNodesReadOnly, + }), + } +}) + +vi.mock('../../../../../hooks/use-workflow-history', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflowHistory: () => ({ + saveStateToHistory: mockSaveStateToHistory, + }), + WorkflowHistoryEvent: { + NodeTitleChange: 'NodeTitleChange', + NodeDescriptionChange: 'NodeDescriptionChange', }, - }), - useNodesReadOnly: () => ({ - nodesReadOnly: mockNodesReadOnly, - }), - useToolIcon: () => undefined, - useWorkflowHistory: () => ({ - saveStateToHistory: mockSaveStateToHistory, - }), - WorkflowHistoryEvent: { - NodeTitleChange: 'NodeTitleChange', - NodeDescriptionChange: 'NodeDescriptionChange', - }, -})) + } +}) vi.mock('@/app/components/workflow/hooks-store', () => ({ useHooksStore: ( @@ -153,7 +216,7 @@ vi.mock('@/app/components/workflow/hooks-store', () => ({ }), })) -vi.mock('@/app/components/workflow/hooks/use-inspect-vars-crud', () => ({ +vi.mock('../../../../../hooks/use-inspect-vars-crud', () => ({ default: () => ({ appendNodeInspectVars: vi.fn(), }), diff --git a/web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx b/web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx index 8a714bb1b4e..0cab2f85aee 100644 --- a/web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx +++ b/web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx @@ -29,18 +29,7 @@ import { ReadmeEntrance } from '@/app/components/plugins/readme-panel/entrance' import BlockIcon from '@/app/components/workflow/block-icon' import { collaborationManager } from '@/app/components/workflow/collaboration/core/collaboration-manager' import { useCollaboration } from '@/app/components/workflow/collaboration/hooks/use-collaboration' -import { - useAvailableBlocks, - useNodeDataUpdate, - useNodesInteractions, - useNodesMetaData, - useNodesReadOnly, - useToolIcon, - useWorkflowHistory, - WorkflowHistoryEvent, -} from '@/app/components/workflow/hooks' import { useHooksStore } from '@/app/components/workflow/hooks-store' -import useInspectVarsCrud from '@/app/components/workflow/hooks/use-inspect-vars-crud' import { NodeActionsDropdown } from '@/app/components/workflow/node-actions-menu' import Split from '@/app/components/workflow/nodes/_base/components/split' import { useSetWorkflowNodePanelWidth } from '@/app/components/workflow/persistence/local-storage-options' @@ -59,6 +48,14 @@ import { userProfileAtom } from '@/context/account-state' import { useAllBuiltInTools } from '@/service/use-tools' import { useAllTriggerPlugins } from '@/service/use-triggers' import { FlowType } from '@/types/common' +import { useAvailableBlocks } from '../../../../hooks/use-available-blocks' +import useInspectVarsCrud from '../../../../hooks/use-inspect-vars-crud' +import { useNodeDataUpdate } from '../../../../hooks/use-node-data-update' +import { useNodesInteractions } from '../../../../hooks/use-nodes-interactions' +import { useNodesMetaData } from '../../../../hooks/use-nodes-meta-data' +import { useToolIcon } from '../../../../hooks/use-tool-icon' +import { useNodesReadOnly } from '../../../../hooks/use-workflow' +import { useWorkflowHistory, WorkflowHistoryEvent } from '../../../../hooks/use-workflow-history' import { useResizePanel } from '../../hooks/use-resize-panel' import BeforeRunForm from '../before-run-form' import PanelWrap from '../before-run-form/panel-wrap' diff --git a/web/app/components/workflow/nodes/_base/components/workflow-panel/last-run/__tests__/use-last-run.spec.ts b/web/app/components/workflow/nodes/_base/components/workflow-panel/last-run/__tests__/use-last-run.spec.ts index 8f3c660211a..03e5445de37 100644 --- a/web/app/components/workflow/nodes/_base/components/workflow-panel/last-run/__tests__/use-last-run.spec.ts +++ b/web/app/components/workflow/nodes/_base/components/workflow-panel/last-run/__tests__/use-last-run.spec.ts @@ -8,19 +8,25 @@ const mockHandleSyncWorkflowDraft = vi.fn() const mockShowSingleRun = vi.fn() const mockHandleRun = vi.fn() -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesSyncDraft: () => ({ - handleSyncWorkflowDraft: mockHandleSyncWorkflowDraft, - }), -})) +vi.mock('../../../../../../hooks/use-nodes-sync-draft', async (importOriginal) => { + const actual = + await importOriginal() -vi.mock('@/app/components/workflow/hooks/use-checklist', () => ({ + return { + ...actual, + useNodesSyncDraft: () => ({ + handleSyncWorkflowDraft: mockHandleSyncWorkflowDraft, + }), + } +}) + +vi.mock('../../../../../../hooks/use-checklist', () => ({ useWorkflowRunValidation: () => ({ warningNodes: [], }), })) -vi.mock('@/app/components/workflow/hooks/use-inspect-vars-crud', () => ({ +vi.mock('../../../../../../hooks/use-inspect-vars-crud', () => ({ default: () => ({ conversationVars: [], systemVars: [], diff --git a/web/app/components/workflow/nodes/_base/components/workflow-panel/last-run/use-last-run.ts b/web/app/components/workflow/nodes/_base/components/workflow-panel/last-run/use-last-run.ts index 8840435f021..df98ce1cee7 100644 --- a/web/app/components/workflow/nodes/_base/components/workflow-panel/last-run/use-last-run.ts +++ b/web/app/components/workflow/nodes/_base/components/workflow-panel/last-run/use-last-run.ts @@ -4,9 +4,6 @@ import type { Params as OneStepRunParams } from '@/app/components/workflow/nodes import type { CommonNodeType, ValueSelector } from '@/app/components/workflow/types' import { toast } from '@langgenius/dify-ui/toast' import { useCallback, useEffect, useState } from 'react' -import { useNodesSyncDraft } from '@/app/components/workflow/hooks' -import { useWorkflowRunValidation } from '@/app/components/workflow/hooks/use-checklist' -import useInspectVarsCrud from '@/app/components/workflow/hooks/use-inspect-vars-crud' import useOneStepRun from '@/app/components/workflow/nodes/_base/hooks/use-one-step-run' import useVariableAssignerSingleRunFormParams from '@/app/components/workflow/nodes/assigner/use-single-run-form-params' import useCodeSingleRunFormParams from '@/app/components/workflow/nodes/code/use-single-run-form-params' @@ -32,6 +29,9 @@ import { BlockEnum } from '@/app/components/workflow/types' import { isSupportCustomRunForm } from '@/app/components/workflow/utils' import { VALUE_SELECTOR_DELIMITER as DELIMITER } from '@/config' import { useInvalidLastRun } from '@/service/use-workflow' +import { useWorkflowRunValidation } from '../../../../../hooks/use-checklist' +import useInspectVarsCrud from '../../../../../hooks/use-inspect-vars-crud' +import { useNodesSyncDraft } from '../../../../../hooks/use-nodes-sync-draft' import { TabType } from '../types' const singleRunFormParamsHooks: Record = { diff --git a/web/app/components/workflow/nodes/_base/hooks/__tests__/use-available-var-list.spec.ts b/web/app/components/workflow/nodes/_base/hooks/__tests__/use-available-var-list.spec.ts index 015d8e02ddc..547f84779a7 100644 --- a/web/app/components/workflow/nodes/_base/hooks/__tests__/use-available-var-list.spec.ts +++ b/web/app/components/workflow/nodes/_base/hooks/__tests__/use-available-var-list.spec.ts @@ -17,17 +17,30 @@ vi.mock('@/app/components/snippets/draft-store', () => ({ selector({ inputFields: [] }), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useIsChatMode: () => true, - useWorkflow: () => ({ - getTreeLeafNodes: mockGetTreeLeafNodes, - getBeforeNodesInSameBranchIncludeParent: mockGetBeforeNodesInSameBranchIncludeParent, - getNodeById: mockGetNodeById, - }), - useWorkflowVariables: () => ({ - getNodeAvailableVars: mockGetNodeAvailableVars, - }), -})) +vi.mock('../../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useIsChatMode: () => true, + useWorkflow: () => ({ + getTreeLeafNodes: mockGetTreeLeafNodes, + getBeforeNodesInSameBranchIncludeParent: mockGetBeforeNodesInSameBranchIncludeParent, + getNodeById: mockGetNodeById, + }), + } +}) + +vi.mock('../../../../hooks/use-workflow-variables', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflowVariables: () => ({ + getNodeAvailableVars: mockGetNodeAvailableVars, + }), + } +}) vi.mock('@/app/components/workflow/store', () => ({ useStore: (selector: (state: { ragPipelineVariables: unknown[] }) => unknown) => diff --git a/web/app/components/workflow/nodes/_base/hooks/__tests__/use-node-crud.spec.ts b/web/app/components/workflow/nodes/_base/hooks/__tests__/use-node-crud.spec.ts index ca8558df528..e2ae05ca07f 100644 --- a/web/app/components/workflow/nodes/_base/hooks/__tests__/use-node-crud.spec.ts +++ b/web/app/components/workflow/nodes/_base/hooks/__tests__/use-node-crud.spec.ts @@ -7,11 +7,16 @@ const mockHandleNodeDataUpdateWithSyncDraft = vi.hoisted(() => ({ current: vi.fn(), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodeDataUpdate: () => ({ - handleNodeDataUpdateWithSyncDraft: mockHandleNodeDataUpdateWithSyncDraft.current, - }), -})) +vi.mock('../../../../hooks/use-node-data-update', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodeDataUpdate: () => ({ + handleNodeDataUpdateWithSyncDraft: mockHandleNodeDataUpdateWithSyncDraft.current, + }), + } +}) type TestNodeData = CommonNodeType<{ value: string diff --git a/web/app/components/workflow/nodes/_base/hooks/__tests__/use-one-step-run.spec.ts b/web/app/components/workflow/nodes/_base/hooks/__tests__/use-one-step-run.spec.ts index 7d6c37bae88..43d36571549 100644 --- a/web/app/components/workflow/nodes/_base/hooks/__tests__/use-one-step-run.spec.ts +++ b/web/app/components/workflow/nodes/_base/hooks/__tests__/use-one-step-run.spec.ts @@ -26,36 +26,49 @@ vi.mock('@/app/components/base/amplitude', () => ({ trackEvent: vi.fn(), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useIsChatMode: () => false, - useNodeDataUpdate: () => ({ - handleNodeDataUpdate: vi.fn(), - }), - useWorkflow: () => ({ - getBeforeNodesInSameBranch: () => [ - { - id: 'start', - data: { - type: 'start', - title: 'Start', - variables: [], - }, - }, - ], - getBeforeNodesInSameBranchIncludeParent: () => [ - { - id: 'start', - data: { - type: 'start', - title: 'Start', - variables: [], - }, - }, - ], - }), -})) +vi.mock('../../../../hooks/use-node-data-update', async (importOriginal) => { + const actual = await importOriginal() -vi.mock('@/app/components/workflow/hooks/use-inspect-vars-crud', () => ({ + return { + ...actual, + useNodeDataUpdate: () => ({ + handleNodeDataUpdate: vi.fn(), + }), + } +}) + +vi.mock('../../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useIsChatMode: () => false, + useWorkflow: () => ({ + getBeforeNodesInSameBranch: () => [ + { + id: 'start', + data: { + type: 'start', + title: 'Start', + variables: [], + }, + }, + ], + getBeforeNodesInSameBranchIncludeParent: () => [ + { + id: 'start', + data: { + type: 'start', + title: 'Start', + variables: [], + }, + }, + ], + }), + } +}) + +vi.mock('../../../../hooks/use-inspect-vars-crud', () => ({ default: () => ({ appendNodeInspectVars: vi.fn(), invalidateSysVarValues: vi.fn(), diff --git a/web/app/components/workflow/nodes/_base/hooks/use-available-var-list.ts b/web/app/components/workflow/nodes/_base/hooks/use-available-var-list.ts index 7687a5f5502..bdd628d7459 100644 --- a/web/app/components/workflow/nodes/_base/hooks/use-available-var-list.ts +++ b/web/app/components/workflow/nodes/_base/hooks/use-available-var-list.ts @@ -1,11 +1,12 @@ import type { Node, NodeOutPutVar, ValueSelector, Var } from '@/app/components/workflow/types' import { useTranslation } from 'react-i18next' import { useSnippetDraftStore } from '@/app/components/snippets/draft-store' -import { useIsChatMode, useWorkflow, useWorkflowVariables } from '@/app/components/workflow/hooks' import { useHooksStore } from '@/app/components/workflow/hooks-store/store' import { useStore as useWorkflowStore } from '@/app/components/workflow/store' import { BlockEnum } from '@/app/components/workflow/types' import { FlowType } from '@/types/common' +import { useIsChatMode, useWorkflow } from '../../../hooks/use-workflow' +import { useWorkflowVariables } from '../../../hooks/use-workflow-variables' import { inputVarTypeToVarType } from '../../data-source/utils' import { appendSnippetInputFieldVars, diff --git a/web/app/components/workflow/nodes/_base/hooks/use-node-crud.ts b/web/app/components/workflow/nodes/_base/hooks/use-node-crud.ts index 7dcf6c237d9..7164803998e 100644 --- a/web/app/components/workflow/nodes/_base/hooks/use-node-crud.ts +++ b/web/app/components/workflow/nodes/_base/hooks/use-node-crud.ts @@ -1,6 +1,6 @@ import type { CommonNodeType } from '@/app/components/workflow/types' import { useCallback, useEffect, useRef } from 'react' -import { useNodeDataUpdate } from '@/app/components/workflow/hooks' +import { useNodeDataUpdate } from '../../../hooks/use-node-data-update' const useNodeCrud = (id: string, data: CommonNodeType) => { const { handleNodeDataUpdateWithSyncDraft } = useNodeDataUpdate() diff --git a/web/app/components/workflow/nodes/_base/hooks/use-node-help-link.ts b/web/app/components/workflow/nodes/_base/hooks/use-node-help-link.ts index d97a87bfba0..a52d1efb8c8 100644 --- a/web/app/components/workflow/nodes/_base/hooks/use-node-help-link.ts +++ b/web/app/components/workflow/nodes/_base/hooks/use-node-help-link.ts @@ -1,6 +1,6 @@ import type { BlockEnum } from '@/app/components/workflow/types' import { useMemo } from 'react' -import { useNodesMetaData } from '@/app/components/workflow/hooks' +import { useNodesMetaData } from '../../../hooks/use-nodes-meta-data' export const useNodeHelpLink = (nodeType: BlockEnum) => { const availableNodesMetaData = useNodesMetaData() diff --git a/web/app/components/workflow/nodes/_base/hooks/use-one-step-run.ts b/web/app/components/workflow/nodes/_base/hooks/use-one-step-run.ts index a1172a9181e..feab26bb1df 100644 --- a/web/app/components/workflow/nodes/_base/hooks/use-one-step-run.ts +++ b/web/app/components/workflow/nodes/_base/hooks/use-one-step-run.ts @@ -17,8 +17,6 @@ import { useTranslation } from 'react-i18next' import { useStoreApi } from 'reactflow' import { trackEvent } from '@/app/components/base/amplitude' import { getInputVars as doGetInputVars } from '@/app/components/base/prompt-editor/constants' -import { useIsChatMode, useNodeDataUpdate, useWorkflow } from '@/app/components/workflow/hooks' -import useInspectVarsCrud from '@/app/components/workflow/hooks/use-inspect-vars-crud' import { getNodeInfoById, isConversationVar, @@ -65,6 +63,9 @@ import { getLoopSingleNodeRunUrl, singleNodeRun, } from '@/service/workflow' +import useInspectVarsCrud from '../../../hooks/use-inspect-vars-crud' +import { useNodeDataUpdate } from '../../../hooks/use-node-data-update' +import { useIsChatMode, useWorkflow } from '../../../hooks/use-workflow' import useMatchSchemaType from '../components/variable/use-match-schema-type' const { checkValid: checkLLMValid } = LLMDefault diff --git a/web/app/components/workflow/nodes/_base/hooks/use-output-var-list.ts b/web/app/components/workflow/nodes/_base/hooks/use-output-var-list.ts index 589448e24fa..20727d2bdec 100644 --- a/web/app/components/workflow/nodes/_base/hooks/use-output-var-list.ts +++ b/web/app/components/workflow/nodes/_base/hooks/use-output-var-list.ts @@ -3,11 +3,11 @@ import type { ValueSelector } from '@/app/components/workflow/types' import { useBoolean, useDebounceFn } from 'ahooks' import { produce } from 'immer' import { useCallback, useRef, useState } from 'react' -import { useWorkflow } from '@/app/components/workflow/hooks' import { ErrorHandleTypeEnum } from '@/app/components/workflow/nodes/_base/components/error-handle/types' import { getDefaultValue } from '@/app/components/workflow/nodes/_base/components/error-handle/utils' import { BlockEnum, VarType } from '@/app/components/workflow/types' import useInspectVarsCrud from '../../../hooks/use-inspect-vars-crud' +import { useWorkflow } from '../../../hooks/use-workflow' type Params = { id: string diff --git a/web/app/components/workflow/nodes/_base/node.tsx b/web/app/components/workflow/nodes/_base/node.tsx index fc317f89b93..7f129e531c3 100644 --- a/web/app/components/workflow/nodes/_base/node.tsx +++ b/web/app/components/workflow/nodes/_base/node.tsx @@ -9,9 +9,6 @@ import { UserAvatarList } from '@/app/components/base/user-avatar-list' import BlockIcon from '@/app/components/workflow/block-icon' import { ToolType } from '@/app/components/workflow/block-selector/types' import { useCollaboration } from '@/app/components/workflow/collaboration/hooks/use-collaboration' -import { useNodesReadOnly, useToolIcon } from '@/app/components/workflow/hooks' -import useInspectVarsCrud from '@/app/components/workflow/hooks/use-inspect-vars-crud' -import { useNodePluginInstallation } from '@/app/components/workflow/hooks/use-node-plugin-installation' import { useNodeIterationInteractions } from '@/app/components/workflow/nodes/iteration/use-interactions' import { useNodeLoopInteractions } from '@/app/components/workflow/nodes/loop/use-interactions' import CopyID from '@/app/components/workflow/nodes/tool/components/copy-id' @@ -19,6 +16,10 @@ import { useStore } from '@/app/components/workflow/store' import { BlockEnum, ControlMode, NodeRunningStatus } from '@/app/components/workflow/types' import { hasErrorHandleNode, hasRetryNode } from '@/app/components/workflow/utils' import { userProfileAtom } from '@/context/account-state' +import useInspectVarsCrud from '../../hooks/use-inspect-vars-crud' +import { useNodePluginInstallation } from '../../hooks/use-node-plugin-installation' +import { useToolIcon } from '../../hooks/use-tool-icon' +import { useNodesReadOnly } from '../../hooks/use-workflow' import { selectWorkflowNode } from '../../utils/node-navigation' import AddVariablePopupWithPosition from './components/add-variable-popup-with-position' import EntryNodeContainer, { StartNodeTypeEnum } from './components/entry-node-container' diff --git a/web/app/components/workflow/nodes/agent-v2/__tests__/panel.spec.tsx b/web/app/components/workflow/nodes/agent-v2/__tests__/panel.spec.tsx index aba83d5bc83..6a722f72abb 100644 --- a/web/app/components/workflow/nodes/agent-v2/__tests__/panel.spec.tsx +++ b/web/app/components/workflow/nodes/agent-v2/__tests__/panel.spec.tsx @@ -309,13 +309,26 @@ vi.mock('../../_base/hooks/use-available-var-list', () => ({ }), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodeDataUpdate: () => ({ - handleNodeDataUpdate: mockHandleNodeDataUpdate, - handleNodeDataUpdateWithSyncDraft: mockHandleNodeDataUpdateWithSyncDraft, - }), - useWorkflowVariableType: () => vi.fn(), -})) +vi.mock('../../../hooks/use-node-data-update', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodeDataUpdate: () => ({ + handleNodeDataUpdate: mockHandleNodeDataUpdate, + handleNodeDataUpdateWithSyncDraft: mockHandleNodeDataUpdateWithSyncDraft, + }), + } +}) + +vi.mock('../../../hooks/use-workflow-variables', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflowVariableType: () => vi.fn(), + } +}) vi.mock('@/app/components/workflow/hooks-store', () => ({ useHooksStore: (selector: (state: { configsMap: typeof mockConfigsMap }) => unknown) => diff --git a/web/app/components/workflow/nodes/agent-v2/agent-soul-config.ts b/web/app/components/workflow/nodes/agent-v2/agent-soul-config.ts index 4360a719a59..64fef972ff5 100644 --- a/web/app/components/workflow/nodes/agent-v2/agent-soul-config.ts +++ b/web/app/components/workflow/nodes/agent-v2/agent-soul-config.ts @@ -9,7 +9,6 @@ import isEqual from 'fast-deep-equal' import { useStore as useJotaiStore, useSetAtom } from 'jotai' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useHooksStore } from '@/app/components/workflow/hooks-store' -import { useSerialAsyncCallback } from '@/app/components/workflow/hooks/use-serial-async-callback' import { agentSoulConfigToFormState, formStateToAgentSoulConfig, @@ -22,6 +21,7 @@ import { } from '@/features/agent-v2/agent-composer/store' import { consoleQuery } from '@/service/client' import { FlowType } from '@/types/common' +import { useSerialAsyncCallback } from '../../hooks/use-serial-async-callback' const DRAFT_AUTOSAVE_WAIT = 5000 diff --git a/web/app/components/workflow/nodes/agent-v2/components/agent-task-field.tsx b/web/app/components/workflow/nodes/agent-v2/components/agent-task-field.tsx index 9df4317ffb4..86457d4e12b 100644 --- a/web/app/components/workflow/nodes/agent-v2/components/agent-task-field.tsx +++ b/web/app/components/workflow/nodes/agent-v2/components/agent-task-field.tsx @@ -12,7 +12,7 @@ import { useTranslation } from 'react-i18next' import { Infotip } from '@/app/components/base/infotip' import PromptEditor from '@/app/components/base/prompt-editor' import { $createCustomTextNode } from '@/app/components/base/prompt-editor/plugins/custom-text/node' -import { useWorkflowVariableType } from '../../../hooks' +import { useWorkflowVariableType } from '../../../hooks/use-workflow-variables' import { BlockEnum } from '../../../types' import useAvailableVarList from '../../_base/hooks/use-available-var-list' diff --git a/web/app/components/workflow/nodes/agent-v2/panel.tsx b/web/app/components/workflow/nodes/agent-v2/panel.tsx index ced3ebdf092..893b1abf1b7 100644 --- a/web/app/components/workflow/nodes/agent-v2/panel.tsx +++ b/web/app/components/workflow/nodes/agent-v2/panel.tsx @@ -17,11 +17,11 @@ import { extractAgentOutputNames, replaceAgentOutputName, } from '@/app/components/base/prompt-editor/plugins/agent-output-block/utils' -import { useNodeDataUpdate } from '@/app/components/workflow/hooks' import { useHooksStore } from '@/app/components/workflow/hooks-store' import { useStore } from '@/app/components/workflow/store' import { consoleQuery } from '@/service/client' import { FlowType } from '@/types/common' +import { useNodeDataUpdate } from '../../hooks/use-node-data-update' import useNodeCrud from '../_base/hooks/use-node-crud' import { WorkflowInlineAgentConfigureWorkspace, diff --git a/web/app/components/workflow/nodes/agent/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/agent/__tests__/use-config.spec.ts index e6efc7981a2..4013aa34dd6 100644 --- a/web/app/components/workflow/nodes/agent/__tests__/use-config.spec.ts +++ b/web/app/components/workflow/nodes/agent/__tests__/use-config.spec.ts @@ -17,10 +17,15 @@ const mockUseCheckInstalled = vi.hoisted(() => vi.fn()) const mockGenerateAgentToolValue = vi.hoisted(() => vi.fn()) const mockToolParametersToFormSchemas = vi.hoisted(() => vi.fn()) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: (...args: unknown[]) => mockUseNodesReadOnly(...args), - useIsChatMode: (...args: unknown[]) => mockUseIsChatMode(...args), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: (...args: unknown[]) => mockUseNodesReadOnly(...args), + useIsChatMode: (...args: unknown[]) => mockUseIsChatMode(...args), + } +}) vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({ __esModule: true, diff --git a/web/app/components/workflow/nodes/agent/use-config.ts b/web/app/components/workflow/nodes/agent/use-config.ts index 790fc9d9fae..138e7e9589e 100644 --- a/web/app/components/workflow/nodes/agent/use-config.ts +++ b/web/app/components/workflow/nodes/agent/use-config.ts @@ -8,9 +8,9 @@ import { generateAgentToolValue, toolParametersToFormSchemas, } from '@/app/components/tools/utils/to-form-schema' -import { useIsChatMode, useNodesReadOnly } from '@/app/components/workflow/hooks' import { useCheckInstalled, useFetchPluginsInMarketPlaceByIds } from '@/service/use-plugins' import { useStrategyProviderDetail } from '@/service/use-strategy' +import { useIsChatMode, useNodesReadOnly } from '../../hooks/use-workflow' import { VarType as VarKindType } from '../../types' import useAvailableVarList from '../_base/hooks/use-available-var-list' import useNodeCrud from '../_base/hooks/use-node-crud' diff --git a/web/app/components/workflow/nodes/answer/__tests__/node.spec.tsx b/web/app/components/workflow/nodes/answer/__tests__/node.spec.tsx index a2ecc6cf429..0c3eb3ccfd6 100644 --- a/web/app/components/workflow/nodes/answer/__tests__/node.spec.tsx +++ b/web/app/components/workflow/nodes/answer/__tests__/node.spec.tsx @@ -2,12 +2,13 @@ import type { AnswerNodeType } from '../types' import { screen } from '@testing-library/react' import { createNode } from '@/app/components/workflow/__tests__/fixtures' import { renderNodeComponent } from '@/app/components/workflow/__tests__/workflow-test-env' -import { useWorkflow } from '@/app/components/workflow/hooks' import { BlockEnum } from '@/app/components/workflow/types' +import { useWorkflow } from '../../../hooks/use-workflow' import Node from '../node' -vi.mock('@/app/components/workflow/hooks', async (importOriginal) => { - const actual = await importOriginal() +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + return { ...actual, useWorkflow: vi.fn(), diff --git a/web/app/components/workflow/nodes/answer/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/answer/__tests__/use-config.spec.ts index f0b0b074ae3..fdb531bc553 100644 --- a/web/app/components/workflow/nodes/answer/__tests__/use-config.spec.ts +++ b/web/app/components/workflow/nodes/answer/__tests__/use-config.spec.ts @@ -7,9 +7,14 @@ const mockUseNodesReadOnly = vi.hoisted(() => vi.fn()) const mockUseNodeCrud = vi.hoisted(() => vi.fn()) const mockUseVarList = vi.hoisted(() => vi.fn()) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: () => mockUseNodesReadOnly(), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: () => mockUseNodesReadOnly(), + } +}) vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({ __esModule: true, diff --git a/web/app/components/workflow/nodes/answer/use-config.ts b/web/app/components/workflow/nodes/answer/use-config.ts index e62e17354b7..59c0f0a4083 100644 --- a/web/app/components/workflow/nodes/answer/use-config.ts +++ b/web/app/components/workflow/nodes/answer/use-config.ts @@ -2,8 +2,8 @@ import type { Var } from '../../types' import type { AnswerNodeType } from './types' import { produce } from 'immer' import { useCallback } from 'react' -import { useNodesReadOnly } from '@/app/components/workflow/hooks' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' +import { useNodesReadOnly } from '../../hooks/use-workflow' import { VarType } from '../../types' import useVarList from '../_base/hooks/use-var-list' diff --git a/web/app/components/workflow/nodes/assigner/__tests__/use-config.spec.tsx b/web/app/components/workflow/nodes/assigner/__tests__/use-config.spec.tsx index 3a97d63731c..8a94ecb4f5a 100644 --- a/web/app/components/workflow/nodes/assigner/__tests__/use-config.spec.tsx +++ b/web/app/components/workflow/nodes/assigner/__tests__/use-config.spec.tsx @@ -9,18 +9,31 @@ const mockSetInputs = vi.hoisted(() => vi.fn()) const mockGetAvailableVars = vi.hoisted(() => vi.fn()) const mockGetCurrentVariableType = vi.hoisted(() => vi.fn()) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: () => ({ nodesReadOnly: false }), - useIsChatMode: () => false, - useWorkflow: () => ({ - getBeforeNodesInSameBranchIncludeParent: () => [ - { id: 'start-node', data: { title: 'Start', type: BlockEnum.Start } }, - ], - }), - useWorkflowVariables: () => ({ - getCurrentVariableType: (...args: unknown[]) => mockGetCurrentVariableType(...args), - }), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: () => ({ nodesReadOnly: false }), + useIsChatMode: () => false, + useWorkflow: () => ({ + getBeforeNodesInSameBranchIncludeParent: () => [ + { id: 'start-node', data: { title: 'Start', type: BlockEnum.Start } }, + ], + }), + } +}) + +vi.mock('../../../hooks/use-workflow-variables', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflowVariables: () => ({ + getCurrentVariableType: (...args: unknown[]) => mockGetCurrentVariableType(...args), + }), + } +}) vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({ ...createNodeCrudModuleMock(mockSetInputs), diff --git a/web/app/components/workflow/nodes/assigner/components/var-list/__tests__/index.spec.tsx b/web/app/components/workflow/nodes/assigner/components/var-list/__tests__/index.spec.tsx index d05a9a83881..e8401c19d33 100644 --- a/web/app/components/workflow/nodes/assigner/components/var-list/__tests__/index.spec.tsx +++ b/web/app/components/workflow/nodes/assigner/components/var-list/__tests__/index.spec.tsx @@ -7,18 +7,32 @@ import { BlockEnum, VarType } from '@/app/components/workflow/types' import { AssignerNodeInputType, WriteMode } from '../../../types' import VarList from '../index' -vi.mock('@/app/components/workflow/hooks', () => ({ - useIsChatMode: () => false, - useWorkflow: () => ({ - getTreeLeafNodes: () => [], - getNodeById: () => undefined, - getBeforeNodesInSameBranchIncludeParent: () => [], - }), - useWorkflowVariables: () => ({ - getNodeAvailableVars: () => [], - getCurrentVariableType: () => undefined, - }), -})) +vi.mock('../../../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useIsChatMode: () => false, + useWorkflow: () => ({ + getTreeLeafNodes: () => [], + getNodeById: () => undefined, + getBeforeNodesInSameBranchIncludeParent: () => [], + }), + } +}) + +vi.mock('../../../../../hooks/use-workflow-variables', async (importOriginal) => { + const actual = + await importOriginal() + + return { + ...actual, + useWorkflowVariables: () => ({ + getNodeAvailableVars: () => [], + getCurrentVariableType: () => undefined, + }), + } +}) const sourceNode = createNode({ id: 'node-a', diff --git a/web/app/components/workflow/nodes/assigner/hooks.ts b/web/app/components/workflow/nodes/assigner/hooks.ts index e2d5508492f..9fa942064d4 100644 --- a/web/app/components/workflow/nodes/assigner/hooks.ts +++ b/web/app/components/workflow/nodes/assigner/hooks.ts @@ -2,7 +2,8 @@ import type { Node, Var } from '../../types' import { uniqBy } from 'es-toolkit/compat' import { useCallback } from 'react' import { useNodes } from 'reactflow' -import { useIsChatMode, useWorkflow, useWorkflowVariables } from '../../hooks' +import { useIsChatMode, useWorkflow } from '../../hooks/use-workflow' +import { useWorkflowVariables } from '../../hooks/use-workflow-variables' import { AssignerNodeInputType, WriteMode } from './types' export const useGetAvailableVars = () => { diff --git a/web/app/components/workflow/nodes/assigner/use-config.ts b/web/app/components/workflow/nodes/assigner/use-config.ts index 50015be77c1..c582fcaefb8 100644 --- a/web/app/components/workflow/nodes/assigner/use-config.ts +++ b/web/app/components/workflow/nodes/assigner/use-config.ts @@ -2,13 +2,9 @@ import type { ValueSelector, Var } from '../../types' import type { AssignerNodeOperation, AssignerNodeType } from './types' import { useCallback, useMemo } from 'react' import { useStoreApi } from 'reactflow' -import { - useIsChatMode, - useNodesReadOnly, - useWorkflow, - useWorkflowVariables, -} from '@/app/components/workflow/hooks' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' +import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow' +import { useWorkflowVariables } from '../../hooks/use-workflow-variables' import { useGetAvailableVars } from './hooks' import { WriteMode, writeModeTypesNum } from './types' import { diff --git a/web/app/components/workflow/nodes/code/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/code/__tests__/use-config.spec.ts index b77f7ad26d7..3f1dc0a4c0e 100644 --- a/web/app/components/workflow/nodes/code/__tests__/use-config.spec.ts +++ b/web/app/components/workflow/nodes/code/__tests__/use-config.spec.ts @@ -1,19 +1,24 @@ import type { CodeNodeType, OutputVar } from '../types' import type { Var, Variable } from '@/app/components/workflow/types' import { act, renderHook, waitFor } from '@testing-library/react' -import { useNodesReadOnly } from '@/app/components/workflow/hooks' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { useStore } from '@/app/components/workflow/store' import { BlockEnum, VarType } from '@/app/components/workflow/types' import { fetchNodeDefault, fetchPipelineNodeDefault } from '@/service/workflow' +import { useNodesReadOnly } from '../../../hooks/use-workflow' import useOutputVarList from '../../_base/hooks/use-output-var-list' import useVarList from '../../_base/hooks/use-var-list' import { CodeLanguage } from '../types' import useConfig from '../use-config' -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: vi.fn(), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: vi.fn(), + } +}) vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({ __esModule: true, diff --git a/web/app/components/workflow/nodes/code/use-config.ts b/web/app/components/workflow/nodes/code/use-config.ts index c413696f320..ea56af2c2bb 100644 --- a/web/app/components/workflow/nodes/code/use-config.ts +++ b/web/app/components/workflow/nodes/code/use-config.ts @@ -2,9 +2,9 @@ import type { Var, Variable } from '../../types' import type { CodeNodeType, OutputVar } from './types' import { produce } from 'immer' import { useCallback, useEffect, useState } from 'react' -import { useNodesReadOnly } from '@/app/components/workflow/hooks' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { fetchNodeDefault, fetchPipelineNodeDefault } from '@/service/workflow' +import { useNodesReadOnly } from '../../hooks/use-workflow' import { useStore } from '../../store' import { BlockEnum, VarType } from '../../types' import useOutputVarList from '../_base/hooks/use-output-var-list' diff --git a/web/app/components/workflow/nodes/data-source-empty/hooks.ts b/web/app/components/workflow/nodes/data-source-empty/hooks.ts index 6973e94b143..a69bb5a0909 100644 --- a/web/app/components/workflow/nodes/data-source-empty/hooks.ts +++ b/web/app/components/workflow/nodes/data-source-empty/hooks.ts @@ -1,9 +1,9 @@ import type { OnSelectBlock } from '@/app/components/workflow/types' import { produce } from 'immer' import { useCallback } from 'react' -import { useNodesMetaData } from '@/app/components/workflow/hooks' -import { useCollaborativeWorkflow } from '@/app/components/workflow/hooks/use-collaborative-workflow' import { generateNewNode } from '@/app/components/workflow/utils' +import { useCollaborativeWorkflow } from '../../hooks/use-collaborative-workflow' +import { useNodesMetaData } from '../../hooks/use-nodes-meta-data' export const useReplaceDataSourceNode = (id: string) => { const collaborativeWorkflow = useCollaborativeWorkflow() diff --git a/web/app/components/workflow/nodes/data-source/__tests__/node.spec.tsx b/web/app/components/workflow/nodes/data-source/__tests__/node.spec.tsx index a7b708d1d16..3f2b90798a7 100644 --- a/web/app/components/workflow/nodes/data-source/__tests__/node.spec.tsx +++ b/web/app/components/workflow/nodes/data-source/__tests__/node.spec.tsx @@ -1,7 +1,7 @@ import type { DataSourceNodeType } from '../types' import { render, screen } from '@testing-library/react' -import { useNodePluginInstallation } from '@/app/components/workflow/hooks/use-node-plugin-installation' import { BlockEnum } from '@/app/components/workflow/types' +import { useNodePluginInstallation } from '../../../hooks/use-node-plugin-installation' import Node from '../node' const mockInstallPluginButton = vi.hoisted(() => @@ -10,7 +10,7 @@ const mockInstallPluginButton = vi.hoisted(() => )), ) -vi.mock('@/app/components/workflow/hooks/use-node-plugin-installation', () => ({ +vi.mock('../../../hooks/use-node-plugin-installation', () => ({ useNodePluginInstallation: vi.fn(), })) diff --git a/web/app/components/workflow/nodes/data-source/__tests__/panel.spec.tsx b/web/app/components/workflow/nodes/data-source/__tests__/panel.spec.tsx index 93484f38bd2..cce6f97fdd3 100644 --- a/web/app/components/workflow/nodes/data-source/__tests__/panel.spec.tsx +++ b/web/app/components/workflow/nodes/data-source/__tests__/panel.spec.tsx @@ -3,9 +3,9 @@ import type { DataSourceNodeType } from '../types' import type { NodePanelProps } from '@/app/components/workflow/types' import { fireEvent, render, screen } from '@testing-library/react' import { toolParametersToFormSchemas } from '@/app/components/tools/utils/to-form-schema' -import { useNodesReadOnly } from '@/app/components/workflow/hooks' import { useStore } from '@/app/components/workflow/store' import { BlockEnum, VarType } from '@/app/components/workflow/types' +import { useNodesReadOnly } from '../../../hooks/use-workflow' import useMatchSchemaType, { getMatchedSchemaType, } from '../../_base/components/variable/use-match-schema-type' @@ -36,9 +36,14 @@ vi.mock('@/app/components/tools/utils/to-form-schema', () => ({ toolParametersToFormSchemas: vi.fn(), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: vi.fn(), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: vi.fn(), + } +}) vi.mock('@/app/components/workflow/store', () => ({ useStore: vi.fn(), diff --git a/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-before-run-form.branches.spec.tsx b/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-before-run-form.branches.spec.tsx index bb72164938a..bb05f8dc2a3 100644 --- a/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-before-run-form.branches.spec.tsx +++ b/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-before-run-form.branches.spec.tsx @@ -12,7 +12,8 @@ import { useDatasourceSingleRun } from '@/service/use-pipeline' import { useInvalidLastRun } from '@/service/use-workflow' import { fetchNodeInspectVars } from '@/service/workflow' import { FlowType } from '@/types/common' -import { useNodeDataUpdate, useNodesSyncDraft } from '../../../../hooks' +import { useNodeDataUpdate } from '../../../../hooks/use-node-data-update' +import { useNodesSyncDraft } from '../../../../hooks/use-nodes-sync-draft' import useBeforeRunForm from '../use-before-run-form' type DataSourceStoreState = { @@ -58,10 +59,23 @@ vi.mock('reactflow', async () => { } }) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodeDataUpdate: vi.fn(), - useNodesSyncDraft: vi.fn(), -})) +vi.mock('../../../../hooks/use-node-data-update', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodeDataUpdate: vi.fn(), + } +}) + +vi.mock('../../../../hooks/use-nodes-sync-draft', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesSyncDraft: vi.fn(), + } +}) vi.mock('@/service/use-pipeline', () => ({ useDatasourceSingleRun: vi.fn(), diff --git a/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-before-run-form.spec.tsx b/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-before-run-form.spec.tsx index 971601a6ba6..9c73404978a 100644 --- a/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-before-run-form.spec.tsx +++ b/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-before-run-form.spec.tsx @@ -13,7 +13,8 @@ import { useInvalidLastRun } from '@/service/use-workflow' import { fetchNodeInspectVars } from '@/service/workflow' import { TransferMethod } from '@/types/app' import { FlowType } from '@/types/common' -import { useNodeDataUpdate, useNodesSyncDraft } from '../../../../hooks' +import { useNodeDataUpdate } from '../../../../hooks/use-node-data-update' +import { useNodesSyncDraft } from '../../../../hooks/use-nodes-sync-draft' import useBeforeRunForm from '../use-before-run-form' type DataSourceStoreState = { @@ -59,10 +60,23 @@ vi.mock('reactflow', async () => { } }) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodeDataUpdate: vi.fn(), - useNodesSyncDraft: vi.fn(), -})) +vi.mock('../../../../hooks/use-node-data-update', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodeDataUpdate: vi.fn(), + } +}) + +vi.mock('../../../../hooks/use-nodes-sync-draft', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesSyncDraft: vi.fn(), + } +}) vi.mock('@/service/use-pipeline', () => ({ useDatasourceSingleRun: vi.fn(), diff --git a/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-config.spec.ts index 7c9b58ca5f7..73937c024bd 100644 --- a/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-config.spec.ts +++ b/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-config.spec.ts @@ -10,9 +10,14 @@ vi.mock('reactflow', () => ({ useStoreApi: () => mockUseStoreApi(), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodeDataUpdate: () => mockUseNodeDataUpdate(), -})) +vi.mock('../../../../hooks/use-node-data-update', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodeDataUpdate: () => mockUseNodeDataUpdate(), + } +}) const createNode = ( overrides: Partial = {}, diff --git a/web/app/components/workflow/nodes/data-source/hooks/use-before-run-form.ts b/web/app/components/workflow/nodes/data-source/hooks/use-before-run-form.ts index 7db7f958257..9489071ff44 100644 --- a/web/app/components/workflow/nodes/data-source/hooks/use-before-run-form.ts +++ b/web/app/components/workflow/nodes/data-source/hooks/use-before-run-form.ts @@ -13,7 +13,8 @@ import { useInvalidLastRun } from '@/service/use-workflow' import { fetchNodeInspectVars } from '@/service/workflow' import { TransferMethod } from '@/types/app' import { FlowType } from '@/types/common' -import { useNodeDataUpdate, useNodesSyncDraft } from '../../../hooks' +import { useNodeDataUpdate } from '../../../hooks/use-node-data-update' +import { useNodesSyncDraft } from '../../../hooks/use-nodes-sync-draft' import { NodeRunningStatus } from '../../../types' const useBeforeRunForm = ({ diff --git a/web/app/components/workflow/nodes/data-source/hooks/use-config.ts b/web/app/components/workflow/nodes/data-source/hooks/use-config.ts index 0f4484d2bf0..b4904b37612 100644 --- a/web/app/components/workflow/nodes/data-source/hooks/use-config.ts +++ b/web/app/components/workflow/nodes/data-source/hooks/use-config.ts @@ -1,7 +1,7 @@ import type { DataSourceNodeType, ToolVarInputs } from '../types' import { useCallback, useEffect, useMemo } from 'react' import { useStoreApi } from 'reactflow' -import { useNodeDataUpdate } from '@/app/components/workflow/hooks' +import { useNodeDataUpdate } from '../../../hooks/use-node-data-update' export const useConfig = (id: string, dataSourceList?: any[]) => { const store = useStoreApi() diff --git a/web/app/components/workflow/nodes/data-source/node.tsx b/web/app/components/workflow/nodes/data-source/node.tsx index c2c430402f9..9d5aa65a7c7 100644 --- a/web/app/components/workflow/nodes/data-source/node.tsx +++ b/web/app/components/workflow/nodes/data-source/node.tsx @@ -2,8 +2,8 @@ import type { FC } from 'react' import type { DataSourceNodeType } from './types' import type { NodeProps } from '@/app/components/workflow/types' import { memo } from 'react' -import { useNodePluginInstallation } from '@/app/components/workflow/hooks/use-node-plugin-installation' import { InstallPluginButton } from '@/app/components/workflow/nodes/_base/components/install-plugin-button' +import { useNodePluginInstallation } from '../../hooks/use-node-plugin-installation' const Node: FC> = ({ data }) => { const { isChecking, isMissing, uniqueIdentifier, canInstall, onInstallSuccess } = diff --git a/web/app/components/workflow/nodes/data-source/panel.tsx b/web/app/components/workflow/nodes/data-source/panel.tsx index 9d9f10dc016..8a9abf4d7a3 100644 --- a/web/app/components/workflow/nodes/data-source/panel.tsx +++ b/web/app/components/workflow/nodes/data-source/panel.tsx @@ -5,12 +5,12 @@ import { memo, useMemo } from 'react' import { useTranslation } from 'react-i18next' import TagInput from '@/app/components/base/tag-input' import { toolParametersToFormSchemas } from '@/app/components/tools/utils/to-form-schema' -import { useNodesReadOnly } from '@/app/components/workflow/hooks' import { BoxGroupField } from '@/app/components/workflow/nodes/_base/components/layout' import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars' import StructureOutputItem from '@/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/show' import { useStore } from '@/app/components/workflow/store' import { wrapStructuredVarItem } from '@/app/components/workflow/utils/tool' +import { useNodesReadOnly } from '../../hooks/use-workflow' import useMatchSchemaType, { getMatchedSchemaType, } from '../_base/components/variable/use-match-schema-type' diff --git a/web/app/components/workflow/nodes/document-extractor/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/document-extractor/__tests__/use-config.spec.ts index a86e9c194ea..e181164fa73 100644 --- a/web/app/components/workflow/nodes/document-extractor/__tests__/use-config.spec.ts +++ b/web/app/components/workflow/nodes/document-extractor/__tests__/use-config.spec.ts @@ -1,14 +1,10 @@ import type { DocExtractorNodeType } from '../types' import { renderHook } from '@testing-library/react' import { useStoreApi } from 'reactflow' -import { - useIsChatMode, - useNodesReadOnly, - useWorkflow, - useWorkflowVariables, -} from '@/app/components/workflow/hooks' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { BlockEnum, VarType } from '@/app/components/workflow/types' +import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../../hooks/use-workflow' +import { useWorkflowVariables } from '../../../hooks/use-workflow-variables' import useConfig from '../use-config' const mockUseStoreApi = vi.mocked(useStoreApi) @@ -26,12 +22,25 @@ vi.mock('reactflow', async () => { } }) -vi.mock('@/app/components/workflow/hooks', () => ({ - useIsChatMode: vi.fn(), - useNodesReadOnly: vi.fn(), - useWorkflow: vi.fn(), - useWorkflowVariables: vi.fn(), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useIsChatMode: vi.fn(), + useNodesReadOnly: vi.fn(), + useWorkflow: vi.fn(), + } +}) + +vi.mock('../../../hooks/use-workflow-variables', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflowVariables: vi.fn(), + } +}) vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({ __esModule: true, diff --git a/web/app/components/workflow/nodes/document-extractor/use-config.ts b/web/app/components/workflow/nodes/document-extractor/use-config.ts index 9ad307cbd94..a54a310f132 100644 --- a/web/app/components/workflow/nodes/document-extractor/use-config.ts +++ b/web/app/components/workflow/nodes/document-extractor/use-config.ts @@ -3,13 +3,9 @@ import type { DocExtractorNodeType } from './types' import { produce } from 'immer' import { useCallback, useMemo } from 'react' import { useStoreApi } from 'reactflow' -import { - useIsChatMode, - useNodesReadOnly, - useWorkflow, - useWorkflowVariables, -} from '@/app/components/workflow/hooks' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' +import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow' +import { useWorkflowVariables } from '../../hooks/use-workflow-variables' import { VarType } from '../../types' const useConfig = (id: string, payload: DocExtractorNodeType) => { diff --git a/web/app/components/workflow/nodes/end/__tests__/node.spec.tsx b/web/app/components/workflow/nodes/end/__tests__/node.spec.tsx index 988143b7c0e..87c1050eda2 100644 --- a/web/app/components/workflow/nodes/end/__tests__/node.spec.tsx +++ b/web/app/components/workflow/nodes/end/__tests__/node.spec.tsx @@ -2,20 +2,30 @@ import type { EndNodeType } from '../types' import { screen } from '@testing-library/react' import { createNode, createStartNode } from '@/app/components/workflow/__tests__/fixtures' import { renderNodeComponent } from '@/app/components/workflow/__tests__/workflow-test-env' -import { useIsChatMode, useWorkflow, useWorkflowVariables } from '@/app/components/workflow/hooks' import { BlockEnum } from '@/app/components/workflow/types' +import { useIsChatMode, useWorkflow } from '../../../hooks/use-workflow' +import { useWorkflowVariables } from '../../../hooks/use-workflow-variables' import Node from '../node' -vi.mock('@/app/components/workflow/hooks', async (importOriginal) => { - const actual = await importOriginal() +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + return { ...actual, useWorkflow: vi.fn(), - useWorkflowVariables: vi.fn(), useIsChatMode: vi.fn(), } }) +vi.mock('../../../hooks/use-workflow-variables', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflowVariables: vi.fn(), + } +}) + const mockUseWorkflow = vi.mocked(useWorkflow) const mockUseWorkflowVariables = vi.mocked(useWorkflowVariables) const mockUseIsChatMode = vi.mocked(useIsChatMode) diff --git a/web/app/components/workflow/nodes/end/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/end/__tests__/use-config.spec.ts index 1ea561177e6..479296bb08d 100644 --- a/web/app/components/workflow/nodes/end/__tests__/use-config.spec.ts +++ b/web/app/components/workflow/nodes/end/__tests__/use-config.spec.ts @@ -7,9 +7,14 @@ const mockUseNodesReadOnly = vi.hoisted(() => vi.fn()) const mockUseNodeCrud = vi.hoisted(() => vi.fn()) const mockUseVarList = vi.hoisted(() => vi.fn()) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: () => mockUseNodesReadOnly(), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: () => mockUseNodesReadOnly(), + } +}) vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({ __esModule: true, diff --git a/web/app/components/workflow/nodes/end/node.tsx b/web/app/components/workflow/nodes/end/node.tsx index 95374c96312..cc93492ce15 100644 --- a/web/app/components/workflow/nodes/end/node.tsx +++ b/web/app/components/workflow/nodes/end/node.tsx @@ -2,9 +2,10 @@ import type { FC } from 'react' import type { EndNodeType } from './types' import type { NodeProps, Variable } from '@/app/components/workflow/types' import * as React from 'react' -import { useIsChatMode, useWorkflow, useWorkflowVariables } from '@/app/components/workflow/hooks' import { VariableLabelInNode } from '@/app/components/workflow/nodes/_base/components/variable/variable-label' import { BlockEnum } from '@/app/components/workflow/types' +import { useIsChatMode, useWorkflow } from '../../hooks/use-workflow' +import { useWorkflowVariables } from '../../hooks/use-workflow-variables' const Node: FC> = ({ id, data }) => { const { getBeforeNodesInSameBranch } = useWorkflow() diff --git a/web/app/components/workflow/nodes/end/use-config.ts b/web/app/components/workflow/nodes/end/use-config.ts index 93a60e620b7..6aeb96daa7f 100644 --- a/web/app/components/workflow/nodes/end/use-config.ts +++ b/web/app/components/workflow/nodes/end/use-config.ts @@ -1,6 +1,6 @@ import type { EndNodeType } from './types' -import { useNodesReadOnly } from '@/app/components/workflow/hooks' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' +import { useNodesReadOnly } from '../../hooks/use-workflow' import useVarList from '../_base/hooks/use-var-list' const useConfig = (id: string, payload: EndNodeType) => { diff --git a/web/app/components/workflow/nodes/http/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/http/__tests__/use-config.spec.ts index 6105326ab2d..cf134b7f16e 100644 --- a/web/app/components/workflow/nodes/http/__tests__/use-config.spec.ts +++ b/web/app/components/workflow/nodes/http/__tests__/use-config.spec.ts @@ -1,17 +1,22 @@ import type { HttpNodeType } from '../types' import { act, renderHook, waitFor } from '@testing-library/react' -import { useNodesReadOnly } from '@/app/components/workflow/hooks' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { useStore } from '@/app/components/workflow/store' import { BlockEnum, VarType } from '@/app/components/workflow/types' +import { useNodesReadOnly } from '../../../hooks/use-workflow' import useVarList from '../../_base/hooks/use-var-list' import useKeyValueList from '../hooks/use-key-value-list' import { APIType, AuthorizationType, BodyPayloadValueType, BodyType, Method } from '../types' import useConfig from '../use-config' -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: vi.fn(), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: vi.fn(), + } +}) vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({ __esModule: true, diff --git a/web/app/components/workflow/nodes/http/components/__tests__/curl-panel.spec.tsx b/web/app/components/workflow/nodes/http/components/__tests__/curl-panel.spec.tsx index b31e2e7840a..f71af79238a 100644 --- a/web/app/components/workflow/nodes/http/components/__tests__/curl-panel.spec.tsx +++ b/web/app/components/workflow/nodes/http/components/__tests__/curl-panel.spec.tsx @@ -10,11 +10,16 @@ const { mockHandleNodeSelect, mockToastError } = vi.hoisted(() => ({ mockToastError: vi.fn(), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesInteractions: () => ({ - handleNodeSelect: mockHandleNodeSelect, - }), -})) +vi.mock('../../../../hooks/use-nodes-interactions', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesInteractions: () => ({ + handleNodeSelect: mockHandleNodeSelect, + }), + } +}) vi.mock('@langgenius/dify-ui/toast', () => ({ toast: { diff --git a/web/app/components/workflow/nodes/http/components/curl-panel.tsx b/web/app/components/workflow/nodes/http/components/curl-panel.tsx index e23a374f2ea..d1740095147 100644 --- a/web/app/components/workflow/nodes/http/components/curl-panel.tsx +++ b/web/app/components/workflow/nodes/http/components/curl-panel.tsx @@ -8,7 +8,7 @@ import { toast } from '@langgenius/dify-ui/toast' import * as React from 'react' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' -import { useNodesInteractions } from '@/app/components/workflow/hooks' +import { useNodesInteractions } from '../../../hooks/use-nodes-interactions' import { parseCurl } from './curl-parser' type Props = Readonly<{ diff --git a/web/app/components/workflow/nodes/http/use-config.ts b/web/app/components/workflow/nodes/http/use-config.ts index 8e745fa4192..7718f5ead61 100644 --- a/web/app/components/workflow/nodes/http/use-config.ts +++ b/web/app/components/workflow/nodes/http/use-config.ts @@ -3,8 +3,8 @@ import type { Authorization, Body, HttpNodeType, Method, Timeout } from './types import { useBoolean } from 'ahooks' import { produce } from 'immer' import { useCallback, useEffect, useState } from 'react' -import { useNodesReadOnly } from '@/app/components/workflow/hooks' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' +import { useNodesReadOnly } from '../../hooks/use-workflow' import { useStore } from '../../store' import { VarType } from '../../types' import useVarList from '../_base/hooks/use-var-list' diff --git a/web/app/components/workflow/nodes/human-input/__tests__/human-input.spec.tsx b/web/app/components/workflow/nodes/human-input/__tests__/human-input.spec.tsx index f1b59ba8f40..ed1a366a114 100644 --- a/web/app/components/workflow/nodes/human-input/__tests__/human-input.spec.tsx +++ b/web/app/components/workflow/nodes/human-input/__tests__/human-input.spec.tsx @@ -48,20 +48,41 @@ vi.mock('@/app/components/workflow/store', () => ({ })) // Mock workflow hooks barrel (used by NodeSourceHandle via ../../../hooks) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesInteractions: () => ({ - handleNodeAdd: vi.fn(), - }), - useNodesReadOnly: () => ({ - getNodesReadOnly: () => false, - nodesReadOnly: false, - }), - useAvailableBlocks: () => ({ - availableNextBlocks: [], - availablePrevBlocks: [], - }), - useIsChatMode: () => false, -})) +vi.mock('../../../hooks/use-available-blocks', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useAvailableBlocks: () => ({ + availableNextBlocks: [], + availablePrevBlocks: [], + }), + } +}) + +vi.mock('../../../hooks/use-nodes-interactions', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesInteractions: () => ({ + handleNodeAdd: vi.fn(), + }), + } +}) + +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: () => ({ + getNodesReadOnly: () => false, + nodesReadOnly: false, + }), + useIsChatMode: () => false, + } +}) // ── Factory: Build a realistic human-input node as it would appear after DSL import ── const createHumanInputNode = (overrides?: Partial): Node => ({ diff --git a/web/app/components/workflow/nodes/human-input/components/__tests__/form-content.spec.tsx b/web/app/components/workflow/nodes/human-input/components/__tests__/form-content.spec.tsx index d1eeb072942..c20f48cfd89 100644 --- a/web/app/components/workflow/nodes/human-input/components/__tests__/form-content.spec.tsx +++ b/web/app/components/workflow/nodes/human-input/components/__tests__/form-content.spec.tsx @@ -27,9 +27,14 @@ vi.mock('react-i18next', async () => { } }) -vi.mock('@/app/components/workflow/hooks', () => ({ - useWorkflowVariableType: () => mockUseWorkflowVariableType(), -})) +vi.mock('../../../../hooks/use-workflow-variables', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflowVariableType: () => mockUseWorkflowVariableType(), + } +}) vi.mock('@tanstack/react-hotkeys', async (importOriginal) => { const actual = await importOriginal() diff --git a/web/app/components/workflow/nodes/human-input/components/delivery-method/__tests__/index.spec.tsx b/web/app/components/workflow/nodes/human-input/components/delivery-method/__tests__/index.spec.tsx index 3aad1dd33db..45980de8b39 100644 --- a/web/app/components/workflow/nodes/human-input/components/delivery-method/__tests__/index.spec.tsx +++ b/web/app/components/workflow/nodes/human-input/components/delivery-method/__tests__/index.spec.tsx @@ -11,9 +11,14 @@ vi.mock('react-i18next', () => ({ useTranslation: () => mockUseTranslation(), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesSyncDraft: () => mockUseNodesSyncDraft(), -})) +vi.mock('../../../../../hooks/use-nodes-sync-draft', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesSyncDraft: () => mockUseNodesSyncDraft(), + } +}) vi.mock('../method-selector', () => ({ __esModule: true, diff --git a/web/app/components/workflow/nodes/human-input/components/delivery-method/index.tsx b/web/app/components/workflow/nodes/human-input/components/delivery-method/index.tsx index 771c4e8cc7d..8a2c0fd301b 100644 --- a/web/app/components/workflow/nodes/human-input/components/delivery-method/index.tsx +++ b/web/app/components/workflow/nodes/human-input/components/delivery-method/index.tsx @@ -4,7 +4,7 @@ import { produce } from 'immer' import * as React from 'react' import { useTranslation } from 'react-i18next' import { Infotip } from '@/app/components/base/infotip' -import { useNodesSyncDraft } from '@/app/components/workflow/hooks' +import { useNodesSyncDraft } from '../../../../hooks/use-nodes-sync-draft' import MethodItem from './method-item' import MethodSelector from './method-selector' import { UpgradeModal } from './upgrade-modal' diff --git a/web/app/components/workflow/nodes/human-input/components/form-content.tsx b/web/app/components/workflow/nodes/human-input/components/form-content.tsx index bdc4c2b1ed7..1b9e92b7b93 100644 --- a/web/app/components/workflow/nodes/human-input/components/form-content.tsx +++ b/web/app/components/workflow/nodes/human-input/components/form-content.tsx @@ -13,7 +13,7 @@ import { useCallback, useEffect, useMemo, useRef } from 'react' import { Trans, useTranslation } from 'react-i18next' import PromptEditor from '@/app/components/base/prompt-editor' import { INSERT_HITL_INPUT_BLOCK_COMMAND } from '@/app/components/base/prompt-editor/plugins/hitl-input-block' -import { useWorkflowVariableType } from '../../../hooks' +import { useWorkflowVariableType } from '../../../hooks/use-workflow-variables' import { BlockEnum } from '../../../types' import AddInputField from './add-input-field' diff --git a/web/app/components/workflow/nodes/human-input/hooks/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/human-input/hooks/__tests__/use-config.spec.ts index 075136860bc..8f4d4bafebb 100644 --- a/web/app/components/workflow/nodes/human-input/hooks/__tests__/use-config.spec.ts +++ b/web/app/components/workflow/nodes/human-input/hooks/__tests__/use-config.spec.ts @@ -13,11 +13,16 @@ vi.mock('reactflow', () => ({ useUpdateNodeInternals: () => mockUseUpdateNodeInternals(), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: () => mockUseNodesReadOnly(), -})) +vi.mock('../../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() -vi.mock('@/app/components/workflow/hooks/use-edges-interactions', () => ({ + return { + ...actual, + useNodesReadOnly: () => mockUseNodesReadOnly(), + } +}) + +vi.mock('../../../../hooks/use-edges-interactions', () => ({ useEdgesInteractions: () => mockUseEdgesInteractions(), })) diff --git a/web/app/components/workflow/nodes/human-input/hooks/__tests__/use-form-content.spec.ts b/web/app/components/workflow/nodes/human-input/hooks/__tests__/use-form-content.spec.ts index 7478b789aac..2f90ef8c09a 100644 --- a/web/app/components/workflow/nodes/human-input/hooks/__tests__/use-form-content.spec.ts +++ b/web/app/components/workflow/nodes/human-input/hooks/__tests__/use-form-content.spec.ts @@ -6,9 +6,14 @@ import useFormContent from '../use-form-content' const mockUseWorkflow = vi.hoisted(() => vi.fn()) const mockUseNodeCrud = vi.hoisted(() => vi.fn()) -vi.mock('@/app/components/workflow/hooks', () => ({ - useWorkflow: () => mockUseWorkflow(), -})) +vi.mock('../../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflow: () => mockUseWorkflow(), + } +}) vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({ __esModule: true, diff --git a/web/app/components/workflow/nodes/human-input/hooks/use-config.ts b/web/app/components/workflow/nodes/human-input/hooks/use-config.ts index 13fd18eae53..64dfdcf2083 100644 --- a/web/app/components/workflow/nodes/human-input/hooks/use-config.ts +++ b/web/app/components/workflow/nodes/human-input/hooks/use-config.ts @@ -2,9 +2,9 @@ import type { DeliveryMethod, HumanInputNodeType, UserAction } from '../types' import { produce } from 'immer' import { useState } from 'react' import { useUpdateNodeInternals } from 'reactflow' -import { useNodesReadOnly } from '@/app/components/workflow/hooks' -import { useEdgesInteractions } from '@/app/components/workflow/hooks/use-edges-interactions' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' +import { useEdgesInteractions } from '../../../hooks/use-edges-interactions' +import { useNodesReadOnly } from '../../../hooks/use-workflow' import useFormContent from './use-form-content' const useConfig = (id: string, payload: HumanInputNodeType) => { diff --git a/web/app/components/workflow/nodes/human-input/hooks/use-form-content.ts b/web/app/components/workflow/nodes/human-input/hooks/use-form-content.ts index 8317285473a..eaf659933f4 100644 --- a/web/app/components/workflow/nodes/human-input/hooks/use-form-content.ts +++ b/web/app/components/workflow/nodes/human-input/hooks/use-form-content.ts @@ -1,7 +1,7 @@ import type { FormInputItem, HumanInputNodeType } from '../types' import { produce } from 'immer' import { useCallback, useEffect, useRef, useState } from 'react' -import { useWorkflow } from '@/app/components/workflow/hooks' +import { useWorkflow } from '../../../hooks/use-workflow' import useNodeCrud from '../../_base/hooks/use-node-crud' const useFormContent = (id: string, payload: HumanInputNodeType) => { diff --git a/web/app/components/workflow/nodes/if-else/__tests__/use-config.spec.tsx b/web/app/components/workflow/nodes/if-else/__tests__/use-config.spec.tsx index 64708ec4362..326178dc5e1 100644 --- a/web/app/components/workflow/nodes/if-else/__tests__/use-config.spec.tsx +++ b/web/app/components/workflow/nodes/if-else/__tests__/use-config.spec.tsx @@ -26,13 +26,26 @@ vi.mock('reactflow', async () => { } }) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: () => ({ nodesReadOnly: false }), - useEdgesInteractions: () => ({ - handleEdgeDeleteByDeleteBranch: (...args: unknown[]) => - mockHandleEdgeDeleteByDeleteBranch(...args), - }), -})) +vi.mock('../../../hooks/use-edges-interactions', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useEdgesInteractions: () => ({ + handleEdgeDeleteByDeleteBranch: (...args: unknown[]) => + mockHandleEdgeDeleteByDeleteBranch(...args), + }), + } +}) + +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: () => ({ nodesReadOnly: false }), + } +}) vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({ ...createNodeCrudModuleMock(mockSetInputs), diff --git a/web/app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx b/web/app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx index b83f8983482..99dd1c3d559 100644 --- a/web/app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx +++ b/web/app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx @@ -22,7 +22,6 @@ import { produce } from 'immer' import { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development' -import { useIsChatMode } from '@/app/components/workflow/hooks/use-workflow' import { getVarType } from '@/app/components/workflow/nodes/_base/components/variable/utils' import BoolValue from '@/app/components/workflow/panel/chat-variable-panel/components/bool-value' import { useWorkflowStore } from '@/app/components/workflow/store' @@ -33,6 +32,7 @@ import { useAllMCPTools, useAllWorkflowTools, } from '@/service/use-tools' +import { useIsChatMode } from '../../../../hooks/use-workflow' import useMatchSchemaType from '../../../_base/components/variable/use-match-schema-type' import { FILE_TYPE_OPTIONS, SUB_VARIABLES, TRANSFER_METHOD } from '../../../constants' import { ComparisonOperator } from '../../types' diff --git a/web/app/components/workflow/nodes/if-else/use-config.ts b/web/app/components/workflow/nodes/if-else/use-config.ts index 252345f160d..47303ef345e 100644 --- a/web/app/components/workflow/nodes/if-else/use-config.ts +++ b/web/app/components/workflow/nodes/if-else/use-config.ts @@ -12,9 +12,10 @@ import type { } from './types' import { useCallback, useMemo, useRef } from 'react' import { useUpdateNodeInternals } from 'reactflow' -import { useEdgesInteractions, useNodesReadOnly } from '@/app/components/workflow/hooks' import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' +import { useEdgesInteractions } from '../../hooks/use-edges-interactions' +import { useNodesReadOnly } from '../../hooks/use-workflow' import { addCase, addCondition, diff --git a/web/app/components/workflow/nodes/if-else/use-is-var-file-attribute.ts b/web/app/components/workflow/nodes/if-else/use-is-var-file-attribute.ts index 1dd60325163..635ef55b51e 100644 --- a/web/app/components/workflow/nodes/if-else/use-is-var-file-attribute.ts +++ b/web/app/components/workflow/nodes/if-else/use-is-var-file-attribute.ts @@ -1,7 +1,8 @@ import type { ValueSelector } from '../../types' import { useMemo } from 'react' import { useStoreApi } from 'reactflow' -import { useIsChatMode, useWorkflow, useWorkflowVariables } from '../../hooks' +import { useIsChatMode, useWorkflow } from '../../hooks/use-workflow' +import { useWorkflowVariables } from '../../hooks/use-workflow-variables' import { VarType } from '../../types' type Params = { diff --git a/web/app/components/workflow/nodes/iteration-start/__tests__/index.spec.tsx b/web/app/components/workflow/nodes/iteration-start/__tests__/index.spec.tsx index f7a95fa61e6..dbfef5c8d13 100644 --- a/web/app/components/workflow/nodes/iteration-start/__tests__/index.spec.tsx +++ b/web/app/components/workflow/nodes/iteration-start/__tests__/index.spec.tsx @@ -3,21 +3,35 @@ import type { CommonNodeType } from '@/app/components/workflow/types' import { render, waitFor } from '@testing-library/react' import { createNode } from '@/app/components/workflow/__tests__/fixtures' import { renderWorkflowFlowComponent } from '@/app/components/workflow/__tests__/workflow-test-env' -import { - useAvailableBlocks, - useIsChatMode, - useNodesInteractions, - useNodesReadOnly, -} from '@/app/components/workflow/hooks' import { BlockEnum } from '@/app/components/workflow/types' +import { useAvailableBlocks } from '../../../hooks/use-available-blocks' +import { useNodesInteractions } from '../../../hooks/use-nodes-interactions' +import { useIsChatMode, useNodesReadOnly } from '../../../hooks/use-workflow' import IterationStartNode, { IterationStartNodeDumb } from '../index' -vi.mock('@/app/components/workflow/hooks', async (importOriginal) => { - const actual = await importOriginal() +vi.mock('../../../hooks/use-available-blocks', async (importOriginal) => { + const actual = await importOriginal() + return { ...actual, useAvailableBlocks: vi.fn(), + } +}) + +vi.mock('../../../hooks/use-nodes-interactions', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, useNodesInteractions: vi.fn(), + } +}) + +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, useNodesReadOnly: vi.fn(), useIsChatMode: vi.fn(), } diff --git a/web/app/components/workflow/nodes/iteration/__tests__/integration.spec.tsx b/web/app/components/workflow/nodes/iteration/__tests__/integration.spec.tsx index ea8518fb233..1ccae5d382a 100644 --- a/web/app/components/workflow/nodes/iteration/__tests__/integration.spec.tsx +++ b/web/app/components/workflow/nodes/iteration/__tests__/integration.spec.tsx @@ -70,13 +70,19 @@ vi.mock('../use-interactions', () => ({ }), })) -vi.mock('../../../hooks', () => ({ +vi.mock('../../../hooks/use-available-blocks', () => ({ useAvailableBlocks: () => ({ availableNextBlocks: [BlockEnum.Code], }), +})) + +vi.mock('../../../hooks/use-nodes-interactions', () => ({ useNodesInteractions: () => ({ handleNodeAdd: mockHandleNodeAdd, }), +})) + +vi.mock('../../../hooks/use-workflow', () => ({ useNodesReadOnly: () => ({ nodesReadOnly: mockNodesReadOnly, }), diff --git a/web/app/components/workflow/nodes/iteration/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/iteration/__tests__/use-config.spec.ts index 728ab58077d..e0b19e6fb10 100644 --- a/web/app/components/workflow/nodes/iteration/__tests__/use-config.spec.ts +++ b/web/app/components/workflow/nodes/iteration/__tests__/use-config.spec.ts @@ -17,16 +17,21 @@ const mockUseAllWorkflowTools = vi.hoisted(() => vi.fn()) const mockUseAllMCPTools = vi.hoisted(() => vi.fn()) const mockToNodeOutputVars = vi.hoisted(() => vi.fn()) -vi.mock('@/app/components/workflow/hooks/use-inspect-vars-crud', () => ({ +vi.mock('../../../hooks/use-inspect-vars-crud', () => ({ __esModule: true, default: (...args: unknown[]) => mockUseInspectVarsCrud(...args), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: () => mockUseNodesReadOnly(), - useIsChatMode: () => mockUseIsChatMode(), - useWorkflow: () => mockUseWorkflow(), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: () => mockUseNodesReadOnly(), + useIsChatMode: () => mockUseIsChatMode(), + useWorkflow: () => mockUseWorkflow(), + } +}) vi.mock('@/app/components/workflow/store', () => ({ useStore: (selector: (state: { dataSourceList: unknown[] }) => unknown) => diff --git a/web/app/components/workflow/nodes/iteration/__tests__/use-interactions.spec.tsx b/web/app/components/workflow/nodes/iteration/__tests__/use-interactions.spec.tsx index e5adb792066..0c3ecac0bef 100644 --- a/web/app/components/workflow/nodes/iteration/__tests__/use-interactions.spec.tsx +++ b/web/app/components/workflow/nodes/iteration/__tests__/use-interactions.spec.tsx @@ -21,18 +21,23 @@ vi.mock('reactflow', async () => { }), } }) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesMetaData: () => ({ - nodesMap: { - [BlockEnum.Code]: { - defaultValue: { - title: 'Code', - desc: '', +vi.mock('../../../hooks/use-nodes-meta-data', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesMetaData: () => ({ + nodesMap: { + [BlockEnum.Code]: { + defaultValue: { + title: 'Code', + desc: '', + }, }, }, - }, - }), -})) + }), + } +}) vi.mock('@/app/components/workflow/utils', () => ({ generateNewNode: (...args: unknown[]) => mockGenerateNewNode(...args), diff --git a/web/app/components/workflow/nodes/iteration/__tests__/use-single-run-form-params.spec.ts b/web/app/components/workflow/nodes/iteration/__tests__/use-single-run-form-params.spec.ts index 657adc1d8e5..48baecee7d0 100644 --- a/web/app/components/workflow/nodes/iteration/__tests__/use-single-run-form-params.spec.ts +++ b/web/app/components/workflow/nodes/iteration/__tests__/use-single-run-form-params.spec.ts @@ -13,10 +13,15 @@ const mockGetNodeUsedVarPassToServerKey = vi.hoisted(() => vi.fn()) const mockGetNodeInfoById = vi.hoisted(() => vi.fn()) const mockIsSystemVar = vi.hoisted(() => vi.fn()) -vi.mock('@/app/components/workflow/hooks', () => ({ - useIsNodeInIteration: (...args: unknown[]) => mockUseIsNodeInIteration(...args), - useWorkflow: () => mockUseWorkflow(), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useIsNodeInIteration: (...args: unknown[]) => mockUseIsNodeInIteration(...args), + useWorkflow: () => mockUseWorkflow(), + } +}) vi.mock('@/app/components/workflow/run/utils/format-log', () => ({ __esModule: true, diff --git a/web/app/components/workflow/nodes/iteration/add-block.tsx b/web/app/components/workflow/nodes/iteration/add-block.tsx index 0bfa5b3a55b..3870cf1d5d3 100644 --- a/web/app/components/workflow/nodes/iteration/add-block.tsx +++ b/web/app/components/workflow/nodes/iteration/add-block.tsx @@ -7,7 +7,9 @@ import { memo, useCallback } from 'react' import { useTranslation } from 'react-i18next' import BlockSelector from '@/app/components/workflow/block-selector' import { BlockEnum } from '@/app/components/workflow/types' -import { useAvailableBlocks, useNodesInteractions, useNodesReadOnly } from '../../hooks' +import { useAvailableBlocks } from '../../hooks/use-available-blocks' +import { useNodesInteractions } from '../../hooks/use-nodes-interactions' +import { useNodesReadOnly } from '../../hooks/use-workflow' type AddBlockProps = { iterationNodeId: string diff --git a/web/app/components/workflow/nodes/iteration/use-config.ts b/web/app/components/workflow/nodes/iteration/use-config.ts index fca9b95fe4a..05edb30c935 100644 --- a/web/app/components/workflow/nodes/iteration/use-config.ts +++ b/web/app/components/workflow/nodes/iteration/use-config.ts @@ -10,8 +10,8 @@ import { useAllMCPTools, useAllWorkflowTools, } from '@/service/use-tools' -import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks' import useInspectVarsCrud from '../../hooks/use-inspect-vars-crud' +import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow' import { useStore } from '../../store' import { VarType } from '../../types' import { toNodeOutputVars } from '../_base/components/variable/utils' diff --git a/web/app/components/workflow/nodes/iteration/use-interactions.ts b/web/app/components/workflow/nodes/iteration/use-interactions.ts index e07a219bf3e..2506370f554 100644 --- a/web/app/components/workflow/nodes/iteration/use-interactions.ts +++ b/web/app/components/workflow/nodes/iteration/use-interactions.ts @@ -2,8 +2,8 @@ import type { BlockEnum, ChildNodeTypeCount, Node } from '../../types' import { produce } from 'immer' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' -import { useNodesMetaData } from '@/app/components/workflow/hooks' -import { useCollaborativeWorkflow } from '@/app/components/workflow/hooks/use-collaborative-workflow' +import { useCollaborativeWorkflow } from '../../hooks/use-collaborative-workflow' +import { useNodesMetaData } from '../../hooks/use-nodes-meta-data' import { generateNewNode, getNodeCustomTypeByNodeDataType } from '../../utils' import { buildIterationChildCopy, diff --git a/web/app/components/workflow/nodes/iteration/use-single-run-form-params.ts b/web/app/components/workflow/nodes/iteration/use-single-run-form-params.ts index c95068ade95..971fa35cbe8 100644 --- a/web/app/components/workflow/nodes/iteration/use-single-run-form-params.ts +++ b/web/app/components/workflow/nodes/iteration/use-single-run-form-params.ts @@ -7,7 +7,7 @@ import { useTranslation } from 'react-i18next' import formatTracing from '@/app/components/workflow/run/utils/format-log' import { InputVarType, VarType } from '@/app/components/workflow/types' import { VALUE_SELECTOR_DELIMITER as DELIMITER } from '@/config' -import { useIsNodeInIteration, useWorkflow } from '../../hooks' +import { useIsNodeInIteration, useWorkflow } from '../../hooks/use-workflow' import { getNodeInfoById, getNodeUsedVarPassToServerKey, diff --git a/web/app/components/workflow/nodes/knowledge-base/__tests__/panel.spec.tsx b/web/app/components/workflow/nodes/knowledge-base/__tests__/panel.spec.tsx index b30dd0c5df1..2b84b8c9b1e 100644 --- a/web/app/components/workflow/nodes/knowledge-base/__tests__/panel.spec.tsx +++ b/web/app/components/workflow/nodes/knowledge-base/__tests__/panel.spec.tsx @@ -54,9 +54,14 @@ vi.mock('@/app/components/header/account-setting/model-provider-page/hooks', () useModelList: mockUseModelList, })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: () => ({ nodesReadOnly: false }), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: () => ({ nodesReadOnly: false }), + } +}) vi.mock('../hooks/use-config', () => ({ useConfig: () => ({ diff --git a/web/app/components/workflow/nodes/knowledge-base/hooks/__tests__/use-config.spec.tsx b/web/app/components/workflow/nodes/knowledge-base/hooks/__tests__/use-config.spec.tsx index 8b230ca3d46..0ab46d1b580 100644 --- a/web/app/components/workflow/nodes/knowledge-base/hooks/__tests__/use-config.spec.tsx +++ b/web/app/components/workflow/nodes/knowledge-base/hooks/__tests__/use-config.spec.tsx @@ -14,11 +14,16 @@ import { useConfig } from '../use-config' const mockHandleNodeDataUpdateWithSyncDraft = vi.hoisted(() => vi.fn()) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodeDataUpdate: () => ({ - handleNodeDataUpdateWithSyncDraft: mockHandleNodeDataUpdateWithSyncDraft, - }), -})) +vi.mock('../../../../hooks/use-node-data-update', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodeDataUpdate: () => ({ + handleNodeDataUpdateWithSyncDraft: mockHandleNodeDataUpdateWithSyncDraft, + }), + } +}) const createNodeData = createNodeDataFactory({ title: 'Knowledge Base', diff --git a/web/app/components/workflow/nodes/knowledge-base/hooks/use-config.ts b/web/app/components/workflow/nodes/knowledge-base/hooks/use-config.ts index 649d50831f2..350b52568ea 100644 --- a/web/app/components/workflow/nodes/knowledge-base/hooks/use-config.ts +++ b/web/app/components/workflow/nodes/knowledge-base/hooks/use-config.ts @@ -3,8 +3,8 @@ import type { ValueSelector } from '@/app/components/workflow/types' import { produce } from 'immer' import { useCallback } from 'react' import { useStoreApi } from 'reactflow' -import { useNodeDataUpdate } from '@/app/components/workflow/hooks' import { DEFAULT_WEIGHTED_SCORE, RerankingModeEnum } from '@/models/datasets' +import { useNodeDataUpdate } from '../../../hooks/use-node-data-update' import { ChunkStructureEnum, HybridSearchModeEnum, diff --git a/web/app/components/workflow/nodes/knowledge-base/panel.tsx b/web/app/components/workflow/nodes/knowledge-base/panel.tsx index 23c8f0d6bbd..312c4216d45 100644 --- a/web/app/components/workflow/nodes/knowledge-base/panel.tsx +++ b/web/app/components/workflow/nodes/knowledge-base/panel.tsx @@ -9,7 +9,6 @@ import { checkShowMultiModalTip } from '@/app/components/datasets/settings/utils import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' import { useModelList } from '@/app/components/header/account-setting/model-provider-page/hooks' import { normalizeModelProviderModelsResponse } from '@/app/components/header/account-setting/model-provider-page/utils' -import { useNodesReadOnly } from '@/app/components/workflow/hooks' import { BoxGroup, BoxGroupField, @@ -18,6 +17,7 @@ import { import VarReferencePicker from '@/app/components/workflow/nodes/_base/components/variable/var-reference-picker' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { consoleQuery } from '@/service/client' +import { useNodesReadOnly } from '../../hooks/use-workflow' import Split from '../_base/components/split' import ChunkStructure from './components/chunk-structure' import EmbeddingModel from './components/embedding-model' diff --git a/web/app/components/workflow/nodes/knowledge-retrieval/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/knowledge-retrieval/__tests__/use-config.spec.ts index 851afde5731..3f97777611b 100644 --- a/web/app/components/workflow/nodes/knowledge-retrieval/__tests__/use-config.spec.ts +++ b/web/app/components/workflow/nodes/knowledge-retrieval/__tests__/use-config.spec.ts @@ -8,7 +8,6 @@ import { useModelListAndDefaultModelAndCurrentProviderAndModel, } from '@/app/components/header/account-setting/model-provider-page/hooks' import { useDatasetsDetailStore } from '@/app/components/workflow/datasets-detail-store/store' -import { useIsChatMode, useNodesReadOnly, useWorkflow } from '@/app/components/workflow/hooks' import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { BlockEnum, VarType } from '@/app/components/workflow/types' @@ -16,6 +15,7 @@ import { DATASET_DEFAULT } from '@/config' import { ChunkingMode, DatasetPermission, DataSourceType } from '@/models/datasets' import { fetchDatasets } from '@/service/datasets' import { AppModeEnum, RETRIEVE_METHOD, RETRIEVE_TYPE } from '@/types/app' +import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../../hooks/use-workflow' import { ComparisonOperator, LogicalOperator, @@ -33,11 +33,16 @@ vi.mock('uuid', () => ({ }), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: vi.fn(), - useIsChatMode: vi.fn(), - useWorkflow: vi.fn(), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: vi.fn(), + useIsChatMode: vi.fn(), + useWorkflow: vi.fn(), + } +}) vi.mock('@/app/components/header/account-setting/model-provider-page/hooks', () => ({ useModelListAndDefaultModelAndCurrentProviderAndModel: vi.fn(), diff --git a/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts b/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts index a95eac3d97f..c3d824e9000 100644 --- a/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts +++ b/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts @@ -9,7 +9,7 @@ import { } from '@/app/components/header/account-setting/model-provider-page/hooks' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { useDatasetsDetailStore } from '../../datasets-detail-store/store' -import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks' +import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow' import { BlockEnum } from '../../types' import useKnowledgeDatasetSelection from './hooks/use-knowledge-dataset-selection' import useKnowledgeInputManager from './hooks/use-knowledge-input-manager' diff --git a/web/app/components/workflow/nodes/list-operator/__tests__/use-config.spec.tsx b/web/app/components/workflow/nodes/list-operator/__tests__/use-config.spec.tsx index 8e7eda14cdb..3c96c472cd6 100644 --- a/web/app/components/workflow/nodes/list-operator/__tests__/use-config.spec.tsx +++ b/web/app/components/workflow/nodes/list-operator/__tests__/use-config.spec.tsx @@ -26,16 +26,29 @@ vi.mock('reactflow', async () => { } }) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: () => ({ nodesReadOnly: mockNodesReadOnly }), - useIsChatMode: () => mockIsChatMode, - useWorkflow: () => ({ - getBeforeNodesInSameBranch: (...args: unknown[]) => mockGetBeforeNodesInSameBranch(...args), - }), - useWorkflowVariables: () => ({ - getCurrentVariableType: (...args: unknown[]) => mockGetCurrentVariableType(...args), - }), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: () => ({ nodesReadOnly: mockNodesReadOnly }), + useIsChatMode: () => mockIsChatMode, + useWorkflow: () => ({ + getBeforeNodesInSameBranch: (...args: unknown[]) => mockGetBeforeNodesInSameBranch(...args), + }), + } +}) + +vi.mock('../../../hooks/use-workflow-variables', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflowVariables: () => ({ + getCurrentVariableType: (...args: unknown[]) => mockGetCurrentVariableType(...args), + }), + } +}) vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({ ...createNodeCrudModuleMock(mockSetInputs), diff --git a/web/app/components/workflow/nodes/list-operator/use-config.ts b/web/app/components/workflow/nodes/list-operator/use-config.ts index ff3cca24095..f76bc047de8 100644 --- a/web/app/components/workflow/nodes/list-operator/use-config.ts +++ b/web/app/components/workflow/nodes/list-operator/use-config.ts @@ -2,13 +2,9 @@ import type { ValueSelector, Var } from '../../types' import type { Condition, Limit, ListFilterNodeType, OrderBy } from './types' import { useCallback, useMemo } from 'react' import { useStoreApi } from 'reactflow' -import { - useIsChatMode, - useNodesReadOnly, - useWorkflow, - useWorkflowVariables, -} from '@/app/components/workflow/hooks' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' +import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow' +import { useWorkflowVariables } from '../../hooks/use-workflow-variables' import { canFilterVariable, getItemVarType, diff --git a/web/app/components/workflow/nodes/llm/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/llm/__tests__/use-config.spec.ts index a78753db44e..9cac2d3f5e7 100644 --- a/web/app/components/workflow/nodes/llm/__tests__/use-config.spec.ts +++ b/web/app/components/workflow/nodes/llm/__tests__/use-config.spec.ts @@ -2,30 +2,35 @@ import type { MutableRefObject } from 'react' import type { LLMNodeType } from '../types' import { act, renderHook, waitFor } from '@testing-library/react' import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks' -import { useIsChatMode, useNodesReadOnly } from '@/app/components/workflow/hooks' -import useInspectVarsCrud from '@/app/components/workflow/hooks/use-inspect-vars-crud' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { useStore } from '@/app/components/workflow/store' import { BlockEnum } from '@/app/components/workflow/types' import { AppModeEnum, Resolution } from '@/types/app' import useConfigVision from '../../../hooks/use-config-vision' +import useInspectVarsCrud from '../../../hooks/use-inspect-vars-crud' +import { useIsChatMode, useNodesReadOnly } from '../../../hooks/use-workflow' import useAvailableVarList from '../../_base/hooks/use-available-var-list' import useLLMInputManager from '../hooks/use-llm-input-manager' import useLLMPromptConfig from '../hooks/use-llm-prompt-config' import useLLMStructuredOutputConfig from '../hooks/use-llm-structured-output-config' import useConfig from '../use-config' -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: vi.fn(), - useIsChatMode: vi.fn(), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: vi.fn(), + useIsChatMode: vi.fn(), + } +}) vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({ __esModule: true, default: vi.fn(), })) -vi.mock('@/app/components/workflow/hooks/use-inspect-vars-crud', () => ({ +vi.mock('../../../hooks/use-inspect-vars-crud', () => ({ __esModule: true, default: vi.fn(), })) diff --git a/web/app/components/workflow/nodes/llm/__tests__/use-single-run-form-params.spec.ts b/web/app/components/workflow/nodes/llm/__tests__/use-single-run-form-params.spec.ts index 6c305a53002..38c02d712f2 100644 --- a/web/app/components/workflow/nodes/llm/__tests__/use-single-run-form-params.spec.ts +++ b/web/app/components/workflow/nodes/llm/__tests__/use-single-run-form-params.spec.ts @@ -30,9 +30,14 @@ vi.mock('../../_base/hooks/use-node-crud', () => ({ default: vi.fn(), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useIsChatMode: () => true, -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useIsChatMode: () => true, + } +}) const mockFlowType = vi.hoisted(() => ({ value: undefined as FlowType | undefined, diff --git a/web/app/components/workflow/nodes/llm/use-config.ts b/web/app/components/workflow/nodes/llm/use-config.ts index 38ce1bef8f9..c748b8131f3 100644 --- a/web/app/components/workflow/nodes/llm/use-config.ts +++ b/web/app/components/workflow/nodes/llm/use-config.ts @@ -4,11 +4,11 @@ import { produce } from 'immer' import { useCallback, useEffect, useState } from 'react' import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks' -import useInspectVarsCrud from '@/app/components/workflow/hooks/use-inspect-vars-crud' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { AppModeEnum } from '@/types/app' -import { useIsChatMode, useNodesReadOnly } from '../../hooks' import useConfigVision from '../../hooks/use-config-vision' +import useInspectVarsCrud from '../../hooks/use-inspect-vars-crud' +import { useIsChatMode, useNodesReadOnly } from '../../hooks/use-workflow' import { useStore } from '../../store' import useAvailableVarList from '../_base/hooks/use-available-var-list' import useLLMInputManager from './hooks/use-llm-input-manager' diff --git a/web/app/components/workflow/nodes/llm/use-single-run-form-params.ts b/web/app/components/workflow/nodes/llm/use-single-run-form-params.ts index b83dfc510dc..fb49995c3f8 100644 --- a/web/app/components/workflow/nodes/llm/use-single-run-form-params.ts +++ b/web/app/components/workflow/nodes/llm/use-single-run-form-params.ts @@ -9,8 +9,8 @@ import { useHooksStore } from '@/app/components/workflow/hooks-store/store' import { InputVarType, VarType } from '@/app/components/workflow/types' import { AppModeEnum } from '@/types/app' import { FlowType } from '@/types/common' -import { useIsChatMode } from '../../hooks' import useConfigVision from '../../hooks/use-config-vision' +import { useIsChatMode } from '../../hooks/use-workflow' import { EditionType } from '../../types' import useAvailableVarList from '../_base/hooks/use-available-var-list' import useNodeCrud from '../_base/hooks/use-node-crud' diff --git a/web/app/components/workflow/nodes/loop-start/__tests__/index.spec.tsx b/web/app/components/workflow/nodes/loop-start/__tests__/index.spec.tsx index 61ed49ccc55..25506393cc7 100644 --- a/web/app/components/workflow/nodes/loop-start/__tests__/index.spec.tsx +++ b/web/app/components/workflow/nodes/loop-start/__tests__/index.spec.tsx @@ -3,21 +3,35 @@ import type { CommonNodeType } from '@/app/components/workflow/types' import { render, waitFor } from '@testing-library/react' import { createNode } from '@/app/components/workflow/__tests__/fixtures' import { renderWorkflowFlowComponent } from '@/app/components/workflow/__tests__/workflow-test-env' -import { - useAvailableBlocks, - useIsChatMode, - useNodesInteractions, - useNodesReadOnly, -} from '@/app/components/workflow/hooks' import { BlockEnum } from '@/app/components/workflow/types' +import { useAvailableBlocks } from '../../../hooks/use-available-blocks' +import { useNodesInteractions } from '../../../hooks/use-nodes-interactions' +import { useIsChatMode, useNodesReadOnly } from '../../../hooks/use-workflow' import LoopStartNode, { LoopStartNodeDumb } from '../index' -vi.mock('@/app/components/workflow/hooks', async (importOriginal) => { - const actual = await importOriginal() +vi.mock('../../../hooks/use-available-blocks', async (importOriginal) => { + const actual = await importOriginal() + return { ...actual, useAvailableBlocks: vi.fn(), + } +}) + +vi.mock('../../../hooks/use-nodes-interactions', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, useNodesInteractions: vi.fn(), + } +}) + +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, useNodesReadOnly: vi.fn(), useIsChatMode: vi.fn(), } diff --git a/web/app/components/workflow/nodes/loop/__tests__/use-config.spec.tsx b/web/app/components/workflow/nodes/loop/__tests__/use-config.spec.tsx index 6d85fa1aedd..84261702a96 100644 --- a/web/app/components/workflow/nodes/loop/__tests__/use-config.spec.tsx +++ b/web/app/components/workflow/nodes/loop/__tests__/use-config.spec.tsx @@ -34,13 +34,18 @@ vi.mock('@/service/use-tools', () => ({ useAllMCPTools: () => ({ data: [] }), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: () => ({ nodesReadOnly: false }), - useIsChatMode: () => false, - useWorkflow: () => ({ - getLoopNodeChildren: (...args: unknown[]) => mockGetLoopNodeChildren(...args), - }), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: () => ({ nodesReadOnly: false }), + useIsChatMode: () => false, + useWorkflow: () => ({ + getLoopNodeChildren: (...args: unknown[]) => mockGetLoopNodeChildren(...args), + }), + } +}) vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({ ...createNodeCrudModuleMock(mockSetInputs), diff --git a/web/app/components/workflow/nodes/loop/__tests__/use-interactions.spec.tsx b/web/app/components/workflow/nodes/loop/__tests__/use-interactions.spec.tsx index 37ba944daee..4cd69deffe7 100644 --- a/web/app/components/workflow/nodes/loop/__tests__/use-interactions.spec.tsx +++ b/web/app/components/workflow/nodes/loop/__tests__/use-interactions.spec.tsx @@ -22,17 +22,22 @@ vi.mock('reactflow', async () => { } }) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesMetaData: () => ({ - nodesMap: { - [BlockEnum.Code]: { - defaultValue: { - title: 'Code', +vi.mock('../../../hooks/use-nodes-meta-data', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesMetaData: () => ({ + nodesMap: { + [BlockEnum.Code]: { + defaultValue: { + title: 'Code', + }, }, }, - }, - }), -})) + }), + } +}) vi.mock('@/app/components/workflow/utils', () => ({ generateNewNode: (...args: unknown[]) => mockGenerateNewNode(...args), diff --git a/web/app/components/workflow/nodes/loop/__tests__/use-single-run-form-params.spec.ts b/web/app/components/workflow/nodes/loop/__tests__/use-single-run-form-params.spec.ts index ba404f70527..bb69323d058 100644 --- a/web/app/components/workflow/nodes/loop/__tests__/use-single-run-form-params.spec.ts +++ b/web/app/components/workflow/nodes/loop/__tests__/use-single-run-form-params.spec.ts @@ -20,7 +20,7 @@ const mockGetNodeUsedVarPassToServerKey = vi.hoisted(() => vi.fn()) const mockGetNodeInfoById = vi.hoisted(() => vi.fn()) const mockIsSystemVar = vi.hoisted(() => vi.fn()) -vi.mock('../../../hooks', () => ({ +vi.mock('../../../hooks/use-workflow', () => ({ useIsNodeInLoop: (...args: unknown[]) => mockUseIsNodeInLoop(...args), useWorkflow: () => mockUseWorkflow(), })) diff --git a/web/app/components/workflow/nodes/loop/add-block.tsx b/web/app/components/workflow/nodes/loop/add-block.tsx index 565d8fd80b5..ae761cf741d 100644 --- a/web/app/components/workflow/nodes/loop/add-block.tsx +++ b/web/app/components/workflow/nodes/loop/add-block.tsx @@ -7,7 +7,9 @@ import { memo, useCallback } from 'react' import { useTranslation } from 'react-i18next' import BlockSelector from '@/app/components/workflow/block-selector' import { BlockEnum } from '@/app/components/workflow/types' -import { useAvailableBlocks, useNodesInteractions, useNodesReadOnly } from '../../hooks' +import { useAvailableBlocks } from '../../hooks/use-available-blocks' +import { useNodesInteractions } from '../../hooks/use-nodes-interactions' +import { useNodesReadOnly } from '../../hooks/use-workflow' type AddBlockProps = { loopNodeId: string diff --git a/web/app/components/workflow/nodes/loop/use-config.ts b/web/app/components/workflow/nodes/loop/use-config.ts index b0f76f8232e..118e3095053 100644 --- a/web/app/components/workflow/nodes/loop/use-config.ts +++ b/web/app/components/workflow/nodes/loop/use-config.ts @@ -17,7 +17,7 @@ import { useAllMCPTools, useAllWorkflowTools, } from '@/service/use-tools' -import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks' +import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow' import { toNodeOutputVars } from '../_base/components/variable/utils' import useNodeCrud from '../_base/hooks/use-node-crud' import { diff --git a/web/app/components/workflow/nodes/loop/use-interactions.ts b/web/app/components/workflow/nodes/loop/use-interactions.ts index 214e9c7f9c1..aa728b62b3d 100644 --- a/web/app/components/workflow/nodes/loop/use-interactions.ts +++ b/web/app/components/workflow/nodes/loop/use-interactions.ts @@ -1,8 +1,8 @@ import type { BlockEnum, Node } from '../../types' import { produce } from 'immer' import { useCallback } from 'react' -import { useNodesMetaData } from '@/app/components/workflow/hooks' -import { useCollaborativeWorkflow } from '@/app/components/workflow/hooks/use-collaborative-workflow' +import { useCollaborativeWorkflow } from '../../hooks/use-collaborative-workflow' +import { useNodesMetaData } from '../../hooks/use-nodes-meta-data' import { generateNewNode, getNodeCustomTypeByNodeDataType } from '../../utils' import { buildLoopChildCopy, diff --git a/web/app/components/workflow/nodes/loop/use-is-var-file-attribute.ts b/web/app/components/workflow/nodes/loop/use-is-var-file-attribute.ts index 7315cda65cd..c868e95db9d 100644 --- a/web/app/components/workflow/nodes/loop/use-is-var-file-attribute.ts +++ b/web/app/components/workflow/nodes/loop/use-is-var-file-attribute.ts @@ -1,6 +1,7 @@ import type { ValueSelector } from '../../types' import { useMemo } from 'react' -import { useIsChatMode, useWorkflow, useWorkflowVariables } from '../../hooks' +import { useIsChatMode, useWorkflow } from '../../hooks/use-workflow' +import { useWorkflowVariables } from '../../hooks/use-workflow-variables' import { VarType } from '../../types' type Params = { diff --git a/web/app/components/workflow/nodes/loop/use-single-run-form-params.ts b/web/app/components/workflow/nodes/loop/use-single-run-form-params.ts index c4fde98a70a..d38a202e1e4 100644 --- a/web/app/components/workflow/nodes/loop/use-single-run-form-params.ts +++ b/web/app/components/workflow/nodes/loop/use-single-run-form-params.ts @@ -5,7 +5,7 @@ import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import formatTracing from '@/app/components/workflow/run/utils/format-log' import { ValueType } from '@/app/components/workflow/types' -import { useIsNodeInLoop, useWorkflow } from '../../hooks' +import { useIsNodeInLoop, useWorkflow } from '../../hooks/use-workflow' import { buildUsedOutVars, createInputVarValues, diff --git a/web/app/components/workflow/nodes/parameter-extractor/use-config.ts b/web/app/components/workflow/nodes/parameter-extractor/use-config.ts index 2a0e6a64f7c..d79d6d79e4e 100644 --- a/web/app/components/workflow/nodes/parameter-extractor/use-config.ts +++ b/web/app/components/workflow/nodes/parameter-extractor/use-config.ts @@ -12,9 +12,9 @@ import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { AppModeEnum } from '@/types/app' import { supportFunctionCall } from '@/utils/tool-call' -import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks' import useConfigVision from '../../hooks/use-config-vision' import useInspectVarsCrud from '../../hooks/use-inspect-vars-crud' +import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow' import { useStore } from '../../store' import { ChangeType, VarType } from '../../types' diff --git a/web/app/components/workflow/nodes/question-classifier/__tests__/integration.spec.tsx b/web/app/components/workflow/nodes/question-classifier/__tests__/integration.spec.tsx index 7301a0a72b8..ac53a5a7d09 100644 --- a/web/app/components/workflow/nodes/question-classifier/__tests__/integration.spec.tsx +++ b/web/app/components/workflow/nodes/question-classifier/__tests__/integration.spec.tsx @@ -6,7 +6,7 @@ import userEvent from '@testing-library/user-event' import { useTextGenerationCurrentProviderAndModelAndModelList } from '@/app/components/header/account-setting/model-provider-page/hooks' import { renderWorkflowFlowComponent } from '@/app/components/workflow/__tests__/workflow-test-env' import { BlockEnum, VarType } from '@/app/components/workflow/types' -import { useEdgesInteractions } from '../../../hooks' +import { useEdgesInteractions } from '../../../hooks/use-edges-interactions' import AdvancedSetting from '../components/advanced-setting' import ClassItem from '../components/class-item' import ClassList from '../components/class-list' @@ -43,8 +43,8 @@ vi.mock('../../_base/hooks/use-available-var-list', () => ({ })), })) -vi.mock('../../../hooks', async (importOriginal) => { - const actual = await importOriginal() +vi.mock('../../../hooks/use-edges-interactions', async (importOriginal) => { + const actual = await importOriginal() return { ...actual, useEdgesInteractions: vi.fn(), diff --git a/web/app/components/workflow/nodes/question-classifier/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/question-classifier/__tests__/use-config.spec.ts index ad0ec634959..c27d5c336ed 100644 --- a/web/app/components/workflow/nodes/question-classifier/__tests__/use-config.spec.ts +++ b/web/app/components/workflow/nodes/question-classifier/__tests__/use-config.spec.ts @@ -1,21 +1,26 @@ import type { QuestionClassifierNodeType } from '../types' import { act, renderHook, waitFor } from '@testing-library/react' import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks' -import { useIsChatMode, useNodesReadOnly, useWorkflow } from '@/app/components/workflow/hooks' -import useConfigVision from '@/app/components/workflow/hooks/use-config-vision' import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { useStore } from '@/app/components/workflow/store' import { BlockEnum } from '@/app/components/workflow/types' import { AppModeEnum } from '@/types/app' import { FlowType } from '@/types/common' +import useConfigVision from '../../../hooks/use-config-vision' +import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../../hooks/use-workflow' import useConfig from '../use-config' -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: vi.fn(), - useIsChatMode: vi.fn(), - useWorkflow: vi.fn(), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: vi.fn(), + useIsChatMode: vi.fn(), + useWorkflow: vi.fn(), + } +}) vi.mock('reactflow', () => ({ useUpdateNodeInternals: vi.fn(() => vi.fn()), @@ -47,7 +52,7 @@ vi.mock('@/app/components/workflow/hooks-store/store', () => ({ }), })) -vi.mock('@/app/components/workflow/hooks/use-config-vision', () => ({ +vi.mock('../../../hooks/use-config-vision', () => ({ __esModule: true, default: vi.fn(), })) diff --git a/web/app/components/workflow/nodes/question-classifier/components/__tests__/class-list.spec.tsx b/web/app/components/workflow/nodes/question-classifier/components/__tests__/class-list.spec.tsx index 846a8faeb39..657a673ed07 100644 --- a/web/app/components/workflow/nodes/question-classifier/components/__tests__/class-list.spec.tsx +++ b/web/app/components/workflow/nodes/question-classifier/components/__tests__/class-list.spec.tsx @@ -1,7 +1,7 @@ import type { Topic } from '../../types' import { render, screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' -import { useEdgesInteractions } from '../../../../hooks' +import { useEdgesInteractions } from '../../../../hooks/use-edges-interactions' import ClassList from '../class-list' vi.mock('react-sortablejs', () => ({ @@ -9,8 +9,8 @@ vi.mock('react-sortablejs', () => ({ ReactSortable: ({ children }: { children: React.ReactNode }) =>
{children}
, })) -vi.mock('../../../../hooks', async (importOriginal) => { - const actual = await importOriginal() +vi.mock('../../../../hooks/use-edges-interactions', async (importOriginal) => { + const actual = await importOriginal() return { ...actual, useEdgesInteractions: vi.fn(), diff --git a/web/app/components/workflow/nodes/question-classifier/components/class-list.tsx b/web/app/components/workflow/nodes/question-classifier/components/class-list.tsx index 6655e4908cc..151e946b671 100644 --- a/web/app/components/workflow/nodes/question-classifier/components/class-list.tsx +++ b/web/app/components/workflow/nodes/question-classifier/components/class-list.tsx @@ -11,7 +11,7 @@ import { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { ReactSortable } from 'react-sortablejs' import { ArrowDownRoundFill } from '@/app/components/base/icons/src/vender/solid/general' -import { useEdgesInteractions } from '../../../hooks' +import { useEdgesInteractions } from '../../../hooks/use-edges-interactions' import AddButton from '../../_base/components/add-button' import { useInlineLabelHintDismissed } from '../storage' import Item from './class-item' diff --git a/web/app/components/workflow/nodes/question-classifier/use-config.ts b/web/app/components/workflow/nodes/question-classifier/use-config.ts index 074af92eed5..a2c8f9c2434 100644 --- a/web/app/components/workflow/nodes/question-classifier/use-config.ts +++ b/web/app/components/workflow/nodes/question-classifier/use-config.ts @@ -10,8 +10,8 @@ import { useHooksStore } from '@/app/components/workflow/hooks-store/store' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { AppModeEnum } from '@/types/app' import { FlowType } from '@/types/common' -import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks' import useConfigVision from '../../hooks/use-config-vision' +import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow' import { useStore } from '../../store' import { BlockEnum, VarType } from '../../types' import useAvailableVarList from '../_base/hooks/use-available-var-list' diff --git a/web/app/components/workflow/nodes/start-placeholder/__tests__/panel.spec.tsx b/web/app/components/workflow/nodes/start-placeholder/__tests__/panel.spec.tsx index 70b5ce390fe..28e5e04b630 100644 --- a/web/app/components/workflow/nodes/start-placeholder/__tests__/panel.spec.tsx +++ b/web/app/components/workflow/nodes/start-placeholder/__tests__/panel.spec.tsx @@ -34,9 +34,15 @@ vi.mock('@/app/components/workflow/block-selector/all-start-blocks', () => ({ ), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useAutoGenerateWebhookUrl: () => mocks.autoGenerateWebhookUrl, -})) +vi.mock('../../../hooks/use-auto-generate-webhook-url', async (importOriginal) => { + const actual = + await importOriginal() + + return { + ...actual, + useAutoGenerateWebhookUrl: () => mocks.autoGenerateWebhookUrl, + } +}) vi.mock('@/app/components/workflow/hooks-store', () => ({ useHooksStore: (selector: (state: unknown) => unknown) => @@ -55,7 +61,7 @@ vi.mock('@/app/components/workflow/hooks-store', () => ({ }), })) -vi.mock('@/app/components/workflow/hooks/use-nodes-sync-draft', () => ({ +vi.mock('../../../hooks/use-nodes-sync-draft', () => ({ useNodesSyncDraft: () => ({ handleSyncWorkflowDraft: mocks.handleSyncWorkflowDraft, }), diff --git a/web/app/components/workflow/nodes/start-placeholder/panel.tsx b/web/app/components/workflow/nodes/start-placeholder/panel.tsx index 0f775e60afa..5c396a48a3f 100644 --- a/web/app/components/workflow/nodes/start-placeholder/panel.tsx +++ b/web/app/components/workflow/nodes/start-placeholder/panel.tsx @@ -11,11 +11,11 @@ import { useTranslation } from 'react-i18next' import { useStoreApi } from 'reactflow' import SearchBox from '@/app/components/plugins/marketplace/search-box' import AllStartBlocks from '@/app/components/workflow/block-selector/all-start-blocks' -import { useAutoGenerateWebhookUrl } from '@/app/components/workflow/hooks' import { useHooksStore } from '@/app/components/workflow/hooks-store' -import { useNodesSyncDraft } from '@/app/components/workflow/hooks/use-nodes-sync-draft' import { useStore as useWorkflowStore } from '@/app/components/workflow/store' import { BlockEnum } from '@/app/components/workflow/types' +import { useAutoGenerateWebhookUrl } from '../../hooks/use-auto-generate-webhook-url' +import { useNodesSyncDraft } from '../../hooks/use-nodes-sync-draft' const getTriggerPluginNodeData = ( triggerConfig: TriggerDefaultValue, diff --git a/web/app/components/workflow/nodes/start/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/start/__tests__/use-config.spec.ts index a615d551b42..27b0e224e80 100644 --- a/web/app/components/workflow/nodes/start/__tests__/use-config.spec.ts +++ b/web/app/components/workflow/nodes/start/__tests__/use-config.spec.ts @@ -17,18 +17,23 @@ vi.mock('react-i18next', () => ({ useTranslation: () => mockUseTranslation(), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: () => mockUseNodesReadOnly(), - useWorkflow: () => mockUseWorkflow(), - useIsChatMode: () => mockUseIsChatMode(), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: () => mockUseNodesReadOnly(), + useWorkflow: () => mockUseWorkflow(), + useIsChatMode: () => mockUseIsChatMode(), + } +}) vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({ __esModule: true, default: (...args: unknown[]) => mockUseNodeCrud(...args), })) -vi.mock('@/app/components/workflow/hooks/use-inspect-vars-crud', () => ({ +vi.mock('../../../hooks/use-inspect-vars-crud', () => ({ __esModule: true, default: (...args: unknown[]) => mockUseInspectVarsCrud(...args), })) diff --git a/web/app/components/workflow/nodes/start/__tests__/use-single-run-form-params.spec.ts b/web/app/components/workflow/nodes/start/__tests__/use-single-run-form-params.spec.ts index 938a79a4226..b3f3d783c56 100644 --- a/web/app/components/workflow/nodes/start/__tests__/use-single-run-form-params.spec.ts +++ b/web/app/components/workflow/nodes/start/__tests__/use-single-run-form-params.spec.ts @@ -11,9 +11,14 @@ vi.mock('react-i18next', () => ({ useTranslation: () => mockUseTranslation(), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useIsChatMode: () => mockUseIsChatMode(), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useIsChatMode: () => mockUseIsChatMode(), + } +}) const createPayload = (overrides: Partial = {}): StartNodeType => ({ title: 'Start', diff --git a/web/app/components/workflow/nodes/start/use-config.ts b/web/app/components/workflow/nodes/start/use-config.ts index 7dbbd012a86..1abbc48db7d 100644 --- a/web/app/components/workflow/nodes/start/use-config.ts +++ b/web/app/components/workflow/nodes/start/use-config.ts @@ -5,11 +5,11 @@ import { useBoolean } from 'ahooks' import { produce } from 'immer' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' -import { useIsChatMode, useNodesReadOnly, useWorkflow } from '@/app/components/workflow/hooks' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { ChangeType } from '@/app/components/workflow/types' import { hasDuplicateStr } from '@/utils/var' import useInspectVarsCrud from '../../hooks/use-inspect-vars-crud' +import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow' const useConfig = (id: string, payload: StartNodeType) => { const { t } = useTranslation() diff --git a/web/app/components/workflow/nodes/start/use-single-run-form-params.ts b/web/app/components/workflow/nodes/start/use-single-run-form-params.ts index 0bbef15ddef..5b94fec5a8f 100644 --- a/web/app/components/workflow/nodes/start/use-single-run-form-params.ts +++ b/web/app/components/workflow/nodes/start/use-single-run-form-params.ts @@ -4,7 +4,7 @@ import type { Props as FormProps } from '@/app/components/workflow/nodes/_base/c import type { InputVar, ValueSelector, Variable } from '@/app/components/workflow/types' import { useTranslation } from 'react-i18next' import { InputVarType } from '@/app/components/workflow/types' -import { useIsChatMode } from '../../hooks' +import { useIsChatMode } from '../../hooks/use-workflow' type Params = { id: string diff --git a/web/app/components/workflow/nodes/template-transform/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/template-transform/__tests__/use-config.spec.ts index a1cce3cd890..ab1bc9db52c 100644 --- a/web/app/components/workflow/nodes/template-transform/__tests__/use-config.spec.ts +++ b/web/app/components/workflow/nodes/template-transform/__tests__/use-config.spec.ts @@ -1,17 +1,22 @@ import type { TemplateTransformNodeType } from '../types' import type { Variable } from '@/app/components/workflow/types' import { renderHook, waitFor } from '@testing-library/react' -import { useNodesReadOnly } from '@/app/components/workflow/hooks' import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { useStore } from '@/app/components/workflow/store' import { BlockEnum, VarType } from '@/app/components/workflow/types' +import { useNodesReadOnly } from '../../../hooks/use-workflow' import useVarList from '../../_base/hooks/use-var-list' import useConfig from '../use-config' -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: vi.fn(), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: vi.fn(), + } +}) vi.mock('@/app/components/workflow/store', () => ({ useStore: vi.fn(), diff --git a/web/app/components/workflow/nodes/template-transform/use-config.ts b/web/app/components/workflow/nodes/template-transform/use-config.ts index dd227abf76d..2b8c572fc93 100644 --- a/web/app/components/workflow/nodes/template-transform/use-config.ts +++ b/web/app/components/workflow/nodes/template-transform/use-config.ts @@ -2,9 +2,9 @@ import type { Var, Variable } from '../../types' import type { TemplateTransformNodeType } from './types' import { produce } from 'immer' import { useCallback, useEffect, useRef } from 'react' -import { useNodesReadOnly } from '@/app/components/workflow/hooks' import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' +import { useNodesReadOnly } from '../../hooks/use-workflow' import { useStore } from '../../store' import { VarType } from '../../types' import useVarList from '../_base/hooks/use-var-list' diff --git a/web/app/components/workflow/nodes/tool/__tests__/node.spec.tsx b/web/app/components/workflow/nodes/tool/__tests__/node.spec.tsx index 6b411922922..896b72c9a66 100644 --- a/web/app/components/workflow/nodes/tool/__tests__/node.spec.tsx +++ b/web/app/components/workflow/nodes/tool/__tests__/node.spec.tsx @@ -7,7 +7,7 @@ import Node from '../node' const mockUseNodePluginInstallation = vi.hoisted(() => vi.fn()) const mockUseCurrentToolCollection = vi.hoisted(() => vi.fn()) -vi.mock('@/app/components/workflow/hooks/use-node-plugin-installation', () => ({ +vi.mock('../../../hooks/use-node-plugin-installation', () => ({ useNodePluginInstallation: mockUseNodePluginInstallation, })) diff --git a/web/app/components/workflow/nodes/tool/hooks/__tests__/use-config.spec.tsx b/web/app/components/workflow/nodes/tool/hooks/__tests__/use-config.spec.tsx index 6a83496c95b..7b26283adc0 100644 --- a/web/app/components/workflow/nodes/tool/hooks/__tests__/use-config.spec.tsx +++ b/web/app/components/workflow/nodes/tool/hooks/__tests__/use-config.spec.tsx @@ -15,9 +15,14 @@ vi.mock('@/app/components/header/account-setting/model-provider-page/hooks', () useLanguage: () => 'en_US', })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: () => ({ nodesReadOnly: false }), -})) +vi.mock('../../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: () => ({ nodesReadOnly: false }), + } +}) vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({ __esModule: true, diff --git a/web/app/components/workflow/nodes/tool/hooks/__tests__/use-single-run-form-params.spec.ts b/web/app/components/workflow/nodes/tool/hooks/__tests__/use-single-run-form-params.spec.ts index 4621199c74e..bbf936925ee 100644 --- a/web/app/components/workflow/nodes/tool/hooks/__tests__/use-single-run-form-params.spec.ts +++ b/web/app/components/workflow/nodes/tool/hooks/__tests__/use-single-run-form-params.spec.ts @@ -10,9 +10,14 @@ const mockUseToolIcon = vi.hoisted(() => vi.fn()) const mockUseNodeCrud = vi.hoisted(() => vi.fn()) const mockFormatToTracingNodeList = vi.hoisted(() => vi.fn()) -vi.mock('@/app/components/workflow/hooks', () => ({ - useToolIcon: (...args: unknown[]) => mockUseToolIcon(...args), -})) +vi.mock('../../../../hooks/use-tool-icon', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useToolIcon: (...args: unknown[]) => mockUseToolIcon(...args), + } +}) vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({ __esModule: true, diff --git a/web/app/components/workflow/nodes/tool/hooks/use-config.ts b/web/app/components/workflow/nodes/tool/hooks/use-config.ts index c3657210a22..ebc9660c626 100644 --- a/web/app/components/workflow/nodes/tool/hooks/use-config.ts +++ b/web/app/components/workflow/nodes/tool/hooks/use-config.ts @@ -12,11 +12,11 @@ import { getConfiguredValue, toolParametersToFormSchemas, } from '@/app/components/tools/utils/to-form-schema' -import { useNodesReadOnly } from '@/app/components/workflow/hooks' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { useWorkflowStore } from '@/app/components/workflow/store' import { updateBuiltInToolCredential } from '@/service/tools' import { useInvalidToolsByType } from '@/service/use-tools' +import { useNodesReadOnly } from '../../../hooks/use-workflow' import { isToolAuthorizationRequired } from '../auth' import { normalizeJsonSchemaType } from '../output-schema-utils' import useCurrentToolCollection from './use-current-tool-collection' diff --git a/web/app/components/workflow/nodes/tool/hooks/use-single-run-form-params.ts b/web/app/components/workflow/nodes/tool/hooks/use-single-run-form-params.ts index 14d0111131d..c55e2872272 100644 --- a/web/app/components/workflow/nodes/tool/hooks/use-single-run-form-params.ts +++ b/web/app/components/workflow/nodes/tool/hooks/use-single-run-form-params.ts @@ -6,9 +6,9 @@ import type { NodeTracing } from '@/types/workflow' import { produce } from 'immer' import { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' -import { useToolIcon } from '@/app/components/workflow/hooks' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import formatToTracingNodeList from '@/app/components/workflow/run/utils/format-log' +import { useToolIcon } from '../../../hooks/use-tool-icon' import { VarType } from '../types' type Params = { diff --git a/web/app/components/workflow/nodes/tool/node.tsx b/web/app/components/workflow/nodes/tool/node.tsx index b41b1a0f940..3d006020213 100644 --- a/web/app/components/workflow/nodes/tool/node.tsx +++ b/web/app/components/workflow/nodes/tool/node.tsx @@ -4,8 +4,8 @@ import type { NodeProps } from '@/app/components/workflow/types' import * as React from 'react' import { useTranslation } from 'react-i18next' import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' -import { useNodePluginInstallation } from '@/app/components/workflow/hooks/use-node-plugin-installation' import { InstallPluginButton } from '@/app/components/workflow/nodes/_base/components/install-plugin-button' +import { useNodePluginInstallation } from '../../hooks/use-node-plugin-installation' import { isToolAuthorizationRequired } from './auth' import useCurrentToolCollection from './hooks/use-current-tool-collection' diff --git a/web/app/components/workflow/nodes/trigger-plugin/node.tsx b/web/app/components/workflow/nodes/trigger-plugin/node.tsx index d87b0f46453..d6c0fb01787 100644 --- a/web/app/components/workflow/nodes/trigger-plugin/node.tsx +++ b/web/app/components/workflow/nodes/trigger-plugin/node.tsx @@ -5,8 +5,8 @@ import * as React from 'react' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import NodeStatus, { NodeStatusEnum } from '@/app/components/base/node-status' -import { useNodePluginInstallation } from '@/app/components/workflow/hooks/use-node-plugin-installation' import { InstallPluginButton } from '@/app/components/workflow/nodes/_base/components/install-plugin-button' +import { useNodePluginInstallation } from '../../hooks/use-node-plugin-installation' import useConfig from './use-config' const formatConfigValue = (rawValue: any): string => { diff --git a/web/app/components/workflow/nodes/trigger-plugin/use-config.ts b/web/app/components/workflow/nodes/trigger-plugin/use-config.ts index 5627e7b1b30..1e24c6e2921 100644 --- a/web/app/components/workflow/nodes/trigger-plugin/use-config.ts +++ b/web/app/components/workflow/nodes/trigger-plugin/use-config.ts @@ -8,9 +8,9 @@ import { getConfiguredValue, toolParametersToFormSchemas, } from '@/app/components/tools/utils/to-form-schema' -import { useNodesReadOnly } from '@/app/components/workflow/hooks' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { useAllTriggerPlugins, useTriggerSubscriptions } from '@/service/use-triggers' +import { useNodesReadOnly } from '../../hooks/use-workflow' import { VarKindType } from '../_base/types' const normalizeEventParameters = ( diff --git a/web/app/components/workflow/nodes/trigger-schedule/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/trigger-schedule/__tests__/use-config.spec.ts index 783b4276f7d..5498c8c3488 100644 --- a/web/app/components/workflow/nodes/trigger-schedule/__tests__/use-config.spec.ts +++ b/web/app/components/workflow/nodes/trigger-schedule/__tests__/use-config.spec.ts @@ -1,16 +1,21 @@ import type { ScheduleTriggerNodeType } from '../types' import { renderHook } from '@testing-library/react' -import { useNodesReadOnly } from '@/app/components/workflow/hooks' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { createAccountProfileQueryWrapper } from '@/test/console/account-profile' +import { useNodesReadOnly } from '../../../hooks/use-workflow' import { BlockEnum } from '../../../types' import useConfig from '../use-config' const mockConsoleStateReader = vi.hoisted(() => vi.fn()) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: vi.fn(), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: vi.fn(), + } +}) vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({ __esModule: true, diff --git a/web/app/components/workflow/nodes/trigger-schedule/use-config.ts b/web/app/components/workflow/nodes/trigger-schedule/use-config.ts index dbd8a853001..accfa526a11 100644 --- a/web/app/components/workflow/nodes/trigger-schedule/use-config.ts +++ b/web/app/components/workflow/nodes/trigger-schedule/use-config.ts @@ -1,9 +1,9 @@ import type { ScheduleFrequency, ScheduleMode, ScheduleTriggerNodeType } from './types' import { useQuery } from '@tanstack/react-query' import { useCallback, useMemo } from 'react' -import { useNodesReadOnly } from '@/app/components/workflow/hooks' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { userProfileQueryOptions } from '@/features/account-profile/client' +import { useNodesReadOnly } from '../../hooks/use-workflow' import { getDefaultVisualConfig } from './constants' const useConfig = (id: string, payload: ScheduleTriggerNodeType) => { diff --git a/web/app/components/workflow/nodes/trigger-webhook/__tests__/use-config.spec.tsx b/web/app/components/workflow/nodes/trigger-webhook/__tests__/use-config.spec.tsx index ec7f7288ca5..3cf1530b045 100644 --- a/web/app/components/workflow/nodes/trigger-webhook/__tests__/use-config.spec.tsx +++ b/web/app/components/workflow/nodes/trigger-webhook/__tests__/use-config.spec.tsx @@ -28,13 +28,18 @@ vi.mock('@langgenius/dify-ui/toast', () => ({ }, })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: () => mockUseNodesReadOnly(), - useWorkflow: () => ({ - isVarUsedInNodes: (...args: unknown[]) => mockIsVarUsedInNodes(...args), - removeUsedVarInNodes: (...args: unknown[]) => mockRemoveUsedVarInNodes(...args), - }), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: () => mockUseNodesReadOnly(), + useWorkflow: () => ({ + isVarUsedInNodes: (...args: unknown[]) => mockIsVarUsedInNodes(...args), + removeUsedVarInNodes: (...args: unknown[]) => mockRemoveUsedVarInNodes(...args), + }), + } +}) vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({ ...createNodeCrudModuleMock(mockSetInputs), diff --git a/web/app/components/workflow/nodes/trigger-webhook/use-config.ts b/web/app/components/workflow/nodes/trigger-webhook/use-config.ts index 10ef38ecd1e..a87e165a5d6 100644 --- a/web/app/components/workflow/nodes/trigger-webhook/use-config.ts +++ b/web/app/components/workflow/nodes/trigger-webhook/use-config.ts @@ -4,9 +4,9 @@ import { toast } from '@langgenius/dify-ui/toast' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' import { useStore as useAppStore } from '@/app/components/app/store' -import { useNodesReadOnly, useWorkflow } from '@/app/components/workflow/hooks' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { fetchWebhookUrl } from '@/service/apps' +import { useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow' import { updateContentType, updateMethod, diff --git a/web/app/components/workflow/nodes/variable-assigner/__tests__/hooks.spec.ts b/web/app/components/workflow/nodes/variable-assigner/__tests__/hooks.spec.ts index a635389c0fc..2a2cd77df0f 100644 --- a/web/app/components/workflow/nodes/variable-assigner/__tests__/hooks.spec.ts +++ b/web/app/components/workflow/nodes/variable-assigner/__tests__/hooks.spec.ts @@ -19,12 +19,33 @@ vi.mock('reactflow', () => ({ useNodes: () => mockUseNodes(), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodeDataUpdate: () => mockUseNodeDataUpdate(), - useWorkflow: () => mockUseWorkflow(), - useWorkflowVariables: () => mockUseWorkflowVariables(), - useIsChatMode: () => mockUseIsChatMode(), -})) +vi.mock('../../../hooks/use-node-data-update', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodeDataUpdate: () => mockUseNodeDataUpdate(), + } +}) + +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflow: () => mockUseWorkflow(), + useIsChatMode: () => mockUseIsChatMode(), + } +}) + +vi.mock('../../../hooks/use-workflow-variables', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflowVariables: () => mockUseWorkflowVariables(), + } +}) vi.mock('@/app/components/workflow/store', () => ({ useWorkflowStore: () => mockUseWorkflowStore(), diff --git a/web/app/components/workflow/nodes/variable-assigner/__tests__/use-config.spec.tsx b/web/app/components/workflow/nodes/variable-assigner/__tests__/use-config.spec.tsx index 467f8040036..c795ba8bcaf 100644 --- a/web/app/components/workflow/nodes/variable-assigner/__tests__/use-config.spec.tsx +++ b/web/app/components/workflow/nodes/variable-assigner/__tests__/use-config.spec.tsx @@ -40,20 +40,25 @@ vi.mock('ahooks', () => ({ }), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: () => ({ nodesReadOnly: false }), - useWorkflow: () => ({ - handleOutVarRenameChange: (...args: unknown[]) => mockHandleOutVarRenameChange(...args), - isVarUsedInNodes: (...args: unknown[]) => mockIsVarUsedInNodes(...args), - removeUsedVarInNodes: (...args: unknown[]) => mockRemoveUsedVarInNodes(...args), - }), -})) +vi.mock('../../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: () => ({ nodesReadOnly: false }), + useWorkflow: () => ({ + handleOutVarRenameChange: (...args: unknown[]) => mockHandleOutVarRenameChange(...args), + isVarUsedInNodes: (...args: unknown[]) => mockIsVarUsedInNodes(...args), + removeUsedVarInNodes: (...args: unknown[]) => mockRemoveUsedVarInNodes(...args), + }), + } +}) vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({ ...createNodeCrudModuleMock(mockSetInputs), })) -vi.mock('@/app/components/workflow/hooks/use-inspect-vars-crud', () => ({ +vi.mock('../../../hooks/use-inspect-vars-crud', () => ({ __esModule: true, default: () => ({ deleteNodeInspectorVars: (...args: unknown[]) => mockDeleteNodeInspectorVars(...args), diff --git a/web/app/components/workflow/nodes/variable-assigner/hooks.ts b/web/app/components/workflow/nodes/variable-assigner/hooks.ts index a4dde1bf183..9ebcee4d8a7 100644 --- a/web/app/components/workflow/nodes/variable-assigner/hooks.ts +++ b/web/app/components/workflow/nodes/variable-assigner/hooks.ts @@ -5,8 +5,10 @@ import { produce } from 'immer' import { useCallback } from 'react' import { useNodes, useStoreApi } from 'reactflow' import { FlowType } from '@/types/common' -import { useIsChatMode, useNodeDataUpdate, useWorkflow, useWorkflowVariables } from '../../hooks' import { useHooksStore } from '../../hooks-store/store' +import { useNodeDataUpdate } from '../../hooks/use-node-data-update' +import { useIsChatMode, useWorkflow } from '../../hooks/use-workflow' +import { useWorkflowVariables } from '../../hooks/use-workflow-variables' import { useWorkflowStore } from '../../store' import { filterSnippetSystemVars, isSnippetCanvas } from '../_base/hooks/snippet-input-field-vars' diff --git a/web/app/components/workflow/nodes/variable-assigner/use-config.ts b/web/app/components/workflow/nodes/variable-assigner/use-config.ts index e535d9c453d..749c477aa0f 100644 --- a/web/app/components/workflow/nodes/variable-assigner/use-config.ts +++ b/web/app/components/workflow/nodes/variable-assigner/use-config.ts @@ -2,9 +2,9 @@ import type { ValueSelector } from '../../types' import type { VarGroupItem, VariableAssignerNodeType } from './types' import { useBoolean, useDebounceFn } from 'ahooks' import { useCallback, useRef, useState } from 'react' -import { useNodesReadOnly, useWorkflow } from '@/app/components/workflow/hooks' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import useInspectVarsCrud from '../../hooks/use-inspect-vars-crud' +import { useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow' import { useGetAvailableVars } from './hooks' import { addGroup, diff --git a/web/app/components/workflow/note-node/__tests__/hooks.spec.tsx b/web/app/components/workflow/note-node/__tests__/hooks.spec.tsx index f31e5502849..478a93ab9d6 100644 --- a/web/app/components/workflow/note-node/__tests__/hooks.spec.tsx +++ b/web/app/components/workflow/note-node/__tests__/hooks.spec.tsx @@ -5,10 +5,13 @@ import { useNote } from '../hooks' const mockHandleNodeDataUpdateWithSyncDraft = vi.hoisted(() => vi.fn()) const mockSaveStateToHistory = vi.hoisted(() => vi.fn()) -vi.mock('../../hooks', () => ({ +vi.mock('../../hooks/use-node-data-update', () => ({ useNodeDataUpdate: () => ({ handleNodeDataUpdateWithSyncDraft: mockHandleNodeDataUpdateWithSyncDraft, }), +})) + +vi.mock('../../hooks/use-workflow-history', () => ({ useWorkflowHistory: () => ({ saveStateToHistory: mockSaveStateToHistory, }), diff --git a/web/app/components/workflow/note-node/__tests__/index.spec.tsx b/web/app/components/workflow/note-node/__tests__/index.spec.tsx index 9f501b63435..083bbeaa863 100644 --- a/web/app/components/workflow/note-node/__tests__/index.spec.tsx +++ b/web/app/components/workflow/note-node/__tests__/index.spec.tsx @@ -24,13 +24,20 @@ const { mockHandleThemeChange: vi.fn(), })) -vi.mock('../../hooks', async (importOriginal) => { - const actual = await importOriginal() +vi.mock('../../hooks/use-node-data-update', async (importOriginal) => { + const actual = await importOriginal() return { ...actual, useNodeDataUpdate: () => ({ handleNodeDataUpdateWithSyncDraft: mockHandleNodeDataUpdateWithSyncDraft, }), + } +}) + +vi.mock('../../hooks/use-nodes-interactions', async (importOriginal) => { + const actual = await importOriginal() + return { + ...actual, useNodesInteractions: () => ({ handleNodesCopy: mockHandleNodesCopy, handleNodesDuplicate: mockHandleNodesDuplicate, diff --git a/web/app/components/workflow/note-node/hooks.ts b/web/app/components/workflow/note-node/hooks.ts index 602a57ef5c0..7daa2ddbd88 100644 --- a/web/app/components/workflow/note-node/hooks.ts +++ b/web/app/components/workflow/note-node/hooks.ts @@ -1,7 +1,8 @@ import type { EditorState } from 'lexical' import type { NoteTheme } from './types' import { useCallback } from 'react' -import { useNodeDataUpdate, useWorkflowHistory, WorkflowHistoryEvent } from '../hooks' +import { useNodeDataUpdate } from '../hooks/use-node-data-update' +import { useWorkflowHistory, WorkflowHistoryEvent } from '../hooks/use-workflow-history' import { useSetWorkflowNoteShowAuthor } from '../persistence/local-storage-options' export const useNote = (id: string) => { diff --git a/web/app/components/workflow/note-node/index.tsx b/web/app/components/workflow/note-node/index.tsx index 411a182a980..31a8c2b3d22 100644 --- a/web/app/components/workflow/note-node/index.tsx +++ b/web/app/components/workflow/note-node/index.tsx @@ -4,7 +4,8 @@ import { cn } from '@langgenius/dify-ui/cn' import { useClickAway } from 'ahooks' import { memo, useRef } from 'react' import { useTranslation } from 'react-i18next' -import { useNodeDataUpdate, useNodesInteractions } from '../hooks' +import { useNodeDataUpdate } from '../hooks/use-node-data-update' +import { useNodesInteractions } from '../hooks/use-nodes-interactions' import NodeResizer from '../nodes/_base/components/node-resizer' import { useStore } from '../store/workflow' import { THEME_MAP } from './constants' diff --git a/web/app/components/workflow/operator/__tests__/add-block.spec.tsx b/web/app/components/workflow/operator/__tests__/add-block.spec.tsx index fe9f03bda31..29b08a4c0b9 100644 --- a/web/app/components/workflow/operator/__tests__/add-block.spec.tsx +++ b/web/app/components/workflow/operator/__tests__/add-block.spec.tsx @@ -88,17 +88,26 @@ vi.mock('@/app/components/workflow/block-selector', () => ({ }, })) -vi.mock('../../hooks', () => ({ +vi.mock('../../hooks/use-available-blocks', () => ({ useAvailableBlocks: () => ({ availableNextBlocks: mockAvailableNextBlocks, }), +})) + +vi.mock('../../hooks/use-workflow', () => ({ useIsChatMode: () => mockIsChatMode, - useNodesMetaData: () => ({ - nodesMap: mockNodesMetaDataMap, - }), useNodesReadOnly: () => ({ nodesReadOnly: mockNodesReadOnly, }), +})) + +vi.mock('../../hooks/use-nodes-meta-data', () => ({ + useNodesMetaData: () => ({ + nodesMap: mockNodesMetaDataMap, + }), +})) + +vi.mock('../../hooks/use-panel-interactions', () => ({ usePanelInteractions: () => ({ handlePaneContextmenuCancel: mockHandlePaneContextmenuCancel, }), diff --git a/web/app/components/workflow/operator/__tests__/control.spec.tsx b/web/app/components/workflow/operator/__tests__/control.spec.tsx index 8a92d57e6ee..1b6c7bc272a 100644 --- a/web/app/components/workflow/operator/__tests__/control.spec.tsx +++ b/web/app/components/workflow/operator/__tests__/control.spec.tsx @@ -27,11 +27,14 @@ let mockCanUseCommentMode = true let mockIsCommentModeAvailable = true let mockStoreState: WorkflowStoreState -vi.mock('../../hooks', () => ({ +vi.mock('../../hooks/use-workflow', () => ({ useNodesReadOnly: () => ({ nodesReadOnly: mockNodesReadOnly, getNodesReadOnly: () => mockNodesReadOnly, }), +})) + +vi.mock('../../hooks/use-workflow-panel-interactions', () => ({ useWorkflowMoveMode: () => ({ handleModePointer: mockHandleModePointer, handleModeHand: mockHandleModeHand, @@ -39,6 +42,9 @@ vi.mock('../../hooks', () => ({ isCommentModeAvailable: mockIsCommentModeAvailable, canUseCommentMode: mockCanUseCommentMode, }), +})) + +vi.mock('../../hooks/use-workflow-organize', () => ({ useWorkflowOrganize: () => ({ handleLayout: mockHandleLayout, }), diff --git a/web/app/components/workflow/operator/__tests__/index.spec.tsx b/web/app/components/workflow/operator/__tests__/index.spec.tsx index bb045b63712..adb109b4cd8 100644 --- a/web/app/components/workflow/operator/__tests__/index.spec.tsx +++ b/web/app/components/workflow/operator/__tests__/index.spec.tsx @@ -7,13 +7,20 @@ import Operator from '../index' const mockEmit = vi.fn() const mockDeleteAllInspectorVars = vi.fn() -vi.mock('../../hooks', async (importOriginal) => { - const actual = await importOriginal() +vi.mock('../../hooks/use-nodes-sync-draft', async (importOriginal) => { + const actual = await importOriginal() return { ...actual, useNodesSyncDraft: () => ({ handleSyncWorkflowDraft: vi.fn(), }), + } +}) + +vi.mock('../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + return { + ...actual, useWorkflowReadOnly: () => ({ workflowReadOnly: false, getWorkflowReadOnly: () => false, diff --git a/web/app/components/workflow/operator/__tests__/more-actions.spec.tsx b/web/app/components/workflow/operator/__tests__/more-actions.spec.tsx index a31c6afd4a8..48e40bd4c71 100644 --- a/web/app/components/workflow/operator/__tests__/more-actions.spec.tsx +++ b/web/app/components/workflow/operator/__tests__/more-actions.spec.tsx @@ -135,11 +135,16 @@ vi.mock('@/app/components/workflow/store', () => ({ useStore: (selector: (state: typeof mockWorkflowState) => unknown) => selector(mockWorkflowState), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: () => ({ - getNodesReadOnly: mockGetNodesReadOnly, - }), -})) +vi.mock('../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: () => ({ + getNodesReadOnly: mockGetNodesReadOnly, + }), + } +}) vi.mock('@/utils/download', () => ({ downloadUrl: (...args: unknown[]) => mockDownloadUrl(...args), diff --git a/web/app/components/workflow/operator/__tests__/zoom-in-out.spec.tsx b/web/app/components/workflow/operator/__tests__/zoom-in-out.spec.tsx index c0f2f112616..5c77e7e091b 100644 --- a/web/app/components/workflow/operator/__tests__/zoom-in-out.spec.tsx +++ b/web/app/components/workflow/operator/__tests__/zoom-in-out.spec.tsx @@ -37,15 +37,28 @@ vi.mock('reactflow', () => ({ useViewport: () => mockViewport, })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesSyncDraft: () => ({ - handleSyncWorkflowDraft: mockHandleSyncWorkflowDraft, - }), - useWorkflowReadOnly: () => ({ - workflowReadOnly, - getWorkflowReadOnly: () => workflowReadOnly, - }), -})) +vi.mock('../../hooks/use-nodes-sync-draft', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesSyncDraft: () => ({ + handleSyncWorkflowDraft: mockHandleSyncWorkflowDraft, + }), + } +}) + +vi.mock('../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflowReadOnly: () => ({ + workflowReadOnly, + getWorkflowReadOnly: () => workflowReadOnly, + }), + } +}) vi.mock('../tip-popup', () => ({ default: ({ children }: { children: React.ReactNode }) => <>{children}, diff --git a/web/app/components/workflow/operator/add-block.tsx b/web/app/components/workflow/operator/add-block.tsx index 2f589b01cda..171f095b865 100644 --- a/web/app/components/workflow/operator/add-block.tsx +++ b/web/app/components/workflow/operator/add-block.tsx @@ -9,14 +9,11 @@ import { useStoreApi } from 'reactflow' import BlockSelector from '@/app/components/workflow/block-selector' import { BlockEnum } from '@/app/components/workflow/types' import { FlowType } from '@/types/common' -import { - useAvailableBlocks, - useIsChatMode, - useNodesMetaData, - useNodesReadOnly, - usePanelInteractions, -} from '../hooks' import { useHooksStore } from '../hooks-store' +import { useAvailableBlocks } from '../hooks/use-available-blocks' +import { useNodesMetaData } from '../hooks/use-nodes-meta-data' +import { usePanelInteractions } from '../hooks/use-panel-interactions' +import { useIsChatMode, useNodesReadOnly } from '../hooks/use-workflow' import { useWorkflowStore } from '../store' import { generateNewNode, diff --git a/web/app/components/workflow/operator/control.tsx b/web/app/components/workflow/operator/control.tsx index 1fdbaf976ab..757f841847b 100644 --- a/web/app/components/workflow/operator/control.tsx +++ b/web/app/components/workflow/operator/control.tsx @@ -4,7 +4,9 @@ import { cn } from '@langgenius/dify-ui/cn' import { memo } from 'react' import { useTranslation } from 'react-i18next' import Divider from '../../base/divider' -import { useNodesReadOnly, useWorkflowMoveMode, useWorkflowOrganize } from '../hooks' +import { useNodesReadOnly } from '../hooks/use-workflow' +import { useWorkflowOrganize } from '../hooks/use-workflow-organize' +import { useWorkflowMoveMode } from '../hooks/use-workflow-panel-interactions' import { useStore } from '../store' import { ControlMode } from '../types' import AddBlock from './add-block' diff --git a/web/app/components/workflow/operator/more-actions.tsx b/web/app/components/workflow/operator/more-actions.tsx index f902fa46d36..2ae242fbbb9 100644 --- a/web/app/components/workflow/operator/more-actions.tsx +++ b/web/app/components/workflow/operator/more-actions.tsx @@ -14,7 +14,7 @@ import { getNodesBounds, useReactFlow } from 'reactflow' import ImagePreview from '@/app/components/base/image-uploader/image-preview' import { useStore } from '@/app/components/workflow/store' import { downloadUrl } from '@/utils/download' -import { useNodesReadOnly } from '../hooks' +import { useNodesReadOnly } from '../hooks/use-workflow' import TipPopup from './tip-popup' function MoreActions() { diff --git a/web/app/components/workflow/operator/zoom-in-out.tsx b/web/app/components/workflow/operator/zoom-in-out.tsx index 6fa10732f67..c07427714d5 100644 --- a/web/app/components/workflow/operator/zoom-in-out.tsx +++ b/web/app/components/workflow/operator/zoom-in-out.tsx @@ -11,7 +11,8 @@ import { Fragment, memo } from 'react' import { useTranslation } from 'react-i18next' import { useReactFlow, useViewport } from 'reactflow' import { systemFeaturesQueryOptions } from '@/features/system-features/client' -import { useNodesSyncDraft, useWorkflowReadOnly } from '../hooks' +import { useNodesSyncDraft } from '../hooks/use-nodes-sync-draft' +import { useWorkflowReadOnly } from '../hooks/use-workflow' import { ShortcutKbd } from '../shortcuts/shortcut-kbd' import TipPopup from './tip-popup' diff --git a/web/app/components/workflow/panel-contextmenu.tsx b/web/app/components/workflow/panel-contextmenu.tsx index 74564c6eafb..9ea0141a75d 100644 --- a/web/app/components/workflow/panel-contextmenu.tsx +++ b/web/app/components/workflow/panel-contextmenu.tsx @@ -8,14 +8,12 @@ import { import { useCallback } from 'react' import { useTranslation } from 'react-i18next' import { FlowType } from '@/types/common' -import { - useDSL, - useIsChatMode, - useNodesInteractions, - useWorkflowMoveMode, - useWorkflowStartRun, -} from './hooks' import { useHooksStore } from './hooks-store' +import { useDSL } from './hooks/use-DSL' +import { useNodesInteractions } from './hooks/use-nodes-interactions' +import { useIsChatMode } from './hooks/use-workflow' +import { useWorkflowMoveMode } from './hooks/use-workflow-panel-interactions' +import { useWorkflowStartRun } from './hooks/use-workflow-start-run' import { TEST_RUN_MENU_HOTKEY } from './hotkeys' import { isSnippetCanvas } from './nodes/_base/hooks/snippet-input-field-vars' import AddBlock from './operator/add-block' diff --git a/web/app/components/workflow/panel/__tests__/record.spec.tsx b/web/app/components/workflow/panel/__tests__/record.spec.tsx index 04edb0e2196..37d88ed3e0e 100644 --- a/web/app/components/workflow/panel/__tests__/record.spec.tsx +++ b/web/app/components/workflow/panel/__tests__/record.spec.tsx @@ -11,11 +11,16 @@ const mockFormatWorkflowRunIdentifier = vi.fn((finishedAt?: number) => let latestGetResultCallback: ((res: WorkflowRunDetailResponse) => void) | undefined -vi.mock('@/app/components/workflow/hooks', () => ({ - useWorkflowUpdate: () => ({ - handleUpdateWorkflowCanvas: mockHandleUpdateWorkflowCanvas, - }), -})) +vi.mock('../../hooks/use-workflow-update', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useWorkflowUpdate: () => ({ + handleUpdateWorkflowCanvas: mockHandleUpdateWorkflowCanvas, + }), + } +}) vi.mock('@/app/components/workflow/run', () => ({ default: ({ diff --git a/web/app/components/workflow/panel/__tests__/workflow-preview.spec.tsx b/web/app/components/workflow/panel/__tests__/workflow-preview.spec.tsx index 78ac2309b6f..b13fa7ee6da 100644 --- a/web/app/components/workflow/panel/__tests__/workflow-preview.spec.tsx +++ b/web/app/components/workflow/panel/__tests__/workflow-preview.spec.tsx @@ -30,11 +30,17 @@ vi.mock('@/service/workflow', () => ({ submitHumanInputForm: vi.fn(), })) -vi.mock('@/app/components/workflow/hooks', () => ({ - useWorkflowInteractions: () => ({ - handleCancelDebugAndPreviewPanel: mockHandleCancelDebugAndPreviewPanel, - }), -})) +vi.mock('../../hooks/use-workflow-panel-interactions', async (importOriginal) => { + const actual = + await importOriginal() + + return { + ...actual, + useWorkflowInteractions: () => ({ + handleCancelDebugAndPreviewPanel: mockHandleCancelDebugAndPreviewPanel, + }), + } +}) vi.mock('@/app/components/workflow/run/result-panel', () => ({ default: ({ status, onOpenTracingTab }: { status?: string; onOpenTracingTab?: () => void }) => ( diff --git a/web/app/components/workflow/panel/chat-record/index.tsx b/web/app/components/workflow/panel/chat-record/index.tsx index be892c72db6..0d1d92fc371 100644 --- a/web/app/components/workflow/panel/chat-record/index.tsx +++ b/web/app/components/workflow/panel/chat-record/index.tsx @@ -8,7 +8,7 @@ import { buildChatItemTree, getThreadMessages } from '@/app/components/base/chat import { getProcessedFilesFromResponse } from '@/app/components/base/file-uploader/utils' import Loading from '@/app/components/base/loading' import { fetchConversationMessages } from '@/service/debug' -import { useWorkflowRun } from '../../hooks' +import { useWorkflowRun } from '../../hooks/use-workflow-run' import { useStore, useWorkflowStore } from '../../store' import { formatWorkflowRunIdentifier } from '../../utils' import UserInput from './user-input' diff --git a/web/app/components/workflow/panel/chat-variable-panel/index.tsx b/web/app/components/workflow/panel/chat-variable-panel/index.tsx index 599b3159fc6..e22e0198899 100644 --- a/web/app/components/workflow/panel/chat-variable-panel/index.tsx +++ b/web/app/components/workflow/panel/chat-variable-panel/index.tsx @@ -11,7 +11,6 @@ import { } from '@/app/components/base/icons/src/vender/line/others' import BlockIcon from '@/app/components/workflow/block-icon' import { webSocketClient } from '@/app/components/workflow/collaboration/core/websocket-manager' -import { useCollaborativeWorkflow } from '@/app/components/workflow/hooks/use-collaborative-workflow' import RemoveEffectVarConfirm from '@/app/components/workflow/nodes/_base/components/remove-effect-var-confirm' import { findUsedVarNodes, @@ -22,6 +21,7 @@ import VariableModalTrigger from '@/app/components/workflow/panel/chat-variable- import { useStore } from '@/app/components/workflow/store' import { BlockEnum } from '@/app/components/workflow/types' import { updateConversationVariables } from '@/service/workflow' +import { useCollaborativeWorkflow } from '../../hooks/use-collaborative-workflow' import useInspectVarsCrud from '../../hooks/use-inspect-vars-crud' const ChatVariablePanel = () => { diff --git a/web/app/components/workflow/panel/comments-panel/__tests__/index.spec.tsx b/web/app/components/workflow/panel/comments-panel/__tests__/index.spec.tsx index 3ac8345f50c..fbd7286f182 100644 --- a/web/app/components/workflow/panel/comments-panel/__tests__/index.spec.tsx +++ b/web/app/components/workflow/panel/comments-panel/__tests__/index.spec.tsx @@ -81,7 +81,7 @@ vi.mock('@/app/components/workflow/store', () => ({ }), })) -vi.mock('@/app/components/workflow/hooks/use-workflow-comment', () => ({ +vi.mock('../../../hooks/use-workflow-comment', () => ({ useWorkflowComment: () => ({ comments: commentFixtures, loading: false, diff --git a/web/app/components/workflow/panel/comments-panel/index.tsx b/web/app/components/workflow/panel/comments-panel/index.tsx index 5be4f6eaf57..b237effb736 100644 --- a/web/app/components/workflow/panel/comments-panel/index.tsx +++ b/web/app/components/workflow/panel/comments-panel/index.tsx @@ -13,11 +13,11 @@ import { memo, useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import Divider from '@/app/components/base/divider' import { UserAvatarList } from '@/app/components/base/user-avatar-list' -import { useWorkflowComment } from '@/app/components/workflow/hooks/use-workflow-comment' import { useStore } from '@/app/components/workflow/store' import { ControlMode } from '@/app/components/workflow/types' import { userProfileIdAtom } from '@/context/account-state' import { useFormatTimeFromNow } from '@/hooks/use-format-time-from-now' +import { useWorkflowComment } from '../../hooks/use-workflow-comment' const CommentsPanel = () => { const { t } = useTranslation() diff --git a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks.spec.ts b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks.spec.ts index a6dbda9e4a8..870188d243d 100644 --- a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks.spec.ts +++ b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks.spec.ts @@ -45,8 +45,11 @@ vi.mock('reactflow', () => ({ }), })) -vi.mock('../../../hooks', () => ({ +vi.mock('../../../hooks/use-workflow-run', () => ({ useWorkflowRun: () => ({ handleRun: mockHandleRun }), +})) + +vi.mock('../../../hooks/use-set-workflow-vars-with-value', () => ({ useSetWorkflowVarsWithValue: () => ({ fetchInspectVars: mockFetchInspectVars }), })) diff --git a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-resume.spec.ts b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-resume.spec.ts index f680189e937..1809a7f79a1 100644 --- a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-resume.spec.ts +++ b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-resume.spec.ts @@ -44,8 +44,11 @@ vi.mock('reactflow', () => ({ }), })) -vi.mock('../../../../hooks', () => ({ +vi.mock('../../../../hooks/use-workflow-run', () => ({ useWorkflowRun: () => ({ handleRun: mockHandleRun }), +})) + +vi.mock('../../../../hooks/use-set-workflow-vars-with-value', () => ({ useSetWorkflowVarsWithValue: () => ({ fetchInspectVars: mockFetchInspectVars }), })) diff --git a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-send.spec.ts b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-send.spec.ts index c594a0a511b..e8215fc0320 100644 --- a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-send.spec.ts +++ b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-send.spec.ts @@ -46,8 +46,11 @@ vi.mock('reactflow', () => ({ }), })) -vi.mock('../../../../hooks', () => ({ +vi.mock('../../../../hooks/use-workflow-run', () => ({ useWorkflowRun: () => ({ handleRun: mockHandleRun }), +})) + +vi.mock('../../../../hooks/use-set-workflow-vars-with-value', () => ({ useSetWorkflowVarsWithValue: () => ({ fetchInspectVars: mockFetchInspectVars }), })) diff --git a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-stop-restart.spec.ts b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-stop-restart.spec.ts index 8a44eb4936f..8027d92b393 100644 --- a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-stop-restart.spec.ts +++ b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-stop-restart.spec.ts @@ -44,8 +44,11 @@ vi.mock('reactflow', () => ({ }), })) -vi.mock('../../../../hooks', () => ({ +vi.mock('../../../../hooks/use-workflow-run', () => ({ useWorkflowRun: () => ({ handleRun: mockHandleRun }), +})) + +vi.mock('../../../../hooks/use-set-workflow-vars-with-value', () => ({ useSetWorkflowVarsWithValue: () => ({ fetchInspectVars: mockFetchInspectVars }), })) diff --git a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/misc.spec.ts b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/misc.spec.ts index 567f3d1c3b5..206a33ad511 100644 --- a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/misc.spec.ts +++ b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/misc.spec.ts @@ -44,8 +44,11 @@ vi.mock('reactflow', () => ({ }), })) -vi.mock('../../../../hooks', () => ({ +vi.mock('../../../../hooks/use-workflow-run', () => ({ useWorkflowRun: () => ({ handleRun: mockHandleRun }), +})) + +vi.mock('../../../../hooks/use-set-workflow-vars-with-value', () => ({ useSetWorkflowVarsWithValue: () => ({ fetchInspectVars: mockFetchInspectVars }), })) diff --git a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/opening-statement.spec.ts b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/opening-statement.spec.ts index 294ad2e572d..c9016fc15c3 100644 --- a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/opening-statement.spec.ts +++ b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/opening-statement.spec.ts @@ -44,8 +44,11 @@ vi.mock('reactflow', () => ({ }), })) -vi.mock('../../../../hooks', () => ({ +vi.mock('../../../../hooks/use-workflow-run', () => ({ useWorkflowRun: () => ({ handleRun: mockHandleRun }), +})) + +vi.mock('../../../../hooks/use-set-workflow-vars-with-value', () => ({ useSetWorkflowVarsWithValue: () => ({ fetchInspectVars: mockFetchInspectVars }), })) diff --git a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/sse-callbacks.spec.ts b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/sse-callbacks.spec.ts index 613ee45b5ff..ae8325e9f62 100644 --- a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/sse-callbacks.spec.ts +++ b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/sse-callbacks.spec.ts @@ -43,8 +43,11 @@ vi.mock('reactflow', () => ({ }), })) -vi.mock('../../../../hooks', () => ({ +vi.mock('../../../../hooks/use-workflow-run', () => ({ useWorkflowRun: () => ({ handleRun: mockHandleRun }), +})) + +vi.mock('../../../../hooks/use-set-workflow-vars-with-value', () => ({ useSetWorkflowVarsWithValue: () => ({ fetchInspectVars: mockFetchInspectVars }), })) diff --git a/web/app/components/workflow/panel/debug-and-preview/hooks.ts b/web/app/components/workflow/panel/debug-and-preview/hooks.ts index 00b261eddb3..69c91d2c397 100644 --- a/web/app/components/workflow/panel/debug-and-preview/hooks.ts +++ b/web/app/components/workflow/panel/debug-and-preview/hooks.ts @@ -23,8 +23,9 @@ import { useInvalidAllLastRun } from '@/service/use-workflow' import { submitHumanInputForm } from '@/service/workflow' import { TransferMethod } from '@/types/app' import { DEFAULT_ITER_TIMES, DEFAULT_LOOP_TIMES } from '../../constants' -import { useSetWorkflowVarsWithValue, useWorkflowRun } from '../../hooks' import { useHooksStore } from '../../hooks-store' +import { useSetWorkflowVarsWithValue } from '../../hooks/use-set-workflow-vars-with-value' +import { useWorkflowRun } from '../../hooks/use-workflow-run' import { useWorkflowStore } from '../../store' import { NodeRunningStatus, WorkflowRunningStatus } from '../../types' diff --git a/web/app/components/workflow/panel/debug-and-preview/index.tsx b/web/app/components/workflow/panel/debug-and-preview/index.tsx index 1226e147b1f..119036618f8 100644 --- a/web/app/components/workflow/panel/debug-and-preview/index.tsx +++ b/web/app/components/workflow/panel/debug-and-preview/index.tsx @@ -9,10 +9,10 @@ import { useTranslation } from 'react-i18next' import { useNodes } from 'reactflow' import ActionButton, { ActionButtonState } from '@/app/components/base/action-button' import { RefreshCcw01 } from '@/app/components/base/icons/src/vender/line/arrows' -import { useEdgesInteractionsWithoutSync } from '@/app/components/workflow/hooks/use-edges-interactions-without-sync' -import { useNodesInteractionsWithoutSync } from '@/app/components/workflow/hooks/use-nodes-interactions-without-sync' import { useStore } from '@/app/components/workflow/store' -import { useWorkflowInteractions } from '../../hooks' +import { useEdgesInteractionsWithoutSync } from '../../hooks/use-edges-interactions-without-sync' +import { useNodesInteractionsWithoutSync } from '../../hooks/use-nodes-interactions-without-sync' +import { useWorkflowInteractions } from '../../hooks/use-workflow-panel-interactions' import { useResizePanel } from '../../nodes/_base/hooks/use-resize-panel' import { useSetDebugPreviewPanelWidth } from '../../persistence/local-storage-options' import { BlockEnum } from '../../types' diff --git a/web/app/components/workflow/panel/env-panel/__tests__/index.spec.tsx b/web/app/components/workflow/panel/env-panel/__tests__/index.spec.tsx index ff83dc858b4..4afc4a470c6 100644 --- a/web/app/components/workflow/panel/env-panel/__tests__/index.spec.tsx +++ b/web/app/components/workflow/panel/env-panel/__tests__/index.spec.tsx @@ -48,7 +48,7 @@ const { >(() => null), })) -vi.mock('@/app/components/workflow/hooks/use-nodes-sync-draft', () => ({ +vi.mock('../../../hooks/use-nodes-sync-draft', () => ({ useNodesSyncDraft: () => ({ doSyncWorkflowDraft: mockDoSyncWorkflowDraft, }), diff --git a/web/app/components/workflow/panel/env-panel/index.tsx b/web/app/components/workflow/panel/env-panel/index.tsx index f3c3bc0d3f3..26872f3d4ce 100644 --- a/web/app/components/workflow/panel/env-panel/index.tsx +++ b/web/app/components/workflow/panel/env-panel/index.tsx @@ -3,8 +3,6 @@ import { cn } from '@langgenius/dify-ui/cn' import { RiCloseLine } from '@remixicon/react' import { memo, useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' -import { useCollaborativeWorkflow } from '@/app/components/workflow/hooks/use-collaborative-workflow' -import { useNodesSyncDraft } from '@/app/components/workflow/hooks/use-nodes-sync-draft' import RemoveEffectVarConfirm from '@/app/components/workflow/nodes/_base/components/remove-effect-var-confirm' import { findUsedVarNodes, @@ -13,6 +11,8 @@ import { import EnvItem from '@/app/components/workflow/panel/env-panel/env-item' import VariableTrigger from '@/app/components/workflow/panel/env-panel/variable-trigger' import { useStore } from '@/app/components/workflow/store' +import { useCollaborativeWorkflow } from '../../hooks/use-collaborative-workflow' +import { useNodesSyncDraft } from '../../hooks/use-nodes-sync-draft' const HIDDEN_SECRET_VALUE = '[__HIDDEN__]' type DoSyncWorkflowDraft = ReturnType['doSyncWorkflowDraft'] diff --git a/web/app/components/workflow/panel/global-variable-panel/__tests__/index.spec.tsx b/web/app/components/workflow/panel/global-variable-panel/__tests__/index.spec.tsx index 1b95d76180e..8bd1db550ef 100644 --- a/web/app/components/workflow/panel/global-variable-panel/__tests__/index.spec.tsx +++ b/web/app/components/workflow/panel/global-variable-panel/__tests__/index.spec.tsx @@ -19,7 +19,7 @@ vi.mock('../../../constants', () => ({ isInWorkflowPage: () => mockIsWorkflowPage, })) -vi.mock('../../../hooks', () => ({ +vi.mock('../../../hooks/use-workflow', () => ({ useIsChatMode: () => mockIsChatMode, })) diff --git a/web/app/components/workflow/panel/global-variable-panel/index.tsx b/web/app/components/workflow/panel/global-variable-panel/index.tsx index 736e3ef9093..3d97b8de0ff 100644 --- a/web/app/components/workflow/panel/global-variable-panel/index.tsx +++ b/web/app/components/workflow/panel/global-variable-panel/index.tsx @@ -5,7 +5,7 @@ import { memo } from 'react' import { useTranslation } from 'react-i18next' import { useStore } from '@/app/components/workflow/store' import { isInWorkflowPage } from '../../constants' -import { useIsChatMode } from '../../hooks' +import { useIsChatMode } from '../../hooks/use-workflow' import Item from './item' const Panel = () => { diff --git a/web/app/components/workflow/panel/inputs-panel.tsx b/web/app/components/workflow/panel/inputs-panel.tsx index 0aed00193e7..f023f1125b4 100644 --- a/web/app/components/workflow/panel/inputs-panel.tsx +++ b/web/app/components/workflow/panel/inputs-panel.tsx @@ -6,8 +6,8 @@ import { useNodes } from 'reactflow' import { useCheckInputsForms } from '@/app/components/base/chat/chat/check-input-forms-hooks' import { getProcessedInputs } from '@/app/components/base/chat/chat/utils' import { TransferMethod } from '../../base/text-generation/types' -import { useWorkflowRun } from '../hooks' import { useHooksStore } from '../hooks-store' +import { useWorkflowRun } from '../hooks/use-workflow-run' import FormItem from '../nodes/_base/components/before-run-form/form-item' import { useStore, useWorkflowStore } from '../store' import { BlockEnum, InputVarType, WorkflowRunningStatus } from '../types' diff --git a/web/app/components/workflow/panel/record.tsx b/web/app/components/workflow/panel/record.tsx index 14bc2b2af95..b01ead287b8 100644 --- a/web/app/components/workflow/panel/record.tsx +++ b/web/app/components/workflow/panel/record.tsx @@ -1,7 +1,7 @@ import type { WorkflowRunDetailResponse } from '@/models/log' import { memo, useCallback } from 'react' -import { useWorkflowUpdate } from '../hooks' import { useHooksStore } from '../hooks-store' +import { useWorkflowUpdate } from '../hooks/use-workflow-update' import Run from '../run' import { useStore } from '../store' import { formatWorkflowRunIdentifier } from '../utils' diff --git a/web/app/components/workflow/panel/version-history-panel/__tests__/index.spec.tsx b/web/app/components/workflow/panel/version-history-panel/__tests__/index.spec.tsx index b004638db36..b339f4c4280 100644 --- a/web/app/components/workflow/panel/version-history-panel/__tests__/index.spec.tsx +++ b/web/app/components/workflow/panel/version-history-panel/__tests__/index.spec.tsx @@ -112,9 +112,15 @@ vi.mock('@/service/use-workflow', () => ({ }), })) -vi.mock('../../../hooks', () => ({ +vi.mock('../../../hooks/use-DSL', () => ({ useDSL: () => ({ handleExportDSL: mockHandleExportDSL }), +})) + +vi.mock('../../../hooks/use-workflow-refresh-draft', () => ({ useWorkflowRefreshDraft: () => ({ handleRefreshWorkflowDraft: mockHandleRefreshWorkflowDraft }), +})) + +vi.mock('../../../hooks/use-workflow-run', () => ({ useWorkflowRun: () => ({ handleRestoreFromPublishedWorkflow: mockHandleRestoreFromPublishedWorkflow, handleLoadBackupDraft: mockHandleLoadBackupDraft, diff --git a/web/app/components/workflow/panel/version-history-panel/index.tsx b/web/app/components/workflow/panel/version-history-panel/index.tsx index ab9528f7086..9cfb4b65ef7 100644 --- a/web/app/components/workflow/panel/version-history-panel/index.tsx +++ b/web/app/components/workflow/panel/version-history-panel/index.tsx @@ -21,8 +21,10 @@ import { useUpdateWorkflow, useWorkflowVersionHistory, } from '@/service/use-workflow' -import { useDSL, useWorkflowRefreshDraft, useWorkflowRun } from '../../hooks' import { useHooksStore } from '../../hooks-store' +import { useDSL } from '../../hooks/use-DSL' +import { useWorkflowRefreshDraft } from '../../hooks/use-workflow-refresh-draft' +import { useWorkflowRun } from '../../hooks/use-workflow-run' import { useStore, useWorkflowStore } from '../../store' import { VersionHistoryContextMenuOptions, diff --git a/web/app/components/workflow/panel/workflow-preview.tsx b/web/app/components/workflow/panel/workflow-preview.tsx index 00b463a5f36..2d1be46dc99 100644 --- a/web/app/components/workflow/panel/workflow-preview.tsx +++ b/web/app/components/workflow/panel/workflow-preview.tsx @@ -8,7 +8,7 @@ import { useTranslation } from 'react-i18next' import ReasoningPanel from '@/app/components/base/chat/chat/answer/reasoning-panel' import Loading from '@/app/components/base/loading' import { submitHumanInputForm } from '@/service/workflow' -import { useWorkflowInteractions } from '../hooks' +import { useWorkflowInteractions } from '../hooks/use-workflow-panel-interactions' import ResultPanel from '../run/result-panel' import ResultText from '../run/result-text' import TracingPanel from '../run/tracing-panel' diff --git a/web/app/components/workflow/selection-contextmenu.tsx b/web/app/components/workflow/selection-contextmenu.tsx index 688cd5aa0d9..b7ad0d07982 100644 --- a/web/app/components/workflow/selection-contextmenu.tsx +++ b/web/app/components/workflow/selection-contextmenu.tsx @@ -14,9 +14,11 @@ import { useTranslation } from 'react-i18next' import { useStore as useReactFlowStore } from 'reactflow' import { useCreateSnippetFromSelection } from '@/app/components/snippets/hooks/use-create-snippet-from-selection' import { canCreateAndModifySnippets } from '@/app/components/snippets/utils/permission' -import { useCollaborativeWorkflow } from '@/app/components/workflow/hooks/use-collaborative-workflow' import { workspacePermissionKeysAtom } from '@/context/permission-state' -import { useNodesInteractions, useNodesReadOnly, useNodesSyncDraft } from './hooks' +import { useCollaborativeWorkflow } from './hooks/use-collaborative-workflow' +import { useNodesInteractions } from './hooks/use-nodes-interactions' +import { useNodesSyncDraft } from './hooks/use-nodes-sync-draft' +import { useNodesReadOnly } from './hooks/use-workflow' import { useWorkflowHistory, WorkflowHistoryEvent } from './hooks/use-workflow-history' import { ShortcutKbd } from './shortcuts/shortcut-kbd' import { useStore, useWorkflowStore } from './store' diff --git a/web/app/components/workflow/simple-node/__tests__/index.spec.tsx b/web/app/components/workflow/simple-node/__tests__/index.spec.tsx index bf0e4034e89..50490d1ba78 100644 --- a/web/app/components/workflow/simple-node/__tests__/index.spec.tsx +++ b/web/app/components/workflow/simple-node/__tests__/index.spec.tsx @@ -4,11 +4,16 @@ import SimpleNode from '../index' let mockNodesReadOnly = false -vi.mock('@/app/components/workflow/hooks', () => ({ - useNodesReadOnly: () => ({ - nodesReadOnly: mockNodesReadOnly, - }), -})) +vi.mock('../../hooks/use-workflow', async (importOriginal) => { + const actual = await importOriginal() + + return { + ...actual, + useNodesReadOnly: () => ({ + nodesReadOnly: mockNodesReadOnly, + }), + } +}) vi.mock('@/app/components/workflow/block-icon', () => ({ __esModule: true, diff --git a/web/app/components/workflow/simple-node/index.tsx b/web/app/components/workflow/simple-node/index.tsx index 64f6f44cc9f..9aee353d578 100644 --- a/web/app/components/workflow/simple-node/index.tsx +++ b/web/app/components/workflow/simple-node/index.tsx @@ -9,10 +9,10 @@ import { } from '@remixicon/react' import { memo, useMemo } from 'react' import BlockIcon from '@/app/components/workflow/block-icon' -import { useNodesReadOnly } from '@/app/components/workflow/hooks' import NodeControl from '@/app/components/workflow/nodes/_base/components/node-control' import { NodeTargetHandle } from '@/app/components/workflow/nodes/_base/components/node-handle' import { NodeRunningStatus } from '@/app/components/workflow/types' +import { useNodesReadOnly } from '../hooks/use-workflow' type SimpleNodeProps = NodeProps diff --git a/web/app/components/workflow/store/workflow/node-slice.ts b/web/app/components/workflow/store/workflow/node-slice.ts index c1427e987b4..383a30eb224 100644 --- a/web/app/components/workflow/store/workflow/node-slice.ts +++ b/web/app/components/workflow/store/workflow/node-slice.ts @@ -1,5 +1,5 @@ import type { StateCreator } from 'zustand' -import type { ChecklistItem } from '@/app/components/workflow/hooks/use-checklist' +import type { ChecklistItem } from '../../hooks/use-checklist' import type { VariableAssignerNodeType } from '@/app/components/workflow/nodes/variable-assigner/types' import type { Node } from '@/app/components/workflow/types' import type { NodeTracing } from '@/types/workflow' diff --git a/web/app/components/workflow/variable-inspect/__tests__/group.spec.tsx b/web/app/components/workflow/variable-inspect/__tests__/group.spec.tsx index 642bb80e6c9..c954badaf73 100644 --- a/web/app/components/workflow/variable-inspect/__tests__/group.spec.tsx +++ b/web/app/components/workflow/variable-inspect/__tests__/group.spec.tsx @@ -6,8 +6,8 @@ import Group from '../group' const mockUseToolIcon = vi.fn(() => '') -vi.mock('../../hooks', async (importOriginal) => { - const actual = await importOriginal() +vi.mock('../../hooks/use-tool-icon', async (importOriginal) => { + const actual = await importOriginal() return { ...actual, useToolIcon: () => mockUseToolIcon(), diff --git a/web/app/components/workflow/variable-inspect/__tests__/listening.spec.tsx b/web/app/components/workflow/variable-inspect/__tests__/listening.spec.tsx index cde78a099ee..dccdf240519 100644 --- a/web/app/components/workflow/variable-inspect/__tests__/listening.spec.tsx +++ b/web/app/components/workflow/variable-inspect/__tests__/listening.spec.tsx @@ -10,7 +10,7 @@ vi.mock('copy-to-clipboard', () => ({ default: (...args: unknown[]) => mockCopy(...args), })) -vi.mock('@/app/components/workflow/hooks/use-tool-icon', () => ({ +vi.mock('../../hooks/use-tool-icon', () => ({ useGetToolIcon: () => () => 'tool-icon', })) diff --git a/web/app/components/workflow/variable-inspect/__tests__/panel.spec.tsx b/web/app/components/workflow/variable-inspect/__tests__/panel.spec.tsx index 1483effddc6..47c1d29e915 100644 --- a/web/app/components/workflow/variable-inspect/__tests__/panel.spec.tsx +++ b/web/app/components/workflow/variable-inspect/__tests__/panel.spec.tsx @@ -57,14 +57,14 @@ vi.mock('../../hooks/use-nodes-interactions', () => ({ }), })) -vi.mock('../../hooks', () => ({ +vi.mock('../../hooks/use-nodes-interactions', () => ({ useNodesInteractions: () => ({ handleNodeSelect: mockHandleNodeSelect, }), - useToolIcon: () => '', })) -vi.mock('@/app/components/workflow/hooks/use-tool-icon', () => ({ +vi.mock('../../hooks/use-tool-icon', () => ({ + useToolIcon: () => '', useGetToolIcon: () => () => '', })) diff --git a/web/app/components/workflow/variable-inspect/group.tsx b/web/app/components/workflow/variable-inspect/group.tsx index 094171c58d7..39611a977c8 100644 --- a/web/app/components/workflow/variable-inspect/group.tsx +++ b/web/app/components/workflow/variable-inspect/group.tsx @@ -16,7 +16,7 @@ import ActionButton from '@/app/components/base/action-button' import BlockIcon from '@/app/components/workflow/block-icon' import { VariableIconWithColor } from '@/app/components/workflow/nodes/_base/components/variable/variable-label' import { VarInInspectType } from '@/types/workflow' -import { useToolIcon } from '../hooks' +import { useToolIcon } from '../hooks/use-tool-icon' type Props = Readonly<{ nodeData?: NodeWithVar diff --git a/web/app/components/workflow/variable-inspect/listening.tsx b/web/app/components/workflow/variable-inspect/listening.tsx index 3f1caaf1dbb..f658105a92f 100644 --- a/web/app/components/workflow/variable-inspect/listening.tsx +++ b/web/app/components/workflow/variable-inspect/listening.tsx @@ -11,9 +11,9 @@ import { useTranslation } from 'react-i18next' import { useStoreApi } from 'reactflow' import { StopCircle } from '@/app/components/base/icons/src/vender/line/mediaAndDevices' import BlockIcon from '@/app/components/workflow/block-icon' -import { useGetToolIcon } from '@/app/components/workflow/hooks/use-tool-icon' import { getNextExecutionTime } from '@/app/components/workflow/nodes/trigger-schedule/utils/execution-time-calculator' import { BlockEnum } from '@/app/components/workflow/types' +import { useGetToolIcon } from '../hooks/use-tool-icon' import { useStore } from '../store' const resolveListeningDescription = ( diff --git a/web/app/components/workflow/variable-inspect/right.tsx b/web/app/components/workflow/variable-inspect/right.tsx index 2e07a1cc910..cce7a711209 100644 --- a/web/app/components/workflow/variable-inspect/right.tsx +++ b/web/app/components/workflow/variable-inspect/right.tsx @@ -25,9 +25,10 @@ import { AppModeEnum } from '@/types/app' import { VarInInspectType } from '@/types/workflow' import GetCodeGeneratorResModal from '../../app/configuration/config/code-generator/get-code-generator-res' import { PROMPT_EDITOR_UPDATE_VALUE_BY_EVENT_EMITTER } from '../../base/prompt-editor/plugins/update-block' -import { useNodesInteractions, useToolIcon } from '../hooks' import { useHooksStore } from '../hooks-store' import useCurrentVars from '../hooks/use-inspect-vars-crud' +import { useNodesInteractions } from '../hooks/use-nodes-interactions' +import { useToolIcon } from '../hooks/use-tool-icon' import useNodeCrud from '../nodes/_base/hooks/use-node-crud' import useNodeInfo from '../nodes/_base/hooks/use-node-info' import { CodeLanguage } from '../nodes/code/types'