diff --git a/web/app/components/workflow/header/editing-title.tsx b/web/app/components/workflow/header/editing-title.tsx index 6cff4d99a..44a85631d 100644 --- a/web/app/components/workflow/header/editing-title.tsx +++ b/web/app/components/workflow/header/editing-title.tsx @@ -10,6 +10,7 @@ const EditingTitle = () => { const { formatTimeFromNow } = useWorkflow() const draftUpdatedAt = useStore(state => state.draftUpdatedAt) const publishedAt = useStore(state => state.publishedAt) + const isSyncingWorkflowDraft = useStore(s => s.isSyncingWorkflowDraft) return (
@@ -26,6 +27,14 @@ const EditingTitle = () => { ? `${t('workflow.common.published')} ${formatTimeFromNow(publishedAt)}` : t('workflow.common.unpublished') } + { + isSyncingWorkflowDraft && ( + <> + · + {t('workflow.common.syncingData')} + + ) + }
) } diff --git a/web/app/components/workflow/hooks/use-workflow-interactions.ts b/web/app/components/workflow/hooks/use-workflow-interactions.ts index 5d5e98146..e110d7c44 100644 --- a/web/app/components/workflow/hooks/use-workflow-interactions.ts +++ b/web/app/components/workflow/hooks/use-workflow-interactions.ts @@ -57,11 +57,13 @@ export const useWorkflowUpdate = () => { const { appId, setSyncWorkflowDraftHash, + setIsSyncingWorkflowDraft, } = workflowStore.getState() + setIsSyncingWorkflowDraft(true) fetchWorkflowDraft(`/apps/${appId}/workflows/draft`).then((response) => { handleUpdateWorkflowCanvas(response.graph as WorkflowDataUpdator) setSyncWorkflowDraftHash(response.hash) - }) + }).finally(() => setIsSyncingWorkflowDraft(false)) }, [handleUpdateWorkflowCanvas, workflowStore]) return { diff --git a/web/app/components/workflow/index.tsx b/web/app/components/workflow/index.tsx index 882ed2f3a..e9ae8dd84 100644 --- a/web/app/components/workflow/index.tsx +++ b/web/app/components/workflow/index.tsx @@ -55,6 +55,7 @@ import HelpLine from './help-line' import CandidateNode from './candidate-node' import PanelContextmenu from './panel-contextmenu' import NodeContextmenu from './node-contextmenu' +import SyncingDataModal from './syncing-data-modal' import { useStore, useWorkflowStore, @@ -99,7 +100,10 @@ const Workflow: FC = memo(({ const controlMode = useStore(s => s.controlMode) const nodeAnimation = useStore(s => s.nodeAnimation) const showConfirm = useStore(s => s.showConfirm) - const { setShowConfirm } = workflowStore.getState() + const { + setShowConfirm, + setControlPromptEditorRerenderKey, + } = workflowStore.getState() const { handleSyncWorkflowDraft, syncWorkflowDraftWhenPageClose, @@ -113,6 +117,7 @@ const Workflow: FC = memo(({ if (v.type === WORKFLOW_DATA_UPDATE) { setNodes(v.payload.nodes) setEdges(v.payload.edges) + setTimeout(() => setControlPromptEditorRerenderKey(Date.now())) } }) @@ -135,7 +140,7 @@ const Workflow: FC = memo(({ if (document.visibilityState === 'hidden') syncWorkflowDraftWhenPageClose() else if (document.visibilityState === 'visible') - handleRefreshWorkflowDraft() + setTimeout(() => handleRefreshWorkflowDraft(), 500) }, [syncWorkflowDraftWhenPageClose, handleRefreshWorkflowDraft]) useEffect(() => { @@ -223,6 +228,7 @@ const Workflow: FC = memo(({ `} ref={workflowContainerRef} > +
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 6c354c0a2..1f14c0e85 100644 --- a/web/app/components/workflow/nodes/_base/components/prompt/editor.tsx +++ b/web/app/components/workflow/nodes/_base/components/prompt/editor.tsx @@ -27,6 +27,7 @@ import TooltipPlus from '@/app/components/base/tooltip-plus' import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor/editor-support-vars' import Switch from '@/app/components/base/switch' import { Jinja } from '@/app/components/base/icons/src/vender/workflow' +import { useStore } from '@/app/components/workflow/store' type Props = { className?: string @@ -82,6 +83,7 @@ const Editor: FC = ({ }) => { const { t } = useTranslation() const { eventEmitter } = useEventEmitterContextContext() + const controlPromptEditorRerenderKey = useStore(s => s.controlPromptEditorRerenderKey) const isShowHistory = !isChatModel && isChatApp @@ -173,6 +175,7 @@ const Editor: FC = ({ ? (
void + isSyncingWorkflowDraft: boolean + setIsSyncingWorkflowDraft: (isSyncingWorkflowDraft: boolean) => void + controlPromptEditorRerenderKey: number + setControlPromptEditorRerenderKey: (controlPromptEditorRerenderKey: number) => void } export const createWorkflowStore = () => { @@ -209,6 +213,10 @@ export const createWorkflowStore = () => { setConnectingNodePayload: connectingNodePayload => set(() => ({ connectingNodePayload })), enteringNodePayload: undefined, setEnteringNodePayload: enteringNodePayload => set(() => ({ enteringNodePayload })), + isSyncingWorkflowDraft: false, + setIsSyncingWorkflowDraft: isSyncingWorkflowDraft => set(() => ({ isSyncingWorkflowDraft })), + controlPromptEditorRerenderKey: 0, + setControlPromptEditorRerenderKey: controlPromptEditorRerenderKey => set(() => ({ controlPromptEditorRerenderKey })), })) } diff --git a/web/app/components/workflow/syncing-data-modal.tsx b/web/app/components/workflow/syncing-data-modal.tsx new file mode 100644 index 000000000..fe3843d2f --- /dev/null +++ b/web/app/components/workflow/syncing-data-modal.tsx @@ -0,0 +1,15 @@ +import { useStore } from './store' + +const SyncingDataModal = () => { + const isSyncingWorkflowDraft = useStore(s => s.isSyncingWorkflowDraft) + + if (!isSyncingWorkflowDraft) + return null + + return ( +
+
+ ) +} + +export default SyncingDataModal diff --git a/web/i18n/en-US/workflow.ts b/web/i18n/en-US/workflow.ts index 82e2cca04..9ac975f8a 100644 --- a/web/i18n/en-US/workflow.ts +++ b/web/i18n/en-US/workflow.ts @@ -67,6 +67,7 @@ const translation = { manageInTools: 'Manage in Tools', workflowAsToolTip: 'Tool reconfiguration is required after the workflow update.', viewDetailInTracingPanel: 'View details', + syncingData: 'Syncing data, just a few seconds.', }, errorMsg: { fieldRequired: '{{field}} is required', diff --git a/web/i18n/zh-Hans/workflow.ts b/web/i18n/zh-Hans/workflow.ts index e384f590f..83b933bc8 100644 --- a/web/i18n/zh-Hans/workflow.ts +++ b/web/i18n/zh-Hans/workflow.ts @@ -67,6 +67,7 @@ const translation = { manageInTools: '访问工具页', workflowAsToolTip: '工作流更新后需要重新配置工具参数', viewDetailInTracingPanel: '查看详细信息', + syncingData: '同步数据中,只需几秒钟。', }, errorMsg: { fieldRequired: '{{field}} 不能为空',