mirror of
https://github.com/langgenius/dify.git
synced 2026-04-28 20:17:29 +08:00
chore
This commit is contained in:
parent
94cda3e837
commit
9b577fa32c
@ -7,17 +7,17 @@ import {
|
|||||||
getSimpleBezierPath,
|
getSimpleBezierPath,
|
||||||
} from 'reactflow'
|
} from 'reactflow'
|
||||||
import BlockSelector from './block-selector'
|
import BlockSelector from './block-selector'
|
||||||
import { useStore } from './store'
|
|
||||||
|
|
||||||
const CustomEdge = ({
|
const CustomEdge = ({
|
||||||
id,
|
id,
|
||||||
|
data,
|
||||||
sourceX,
|
sourceX,
|
||||||
sourceY,
|
sourceY,
|
||||||
targetX,
|
targetX,
|
||||||
targetY,
|
targetY,
|
||||||
selected,
|
selected,
|
||||||
}: EdgeProps) => {
|
}: EdgeProps) => {
|
||||||
const hoveringEdgeId = useStore(state => state.hoveringEdgeId)
|
console.log()
|
||||||
const [
|
const [
|
||||||
edgePath,
|
edgePath,
|
||||||
labelX,
|
labelX,
|
||||||
@ -43,7 +43,7 @@ const CustomEdge = ({
|
|||||||
/>
|
/>
|
||||||
<EdgeLabelRenderer>
|
<EdgeLabelRenderer>
|
||||||
{
|
{
|
||||||
hoveringEdgeId === id && (
|
data?.hovering && (
|
||||||
<div
|
<div
|
||||||
className='nopan nodrag'
|
className='nopan nodrag'
|
||||||
style={{
|
style={{
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import type { FC } from 'react'
|
import type { FC } from 'react'
|
||||||
import { memo } from 'react'
|
import { memo } from 'react'
|
||||||
import { useWorkflowContext } from '../context'
|
import { useStore } from '../store'
|
||||||
import RunAndHistory from './run-and-history'
|
import RunAndHistory from './run-and-history'
|
||||||
import { Edit03 } from '@/app/components/base/icons/src/vender/solid/general'
|
import { Edit03 } from '@/app/components/base/icons/src/vender/solid/general'
|
||||||
import { Grid01 } from '@/app/components/base/icons/src/vender/line/layout'
|
import { Grid01 } from '@/app/components/base/icons/src/vender/line/layout'
|
||||||
@ -8,7 +8,7 @@ import Button from '@/app/components/base/button'
|
|||||||
import { ArrowNarrowLeft } from '@/app/components/base/icons/src/vender/line/arrows'
|
import { ArrowNarrowLeft } from '@/app/components/base/icons/src/vender/line/arrows'
|
||||||
|
|
||||||
const Header: FC = () => {
|
const Header: FC = () => {
|
||||||
const { mode } = useWorkflowContext()
|
const mode = useStore(state => state.mode)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import { useCallback } from 'react'
|
|||||||
import produce from 'immer'
|
import produce from 'immer'
|
||||||
import type {
|
import type {
|
||||||
Edge,
|
Edge,
|
||||||
|
EdgeMouseHandler,
|
||||||
} from 'reactflow'
|
} from 'reactflow'
|
||||||
import type {
|
import type {
|
||||||
BlockEnum,
|
BlockEnum,
|
||||||
@ -55,9 +56,29 @@ export const useWorkflow = (
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
}, [setNodes])
|
}, [setNodes])
|
||||||
|
const handleEnterEdge = useCallback<EdgeMouseHandler>((_, edge) => {
|
||||||
|
setEdges((oldEdges) => {
|
||||||
|
return produce(oldEdges, (draft) => {
|
||||||
|
const currentEdge = draft.find(e => e.id === edge.id)
|
||||||
|
if (currentEdge)
|
||||||
|
currentEdge.data = { ...currentEdge.data, hovering: true }
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}, [setEdges])
|
||||||
|
const handleLeaveEdge = useCallback<EdgeMouseHandler>((_, edge) => {
|
||||||
|
setEdges((oldEdges) => {
|
||||||
|
return produce(oldEdges, (draft) => {
|
||||||
|
const currentEdge = draft.find(e => e.id === edge.id)
|
||||||
|
if (currentEdge)
|
||||||
|
currentEdge.data = { ...currentEdge.data, hovering: false }
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}, [setEdges])
|
||||||
|
|
||||||
return {
|
return {
|
||||||
handleAddNextNode,
|
handleAddNextNode,
|
||||||
handleUpdateNodeData,
|
handleUpdateNodeData,
|
||||||
|
handleEnterEdge,
|
||||||
|
handleLeaveEdge,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import type { FC } from 'react'
|
import type { FC } from 'react'
|
||||||
import { memo } from 'react'
|
import { memo, useEffect } from 'react'
|
||||||
import type { Edge } from 'reactflow'
|
import type { Edge } from 'reactflow'
|
||||||
import ReactFlow, {
|
import ReactFlow, {
|
||||||
Background,
|
Background,
|
||||||
@ -71,17 +71,26 @@ const WorkflowWrap: FC<WorkflowWrapProps> = memo(({
|
|||||||
selectedNodeId: initialSelectedNodeId,
|
selectedNodeId: initialSelectedNodeId,
|
||||||
}) => {
|
}) => {
|
||||||
const [nodes, setNodes] = useNodesState(initialNodes)
|
const [nodes, setNodes] = useNodesState(initialNodes)
|
||||||
const [edges, setEdges] = useEdgesState(initialEdges)
|
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges)
|
||||||
|
|
||||||
const {
|
const {
|
||||||
handleAddNextNode,
|
handleAddNextNode,
|
||||||
handleUpdateNodeData,
|
handleUpdateNodeData,
|
||||||
|
handleEnterEdge,
|
||||||
|
handleLeaveEdge,
|
||||||
} = useWorkflow(
|
} = useWorkflow(
|
||||||
nodes,
|
nodes,
|
||||||
edges,
|
edges,
|
||||||
setNodes,
|
setNodes,
|
||||||
setEdges,
|
setEdges,
|
||||||
)
|
)
|
||||||
|
const handleSelectedNodeId = useStore(state => state.handleSelectedNodeId)
|
||||||
|
useEffect(() => {
|
||||||
|
if (initialSelectedNodeId)
|
||||||
|
handleSelectedNodeId(initialSelectedNodeId)
|
||||||
|
}, [initialSelectedNodeId, handleSelectedNodeId])
|
||||||
|
// const handleEnterEdge = useStore(state => state.handleEnterEdge)
|
||||||
|
// const handleLeaveEdge = useStore(state => state.handleLeaveEdge)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<WorkflowContext.Provider value={{
|
<WorkflowContext.Provider value={{
|
||||||
@ -91,7 +100,25 @@ const WorkflowWrap: FC<WorkflowWrapProps> = memo(({
|
|||||||
handleAddNextNode,
|
handleAddNextNode,
|
||||||
handleUpdateNodeData,
|
handleUpdateNodeData,
|
||||||
}}>
|
}}>
|
||||||
<Workflow />
|
<div className='relative w-full h-full'>
|
||||||
|
<Header />
|
||||||
|
<Panel />
|
||||||
|
<ZoomInOut />
|
||||||
|
<ReactFlow
|
||||||
|
nodeTypes={nodeTypes}
|
||||||
|
edgeTypes={edgeTypes}
|
||||||
|
nodes={nodes}
|
||||||
|
edges={edges}
|
||||||
|
onEdgesChange={onEdgesChange}
|
||||||
|
onEdgeMouseEnter={handleEnterEdge}
|
||||||
|
onEdgeMouseLeave={handleLeaveEdge}
|
||||||
|
>
|
||||||
|
<Background
|
||||||
|
gap={[14, 14]}
|
||||||
|
size={1}
|
||||||
|
/>
|
||||||
|
</ReactFlow>
|
||||||
|
</div>
|
||||||
</WorkflowContext.Provider>
|
</WorkflowContext.Provider>
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|||||||
@ -17,11 +17,12 @@ import NodeControl from './components/node-control'
|
|||||||
|
|
||||||
type BaseNodeProps = {
|
type BaseNodeProps = {
|
||||||
children: ReactElement
|
children: ReactElement
|
||||||
} & Pick<NodeProps, 'id' | 'data'>
|
} & NodeProps
|
||||||
|
|
||||||
const BaseNode: FC<BaseNodeProps> = ({
|
const BaseNode: FC<BaseNodeProps> = ({
|
||||||
id: nodeId,
|
id: nodeId,
|
||||||
data,
|
data,
|
||||||
|
selected,
|
||||||
children,
|
children,
|
||||||
}) => {
|
}) => {
|
||||||
const nodes = useNodes<NodeData>()
|
const nodes = useNodes<NodeData>()
|
||||||
|
|||||||
@ -14,11 +14,9 @@ import {
|
|||||||
import BaseNode from './_base/node'
|
import BaseNode from './_base/node'
|
||||||
import BasePanel from './_base/panel'
|
import BasePanel from './_base/panel'
|
||||||
|
|
||||||
const CustomNode = ({
|
const CustomNode = (props: NodeProps) => {
|
||||||
id,
|
const nodeData = props.data
|
||||||
data,
|
const NodeComponent = NodeComponentMap[nodeData.type]
|
||||||
}: NodeProps) => {
|
|
||||||
const NodeComponent = NodeComponentMap[data.type]
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@ -28,14 +26,11 @@ const CustomNode = ({
|
|||||||
className={`
|
className={`
|
||||||
!top-[17px] !left-0 !w-4 !h-4 !bg-transparent !rounded-none !outline-none !border-none !translate-y-0 z-[1]
|
!top-[17px] !left-0 !w-4 !h-4 !bg-transparent !rounded-none !outline-none !border-none !translate-y-0 z-[1]
|
||||||
after:absolute after:w-0.5 after:h-2 after:-left-0.5 after:top-1 after:bg-primary-500
|
after:absolute after:w-0.5 after:h-2 after:-left-0.5 after:top-1 after:bg-primary-500
|
||||||
${data.type === BlockEnum.Start && 'opacity-0'}
|
${nodeData.type === BlockEnum.Start && 'opacity-0'}
|
||||||
`}
|
`}
|
||||||
isConnectable={data.type !== BlockEnum.Start}
|
isConnectable={nodeData.type !== BlockEnum.Start}
|
||||||
/>
|
/>
|
||||||
<BaseNode
|
<BaseNode { ...props }>
|
||||||
id={id}
|
|
||||||
data={data}
|
|
||||||
>
|
|
||||||
<NodeComponent />
|
<NodeComponent />
|
||||||
</BaseNode>
|
</BaseNode>
|
||||||
<Handle
|
<Handle
|
||||||
|
|||||||
@ -2,6 +2,7 @@ import { create } from 'zustand'
|
|||||||
import type { EdgeMouseHandler } from 'reactflow'
|
import type { EdgeMouseHandler } from 'reactflow'
|
||||||
|
|
||||||
type State = {
|
type State = {
|
||||||
|
mode: string
|
||||||
selectedNodeId: string
|
selectedNodeId: string
|
||||||
hoveringEdgeId: string
|
hoveringEdgeId: string
|
||||||
}
|
}
|
||||||
@ -13,6 +14,7 @@ type Action = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const useStore = create<State & Action>(set => ({
|
export const useStore = create<State & Action>(set => ({
|
||||||
|
mode: 'workflow',
|
||||||
selectedNodeId: '',
|
selectedNodeId: '',
|
||||||
handleSelectedNodeId: selectedNodeId => set(() => ({ selectedNodeId })),
|
handleSelectedNodeId: selectedNodeId => set(() => ({ selectedNodeId })),
|
||||||
hoveringEdgeId: '',
|
hoveringEdgeId: '',
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user