mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-08-14 14:45:53 +08:00
fix: workflow sync data (#3824)
This commit is contained in:
parent
1a7b4c42ab
commit
d36b728088
@ -2,11 +2,11 @@ import {
|
|||||||
useCallback,
|
useCallback,
|
||||||
useEffect,
|
useEffect,
|
||||||
useMemo,
|
useMemo,
|
||||||
|
useState,
|
||||||
} from 'react'
|
} from 'react'
|
||||||
import dayjs from 'dayjs'
|
import dayjs from 'dayjs'
|
||||||
import { uniqBy } from 'lodash-es'
|
import { uniqBy } from 'lodash-es'
|
||||||
import { useContext } from 'use-context-selector'
|
import { useContext } from 'use-context-selector'
|
||||||
import useSWR from 'swr'
|
|
||||||
import produce from 'immer'
|
import produce from 'immer'
|
||||||
import {
|
import {
|
||||||
getIncomers,
|
getIncomers,
|
||||||
@ -52,6 +52,7 @@ import {
|
|||||||
fetchWorkflowDraft,
|
fetchWorkflowDraft,
|
||||||
syncWorkflowDraft,
|
syncWorkflowDraft,
|
||||||
} from '@/service/workflow'
|
} from '@/service/workflow'
|
||||||
|
import type { FetchWorkflowDraftResponse } from '@/types/workflow'
|
||||||
import {
|
import {
|
||||||
fetchAllBuiltInTools,
|
fetchAllBuiltInTools,
|
||||||
fetchAllCustomTools,
|
fetchAllCustomTools,
|
||||||
@ -403,9 +404,45 @@ export const useWorkflowInit = () => {
|
|||||||
} = useWorkflowTemplate()
|
} = useWorkflowTemplate()
|
||||||
const { handleFetchAllTools } = useFetchToolsData()
|
const { handleFetchAllTools } = useFetchToolsData()
|
||||||
const appDetail = useAppStore(state => state.appDetail)!
|
const appDetail = useAppStore(state => state.appDetail)!
|
||||||
const { data, isLoading, error, mutate } = useSWR(`/apps/${appDetail.id}/workflows/draft`, fetchWorkflowDraft)
|
const [data, setData] = useState<FetchWorkflowDraftResponse>()
|
||||||
|
const [isLoading, setIsLoading] = useState(true)
|
||||||
workflowStore.setState({ appId: appDetail.id })
|
workflowStore.setState({ appId: appDetail.id })
|
||||||
|
|
||||||
|
const handleGetInitialWorkflowData = useCallback(async () => {
|
||||||
|
try {
|
||||||
|
const res = await fetchWorkflowDraft(`/apps/${appDetail.id}/workflows/draft`)
|
||||||
|
|
||||||
|
setData(res)
|
||||||
|
setIsLoading(false)
|
||||||
|
}
|
||||||
|
catch (error: any) {
|
||||||
|
if (error && error.json && !error.bodyUsed && appDetail) {
|
||||||
|
error.json().then((err: any) => {
|
||||||
|
if (err.code === 'draft_workflow_not_exist') {
|
||||||
|
workflowStore.setState({ notInitialWorkflow: true })
|
||||||
|
syncWorkflowDraft({
|
||||||
|
url: `/apps/${appDetail.id}/workflows/draft`,
|
||||||
|
params: {
|
||||||
|
graph: {
|
||||||
|
nodes: nodesTemplate,
|
||||||
|
edges: edgesTemplate,
|
||||||
|
},
|
||||||
|
features: {},
|
||||||
|
},
|
||||||
|
}).then((res) => {
|
||||||
|
workflowStore.getState().setDraftUpdatedAt(res.updated_at)
|
||||||
|
handleGetInitialWorkflowData()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [appDetail, nodesTemplate, edgesTemplate, workflowStore])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
handleGetInitialWorkflowData()
|
||||||
|
}, [])
|
||||||
|
|
||||||
const handleFetchPreloadData = useCallback(async () => {
|
const handleFetchPreloadData = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
const nodesDefaultConfigsData = await fetchNodesDefaultConfigs(`/apps/${appDetail?.id}/workflows/default-workflow-block-configs`)
|
const nodesDefaultConfigsData = await fetchNodesDefaultConfigs(`/apps/${appDetail?.id}/workflows/default-workflow-block-configs`)
|
||||||
@ -435,27 +472,6 @@ export const useWorkflowInit = () => {
|
|||||||
workflowStore.getState().setDraftUpdatedAt(data.updated_at)
|
workflowStore.getState().setDraftUpdatedAt(data.updated_at)
|
||||||
}, [data, workflowStore])
|
}, [data, workflowStore])
|
||||||
|
|
||||||
if (error && error.json && !error.bodyUsed && appDetail) {
|
|
||||||
error.json().then((err: any) => {
|
|
||||||
if (err.code === 'draft_workflow_not_exist') {
|
|
||||||
workflowStore.setState({ notInitialWorkflow: true })
|
|
||||||
syncWorkflowDraft({
|
|
||||||
url: `/apps/${appDetail.id}/workflows/draft`,
|
|
||||||
params: {
|
|
||||||
graph: {
|
|
||||||
nodes: nodesTemplate,
|
|
||||||
edges: edgesTemplate,
|
|
||||||
},
|
|
||||||
features: {},
|
|
||||||
},
|
|
||||||
}).then((res) => {
|
|
||||||
workflowStore.getState().setDraftUpdatedAt(res.updated_at)
|
|
||||||
mutate()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
data,
|
data,
|
||||||
isLoading,
|
isLoading,
|
||||||
|
@ -17,7 +17,6 @@ import ReactFlow, {
|
|||||||
useEdgesState,
|
useEdgesState,
|
||||||
useNodesState,
|
useNodesState,
|
||||||
useOnViewportChange,
|
useOnViewportChange,
|
||||||
useReactFlow,
|
|
||||||
} from 'reactflow'
|
} from 'reactflow'
|
||||||
import type { Viewport } from 'reactflow'
|
import type { Viewport } from 'reactflow'
|
||||||
import 'reactflow/dist/style.css'
|
import 'reactflow/dist/style.css'
|
||||||
@ -72,7 +71,6 @@ const Workflow: FC<WorkflowProps> = memo(({
|
|||||||
edges: originalEdges,
|
edges: originalEdges,
|
||||||
viewport,
|
viewport,
|
||||||
}) => {
|
}) => {
|
||||||
const reactflow = useReactFlow()
|
|
||||||
const [nodes, setNodes] = useNodesState(originalNodes)
|
const [nodes, setNodes] = useNodesState(originalNodes)
|
||||||
const [edges, setEdges] = useEdgesState(originalEdges)
|
const [edges, setEdges] = useEdgesState(originalEdges)
|
||||||
const showFeaturesPanel = useStore(state => state.showFeaturesPanel)
|
const showFeaturesPanel = useStore(state => state.showFeaturesPanel)
|
||||||
@ -93,17 +91,6 @@ const Workflow: FC<WorkflowProps> = memo(({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
setNodes(originalNodes)
|
|
||||||
}, [originalNodes, setNodes])
|
|
||||||
useEffect(() => {
|
|
||||||
setEdges(originalEdges)
|
|
||||||
}, [originalEdges, setEdges])
|
|
||||||
useEffect(() => {
|
|
||||||
if (viewport)
|
|
||||||
reactflow.setViewport(viewport)
|
|
||||||
}, [reactflow, viewport])
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setAutoFreeze(false)
|
setAutoFreeze(false)
|
||||||
|
|
||||||
@ -155,8 +142,6 @@ const Workflow: FC<WorkflowProps> = memo(({
|
|||||||
} = useEdgesInteractions()
|
} = useEdgesInteractions()
|
||||||
const {
|
const {
|
||||||
isValidConnection,
|
isValidConnection,
|
||||||
enableShortcuts,
|
|
||||||
disableShortcuts,
|
|
||||||
} = useWorkflow()
|
} = useWorkflow()
|
||||||
|
|
||||||
useOnViewportChange({
|
useOnViewportChange({
|
||||||
@ -193,8 +178,6 @@ const Workflow: FC<WorkflowProps> = memo(({
|
|||||||
edgeTypes={edgeTypes}
|
edgeTypes={edgeTypes}
|
||||||
nodes={nodes}
|
nodes={nodes}
|
||||||
edges={edges}
|
edges={edges}
|
||||||
onPointerDown={enableShortcuts}
|
|
||||||
onMouseLeave={disableShortcuts}
|
|
||||||
onNodeDragStart={handleNodeDragStart}
|
onNodeDragStart={handleNodeDragStart}
|
||||||
onNodeDrag={handleNodeDrag}
|
onNodeDrag={handleNodeDrag}
|
||||||
onNodeDragStop={handleNodeDragStop}
|
onNodeDragStop={handleNodeDragStop}
|
||||||
|
@ -8,7 +8,10 @@ import { useShallow } from 'zustand/react/shallow'
|
|||||||
import type { CommonNodeType } from '../types'
|
import type { CommonNodeType } from '../types'
|
||||||
import { Panel as NodePanel } from '../nodes'
|
import { Panel as NodePanel } from '../nodes'
|
||||||
import { useStore } from '../store'
|
import { useStore } from '../store'
|
||||||
import { useIsChatMode } from '../hooks'
|
import {
|
||||||
|
useIsChatMode,
|
||||||
|
useWorkflow,
|
||||||
|
} from '../hooks'
|
||||||
import DebugAndPreview from './debug-and-preview'
|
import DebugAndPreview from './debug-and-preview'
|
||||||
import Record from './record'
|
import Record from './record'
|
||||||
import WorkflowPreview from './workflow-preview'
|
import WorkflowPreview from './workflow-preview'
|
||||||
@ -24,6 +27,10 @@ const Panel: FC = () => {
|
|||||||
const workflowRunningData = useStore(s => s.workflowRunningData)
|
const workflowRunningData = useStore(s => s.workflowRunningData)
|
||||||
const historyWorkflowData = useStore(s => s.historyWorkflowData)
|
const historyWorkflowData = useStore(s => s.historyWorkflowData)
|
||||||
const isRestoring = useStore(s => s.isRestoring)
|
const isRestoring = useStore(s => s.isRestoring)
|
||||||
|
const {
|
||||||
|
enableShortcuts,
|
||||||
|
disableShortcuts,
|
||||||
|
} = useWorkflow()
|
||||||
const { currentLogItem, setCurrentLogItem, showMessageLogModal, setShowMessageLogModal } = useAppStore(useShallow(state => ({
|
const { currentLogItem, setCurrentLogItem, showMessageLogModal, setShowMessageLogModal } = useAppStore(useShallow(state => ({
|
||||||
currentLogItem: state.currentLogItem,
|
currentLogItem: state.currentLogItem,
|
||||||
setCurrentLogItem: state.setCurrentLogItem,
|
setCurrentLogItem: state.setCurrentLogItem,
|
||||||
@ -49,7 +56,13 @@ const Panel: FC = () => {
|
|||||||
])
|
])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='absolute top-14 right-0 bottom-2 flex z-10' key={`${isRestoring}`}>
|
<div
|
||||||
|
tabIndex={-1}
|
||||||
|
className='absolute top-14 right-0 bottom-2 flex z-10 outline-none'
|
||||||
|
onFocus={disableShortcuts}
|
||||||
|
onBlur={enableShortcuts}
|
||||||
|
key={`${isRestoring}`}
|
||||||
|
>
|
||||||
{
|
{
|
||||||
showMessageLogModal && (
|
showMessageLogModal && (
|
||||||
<MessageLogModal
|
<MessageLogModal
|
||||||
|
Loading…
x
Reference in New Issue
Block a user