Commit b113711a authored by StyleZhang's avatar StyleZhang

hooks

parent 68e95305
...@@ -8,79 +8,79 @@ const initialNodes = [ ...@@ -8,79 +8,79 @@ const initialNodes = [
{ {
id: '1', id: '1',
type: 'custom', type: 'custom',
position: { x: 0, y: 0 }, position: { x: 180, y: 180 },
data: { type: 'start' }, data: { type: 'start' },
}, },
{ // {
id: '2', // id: '2',
type: 'custom', // type: 'custom',
position: { x: 0, y: 0 }, // position: { x: 0, y: 0 },
data: { // data: {
type: 'if-else', // type: 'if-else',
branches: [ // branches: [
{ // {
id: 'if-true', // id: 'if-true',
name: 'IS TRUE', // name: 'IS TRUE',
}, // },
{ // {
id: 'if-false', // id: 'if-false',
name: 'IS FALSE', // name: 'IS FALSE',
}, // },
], // ],
}, // },
}, // },
{ // {
id: '3', // id: '3',
type: 'custom', // type: 'custom',
position: { x: 0, y: 0 }, // position: { x: 0, y: 0 },
data: { type: 'question-classifier', sortIndexInBranches: 0 }, // data: { type: 'question-classifier', sortIndexInBranches: 0 },
}, // },
{ // {
id: '4', // id: '4',
type: 'custom', // type: 'custom',
position: { x: 0, y: 0 }, // position: { x: 0, y: 0 },
data: { // data: {
type: 'if-else', // type: 'if-else',
sortIndexInBranches: 1, // sortIndexInBranches: 1,
branches: [ // branches: [
{ // {
id: 'if-true', // id: 'if-true',
name: 'IS TRUE', // name: 'IS TRUE',
}, // },
{ // {
id: 'if-false', // id: 'if-false',
name: 'IS FALSE', // name: 'IS FALSE',
}, // },
], // ],
}, // },
}, // },
] ]
const initialEdges = [ const initialEdges = [
{ // {
id: '0', // id: '0',
type: 'custom', // type: 'custom',
source: '1', // source: '1',
sourceHandle: 'source', // sourceHandle: 'source',
target: '2', // target: '2',
targetHandle: 'target', // targetHandle: 'target',
}, // },
{ // {
id: '1', // id: '1',
type: 'custom', // type: 'custom',
source: '2', // source: '2',
sourceHandle: 'if-true', // sourceHandle: 'if-true',
target: '3', // target: '3',
targetHandle: 'target', // targetHandle: 'target',
}, // },
{ // {
id: '2', // id: '2',
type: 'custom', // type: 'custom',
source: '2', // source: '2',
sourceHandle: 'if-false', // sourceHandle: 'if-false',
target: '4', // target: '4',
targetHandle: 'target', // targetHandle: 'target',
}, // },
] ]
const Page: FC = () => { const Page: FC = () => {
......
...@@ -34,7 +34,7 @@ export const NodeInitialData = { ...@@ -34,7 +34,7 @@ export const NodeInitialData = {
retrieval_mode: 'single', retrieval_mode: 'single',
}, },
[BlockEnum.IfElse]: { [BlockEnum.IfElse]: {
branches: [ targetBranches: [
{ {
id: 'if-true', id: 'if-true',
name: 'IS TRUE', name: 'IS TRUE',
......
...@@ -2,6 +2,7 @@ import { useCallback } from 'react' ...@@ -2,6 +2,7 @@ import { useCallback } from 'react'
import produce from 'immer' import produce from 'immer'
import type { import type {
EdgeMouseHandler, EdgeMouseHandler,
NodeDragHandler,
NodeMouseHandler, NodeMouseHandler,
OnConnect, OnConnect,
} from 'reactflow' } from 'reactflow'
...@@ -17,6 +18,7 @@ import type { ...@@ -17,6 +18,7 @@ import type {
} from './types' } from './types'
import { NodeInitialData } from './constants' import { NodeInitialData } from './constants'
import { getLayoutByDagre } from './utils' import { getLayoutByDagre } from './utils'
import { useStore } from './store'
export const useWorkflow = () => { export const useWorkflow = () => {
const store = useStoreApi() const store = useStoreApi()
...@@ -42,7 +44,30 @@ export const useWorkflow = () => { ...@@ -42,7 +44,30 @@ export const useWorkflow = () => {
setNodes(newNodes) setNodes(newNodes)
}, [store]) }, [store])
const handleEnterNode = useCallback<NodeMouseHandler>((_, node) => { const handleNodeDragStart = useCallback<NodeDragHandler>(() => {
useStore.getState().setIsDragging(true)
}, [])
const handleNodeDrag = useCallback<NodeDragHandler>((e, node: Node) => {
const {
getNodes,
setNodes,
} = store.getState()
e.stopPropagation()
const newNodes = produce(getNodes(), (draft) => {
const currentNode = draft.find(n => n.id === node.id)!
currentNode.position = node.position
})
setNodes(newNodes)
}, [store])
const handleNodeDragStop = useCallback<NodeDragHandler>(() => {
useStore.getState().setIsDragging(false)
}, [])
const handleNodeEnter = useCallback<NodeMouseHandler>((_, node) => {
const { const {
getNodes, getNodes,
setNodes, setNodes,
...@@ -67,7 +92,7 @@ export const useWorkflow = () => { ...@@ -67,7 +92,7 @@ export const useWorkflow = () => {
setEdges(newEdges) setEdges(newEdges)
}, [store]) }, [store])
const handleLeaveNode = useCallback<NodeMouseHandler>((_, node) => { const handleNodeLeave = useCallback<NodeMouseHandler>((_, node) => {
const { const {
getNodes, getNodes,
setNodes, setNodes,
...@@ -81,34 +106,37 @@ export const useWorkflow = () => { ...@@ -81,34 +106,37 @@ export const useWorkflow = () => {
}) })
setNodes(newNodes) setNodes(newNodes)
const newEdges = produce(edges, (draft) => { const newEdges = produce(edges, (draft) => {
const connectedEdges = getConnectedEdges([node], edges) draft.forEach((edge) => {
edge.data = { ...edge.data, connectedNodeIsHovering: false }
connectedEdges.forEach((edge) => {
const currentEdge = draft.find(e => e.id === edge.id)
if (currentEdge)
currentEdge.data = { ...currentEdge.data, connectedNodeIsHovering: false }
}) })
}) })
setEdges(newEdges) setEdges(newEdges)
}, [store]) }, [store])
const handleSelectNode = useCallback((nodeId: string, cancelSelection?: boolean) => { const handleNodeSelect = useCallback((nodeId: string, cancelSelection?: boolean) => {
const { const {
getNodes, getNodes,
setNodes, setNodes,
} = store.getState() } = store.getState()
const newNodes = produce(getNodes(), (draft) => { const newNodes = produce(getNodes(), (draft) => {
draft.forEach(node => node.selected = false) draft.forEach(node => node.data.selected = false)
const selectedNode = draft.find(node => node.id === nodeId)! const selectedNode = draft.find(node => node.id === nodeId)!
if (!cancelSelection) if (!cancelSelection)
selectedNode.selected = true selectedNode.data.selected = true
}) })
setNodes(newNodes) setNodes(newNodes)
}, [store]) }, [store])
const handleConnectNode = useCallback<OnConnect>(({ const handleNodeClick = useCallback<NodeMouseHandler>((_, node) => {
if (useStore.getState().isDragging)
return
handleNodeSelect(node.id)
}, [handleNodeSelect])
const handleNodeConnect = useCallback<OnConnect>(({
source, source,
sourceHandle, sourceHandle,
target, target,
...@@ -134,51 +162,31 @@ export const useWorkflow = () => { ...@@ -134,51 +162,31 @@ export const useWorkflow = () => {
return filtered return filtered
}) })
setEdges(newEdges) setEdges(newEdges)
handleLayout()
}, [store, handleLayout])
const handleEnterEdge = useCallback<EdgeMouseHandler>((_, edge) => {
const {
edges,
setEdges,
} = store.getState()
const newEdges = produce(edges, (draft) => {
const currentEdge = draft.find(e => e.id === edge.id)!
currentEdge.data = { ...currentEdge.data, hovering: true }
})
setEdges(newEdges)
}, [store]) }, [store])
const handleLeaveEdge = useCallback<EdgeMouseHandler>((_, edge) => { const handleNodeDelete = useCallback((nodeId: string) => {
const { const {
getNodes,
setNodes,
edges, edges,
setEdges, setEdges,
} = store.getState() } = store.getState()
const newEdges = produce(edges, (draft) => {
const currentEdge = draft.find(e => e.id === edge.id)!
currentEdge.data = { ...currentEdge.data, hovering: false }
})
setEdges(newEdges)
}, [store])
const handleDeleteEdge = useCallback(() => { const newNodes = produce(getNodes(), (draft) => {
const { const index = draft.findIndex(node => node.id === nodeId)
edges,
setEdges,
} = store.getState()
const newEdges = produce(edges, (draft) => {
const index = draft.findIndex(edge => edge.selected)
if (index > -1) if (index > -1)
draft.splice(index, 1) draft.splice(index, 1)
}) })
setNodes(newNodes)
const connectedEdges = getConnectedEdges([{ id: nodeId } as Node], edges)
const newEdges = produce(edges, (draft) => {
return draft.filter(edge => !connectedEdges.find(connectedEdge => connectedEdge.id === edge.id))
})
setEdges(newEdges) setEdges(newEdges)
handleLayout() }, [store])
}, [store, handleLayout])
const handleUpdateNodeData = useCallback(({ id, data }: SelectedNode) => { const handleNodeDataUpdate = useCallback(({ id, data }: SelectedNode) => {
const { const {
getNodes, getNodes,
setNodes, setNodes,
...@@ -191,7 +199,7 @@ export const useWorkflow = () => { ...@@ -191,7 +199,7 @@ export const useWorkflow = () => {
setNodes(newNodes) setNodes(newNodes)
}, [store]) }, [store])
const handleAddNextNode = useCallback((currentNodeId: string, nodeType: BlockEnum, sourceHandle: string) => { const handleNodeAddNext = useCallback((currentNodeId: string, nodeType: BlockEnum, sourceHandle: string) => {
const { const {
getNodes, getNodes,
setNodes, setNodes,
...@@ -203,12 +211,14 @@ export const useWorkflow = () => { ...@@ -203,12 +211,14 @@ export const useWorkflow = () => {
const nextNode: Node = { const nextNode: Node = {
id: `${Date.now()}`, id: `${Date.now()}`,
type: 'custom', type: 'custom',
data: NodeInitialData[nodeType], data: {
...NodeInitialData[nodeType],
selected: true,
},
position: { position: {
x: currentNode.position.x + 304, x: currentNode.position.x + 304,
y: currentNode.position.y, y: currentNode.position.y,
}, },
selected: true,
} }
const newEdge = { const newEdge = {
id: `${currentNode.id}-${nextNode.id}`, id: `${currentNode.id}-${nextNode.id}`,
...@@ -220,7 +230,7 @@ export const useWorkflow = () => { ...@@ -220,7 +230,7 @@ export const useWorkflow = () => {
} }
const newNodes = produce(nodes, (draft) => { const newNodes = produce(nodes, (draft) => {
draft.forEach((node) => { draft.forEach((node) => {
node.selected = false node.data.selected = false
}) })
draft.push(nextNode) draft.push(nextNode)
}) })
...@@ -231,7 +241,7 @@ export const useWorkflow = () => { ...@@ -231,7 +241,7 @@ export const useWorkflow = () => {
setEdges(newEdges) setEdges(newEdges)
}, [store]) }, [store])
const handleChangeCurrentNode = useCallback((currentNodeId: string, nodeType: BlockEnum, sourceHandle?: string) => { const handleNodeChange = useCallback((currentNodeId: string, nodeType: BlockEnum, sourceHandle?: string) => {
const { const {
getNodes, getNodes,
setNodes, setNodes,
...@@ -279,40 +289,64 @@ export const useWorkflow = () => { ...@@ -279,40 +289,64 @@ export const useWorkflow = () => {
} }
}, [store]) }, [store])
const handleDeleteNode = useCallback((nodeId: string) => { const handleEdgeEnter = useCallback<EdgeMouseHandler>((_, edge) => {
const { const {
getNodes,
setNodes,
edges, edges,
setEdges, setEdges,
} = store.getState() } = store.getState()
const newEdges = produce(edges, (draft) => {
const currentEdge = draft.find(e => e.id === edge.id)!
const newNodes = produce(getNodes(), (draft) => { currentEdge.data = { ...currentEdge.data, hovering: true }
const index = draft.findIndex(node => node.id === nodeId) })
setEdges(newEdges)
}, [store])
if (index > -1) const handleEdgeLeave = useCallback<EdgeMouseHandler>((_, edge) => {
draft.splice(index, 1) const {
edges,
setEdges,
} = store.getState()
const newEdges = produce(edges, (draft) => {
const currentEdge = draft.find(e => e.id === edge.id)!
currentEdge.data = { ...currentEdge.data, hovering: false }
}) })
setNodes(newNodes) setEdges(newEdges)
const connectedEdges = getConnectedEdges([{ id: nodeId } as Node], edges) }, [store])
const handleEdgeDelete = useCallback(() => {
const {
edges,
setEdges,
} = store.getState()
const newEdges = produce(edges, (draft) => { const newEdges = produce(edges, (draft) => {
return draft.filter(edge => !connectedEdges.find(connectedEdge => connectedEdge.id === edge.id)) const index = draft.findIndex(edge => edge.selected)
if (index > -1)
draft.splice(index, 1)
}) })
setEdges(newEdges) setEdges(newEdges)
}, [store]) }, [store])
return { return {
handleEnterNode,
handleLeaveNode,
handleSelectNode,
handleEnterEdge,
handleLeaveEdge,
handleConnectNode,
handleDeleteEdge,
handleUpdateNodeData,
handleAddNextNode,
handleChangeCurrentNode,
handleDeleteNode,
handleLayout, handleLayout,
handleNodeDragStart,
handleNodeDrag,
handleNodeDragStop,
handleNodeEnter,
handleNodeLeave,
handleNodeSelect,
handleNodeClick,
handleNodeConnect,
handleNodeDelete,
handleNodeDataUpdate,
handleNodeAddNext,
handleNodeChange,
handleEdgeEnter,
handleEdgeLeave,
handleEdgeDelete,
} }
} }
import type { FC } from 'react' import type { FC } from 'react'
import { memo, useEffect } from 'react' import {
memo,
// useEffect,
} from 'react'
import { useKeyPress } from 'ahooks' import { useKeyPress } from 'ahooks'
import ReactFlow, { import ReactFlow, {
Background, Background,
ReactFlowProvider, ReactFlowProvider,
useEdgesState, useEdgesState,
useNodesInitialized, // useNodesInitialized,
useNodesState, useNodesState,
} from 'reactflow' } from 'reactflow'
import 'reactflow/dist/style.css' import 'reactflow/dist/style.css'
import './style.css' // import './style.css'
import type { import type {
Edge, Edge,
Node, Node,
...@@ -42,24 +45,32 @@ const Workflow: FC<WorkflowProps> = memo(({ ...@@ -42,24 +45,32 @@ const Workflow: FC<WorkflowProps> = memo(({
const showFeaturesPanel = useStore(state => state.showFeaturesPanel) const showFeaturesPanel = useStore(state => state.showFeaturesPanel)
const [nodes] = useNodesState(initialNodes) const [nodes] = useNodesState(initialNodes)
const [edges, _, onEdgesChange] = useEdgesState(initialEdges) const [edges, _, onEdgesChange] = useEdgesState(initialEdges)
const nodesInitialized = useNodesInitialized() // const nodesInitialized = useNodesInitialized()
console.log(nodes)
const { const {
handleEnterNode, // handleLayout,
handleLeaveNode,
handleConnectNode, handleNodeDragStart,
handleEnterEdge, handleNodeDrag,
handleLeaveEdge, handleNodeDragStop,
handleDeleteEdge, handleNodeEnter,
handleLayout, handleNodeLeave,
handleNodeClick,
handleNodeConnect,
handleEdgeEnter,
handleEdgeLeave,
handleEdgeDelete,
} = useWorkflow() } = useWorkflow()
useEffect(() => { // useEffect(() => {
if (nodesInitialized) // if (nodesInitialized)
handleLayout() // handleLayout()
}, [nodesInitialized, handleLayout]) // }, [nodesInitialized, handleLayout])
useKeyPress('Backspace', handleDeleteEdge) useKeyPress('Backspace', handleEdgeDelete)
return ( return (
<div className='relative w-full h-full'> <div className='relative w-full h-full'>
...@@ -74,11 +85,15 @@ const Workflow: FC<WorkflowProps> = memo(({ ...@@ -74,11 +85,15 @@ const Workflow: FC<WorkflowProps> = memo(({
edgeTypes={edgeTypes} edgeTypes={edgeTypes}
nodes={nodes} nodes={nodes}
edges={edges} edges={edges}
onConnect={handleConnectNode} onNodeDragStart={handleNodeDragStart}
onNodeMouseEnter={handleEnterNode} onNodeDrag={handleNodeDrag}
onNodeMouseLeave={handleLeaveNode} onNodeDragStop={handleNodeDragStop}
onEdgeMouseEnter={handleEnterEdge} onNodeMouseEnter={handleNodeEnter}
onEdgeMouseLeave={handleLeaveEdge} onNodeMouseLeave={handleNodeLeave}
onNodeClick={handleNodeClick}
onConnect={handleNodeConnect}
onEdgeMouseEnter={handleEdgeEnter}
onEdgeMouseLeave={handleEdgeLeave}
onEdgesChange={onEdgesChange} onEdgesChange={onEdgesChange}
multiSelectionKeyCode={null} multiSelectionKeyCode={null}
connectionLineComponent={CustomConnectionLine} connectionLineComponent={CustomConnectionLine}
......
...@@ -17,11 +17,11 @@ const Add = ({ ...@@ -17,11 +17,11 @@ const Add = ({
sourceHandle, sourceHandle,
branchName, branchName,
}: AddProps) => { }: AddProps) => {
const { handleAddNextNode } = useWorkflow() const { handleNodeAddNext } = useWorkflow()
const handleSelect = useCallback((type: BlockEnum) => { const handleSelect = useCallback((type: BlockEnum) => {
handleAddNextNode(nodeId, type, sourceHandle) handleNodeAddNext(nodeId, type, sourceHandle)
}, [nodeId, sourceHandle, handleAddNextNode]) }, [nodeId, sourceHandle, handleNodeAddNext])
const renderTrigger = useCallback((open: boolean) => { const renderTrigger = useCallback((open: boolean) => {
return ( return (
......
...@@ -18,7 +18,7 @@ const NextStep = ({ ...@@ -18,7 +18,7 @@ const NextStep = ({
selectedNode, selectedNode,
}: NextStepProps) => { }: NextStepProps) => {
const store = useStoreApi() const store = useStoreApi()
const branches = selectedNode?.data.branches const branches = selectedNode?.data.targetBranches
const edges = useEdges() const edges = useEdges()
const outgoers = getOutgoers(selectedNode as Node, store.getState().getNodes(), edges) const outgoers = getOutgoers(selectedNode as Node, store.getState().getNodes(), edges)
const connectedEdges = getConnectedEdges([selectedNode] as Node[], edges).filter(edge => edge.source === selectedNode!.id) const connectedEdges = getConnectedEdges([selectedNode] as Node[], edges).filter(edge => edge.source === selectedNode!.id)
......
...@@ -23,10 +23,10 @@ const Item = ({ ...@@ -23,10 +23,10 @@ const Item = ({
branchName, branchName,
data, data,
}: ItemProps) => { }: ItemProps) => {
const { handleChangeCurrentNode } = useWorkflow() const { handleNodeChange } = useWorkflow()
const handleSelect = useCallback((type: BlockEnum) => { const handleSelect = useCallback((type: BlockEnum) => {
handleChangeCurrentNode(nodeId, type, sourceHandle) handleNodeChange(nodeId, type, sourceHandle)
}, [nodeId, sourceHandle, handleChangeCurrentNode]) }, [nodeId, sourceHandle, handleNodeChange])
const renderTrigger = useCallback((open: boolean) => { const renderTrigger = useCallback((open: boolean) => {
return ( return (
<Button <Button
......
...@@ -88,7 +88,7 @@ export const NodeSourceHandle = ({ ...@@ -88,7 +88,7 @@ export const NodeSourceHandle = ({
nodeSelectorClassName, nodeSelectorClassName,
}: NodeHandleProps) => { }: NodeHandleProps) => {
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
const { handleAddNextNode } = useWorkflow() const { handleNodeAddNext } = useWorkflow()
const edges = useEdges() const edges = useEdges()
const connectedEdges = getConnectedEdges([{ id } as Node], edges) const connectedEdges = getConnectedEdges([{ id } as Node], edges)
const connected = connectedEdges.find(edge => edge.sourceHandle === handleId && edge.source === id) const connected = connectedEdges.find(edge => edge.sourceHandle === handleId && edge.source === id)
...@@ -101,8 +101,8 @@ export const NodeSourceHandle = ({ ...@@ -101,8 +101,8 @@ export const NodeSourceHandle = ({
setOpen(v => !v) setOpen(v => !v)
}, [connected]) }, [connected])
const handleSelect = useCallback((type: BlockEnum) => { const handleSelect = useCallback((type: BlockEnum) => {
handleAddNextNode(id, type, handleId) handleNodeAddNext(id, type, handleId)
}, [handleAddNextNode, id, handleId]) }, [handleNodeAddNext, id, handleId])
return ( return (
<> <>
......
...@@ -12,11 +12,11 @@ type ChangeBlockProps = { ...@@ -12,11 +12,11 @@ type ChangeBlockProps = {
const ChangeBlock = ({ const ChangeBlock = ({
nodeId, nodeId,
}: ChangeBlockProps) => { }: ChangeBlockProps) => {
const { handleChangeCurrentNode } = useWorkflow() const { handleNodeChange } = useWorkflow()
const handleSelect = useCallback((type: BlockEnum) => { const handleSelect = useCallback((type: BlockEnum) => {
handleChangeCurrentNode(nodeId, type) handleNodeChange(nodeId, type)
}, [handleChangeCurrentNode, nodeId]) }, [handleNodeChange, nodeId])
const renderTrigger = useCallback(() => { const renderTrigger = useCallback(() => {
return ( return (
......
...@@ -17,7 +17,7 @@ type PanelOperatorProps = { ...@@ -17,7 +17,7 @@ type PanelOperatorProps = {
const PanelOperator = ({ const PanelOperator = ({
nodeId, nodeId,
}: PanelOperatorProps) => { }: PanelOperatorProps) => {
const { handleDeleteNode } = useWorkflow() const { handleNodeDelete } = useWorkflow()
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
return ( return (
...@@ -51,7 +51,7 @@ const PanelOperator = ({ ...@@ -51,7 +51,7 @@ const PanelOperator = ({
<div className='p-1'> <div className='p-1'>
<div <div
className='flex items-center px-3 h-8 text-sm text-gray-700 rounded-lg cursor-pointer hover:bg-gray-50' className='flex items-center px-3 h-8 text-sm text-gray-700 rounded-lg cursor-pointer hover:bg-gray-50'
onClick={() => handleDeleteNode(nodeId)} onClick={() => handleNodeDelete(nodeId)}
> >
Delete Delete
</div> </div>
......
...@@ -8,7 +8,6 @@ import { ...@@ -8,7 +8,6 @@ import {
} from 'react' } from 'react'
import type { NodeProps } from 'reactflow' import type { NodeProps } from 'reactflow'
import BlockIcon from '../../block-icon' import BlockIcon from '../../block-icon'
import { useWorkflow } from '../../hooks'
type BaseNodeProps = { type BaseNodeProps = {
children: ReactElement children: ReactElement
...@@ -17,19 +16,15 @@ type BaseNodeProps = { ...@@ -17,19 +16,15 @@ type BaseNodeProps = {
const BaseNode: FC<BaseNodeProps> = ({ const BaseNode: FC<BaseNodeProps> = ({
id, id,
data, data,
selected,
children, children,
}) => { }) => {
const { handleSelectNode } = useWorkflow()
return ( return (
<div <div
className={` className={`
group relative w-[240px] bg-[#fcfdff] rounded-2xl shadow-xs group relative w-[240px] bg-[#fcfdff] rounded-2xl shadow-xs
hover:shadow-lg hover:shadow-lg
${selected ? 'border-[2px] border-primary-600' : 'border border-white'} ${data.selected ? 'border-[2px] border-primary-600' : 'border border-white'}
`} `}
onClick={() => handleSelectNode(id)}
> >
<div className='flex items-center px-3 pt-3 pb-2'> <div className='flex items-center px-3 pt-3 pb-2'>
<BlockIcon <BlockIcon
......
...@@ -34,15 +34,15 @@ const BasePanel: FC<BasePanelProps> = ({ ...@@ -34,15 +34,15 @@ const BasePanel: FC<BasePanelProps> = ({
children, children,
}) => { }) => {
const { const {
handleSelectNode, handleNodeSelect,
handleUpdateNodeData, handleNodeDataUpdate,
} = useWorkflow() } = useWorkflow()
const handleTitleChange = useCallback((title: string) => { const handleTitleChange = useCallback((title: string) => {
handleUpdateNodeData({ id, data: { ...data, title } }) handleNodeDataUpdate({ id, data: { ...data, title } })
}, [handleUpdateNodeData, id, data]) }, [handleNodeDataUpdate, id, data])
const handleDescriptionChange = useCallback((desc: string) => { const handleDescriptionChange = useCallback((desc: string) => {
handleUpdateNodeData({ id, data: { ...data, desc } }) handleNodeDataUpdate({ id, data: { ...data, desc } })
}, [handleUpdateNodeData, id, data]) }, [handleNodeDataUpdate, id, data])
return ( return (
<div className='mr-2 w-[420px] h-full bg-white shadow-lg border-[0.5px] border-gray-200 rounded-2xl overflow-y-auto'> <div className='mr-2 w-[420px] h-full bg-white shadow-lg border-[0.5px] border-gray-200 rounded-2xl overflow-y-auto'>
...@@ -73,7 +73,7 @@ const BasePanel: FC<BasePanelProps> = ({ ...@@ -73,7 +73,7 @@ const BasePanel: FC<BasePanelProps> = ({
<div className='mx-3 w-[1px] h-3.5 bg-gray-200' /> <div className='mx-3 w-[1px] h-3.5 bg-gray-200' />
<div <div
className='flex items-center justify-center w-6 h-6 cursor-pointer' className='flex items-center justify-center w-6 h-6 cursor-pointer'
onClick={() => handleSelectNode(id, true)} onClick={() => handleNodeSelect(id, true)}
> >
<XClose className='w-4 h-4' /> <XClose className='w-4 h-4' />
</div> </div>
......
...@@ -16,7 +16,7 @@ const Panel: FC = () => { ...@@ -16,7 +16,7 @@ const Panel: FC = () => {
const mode = useStore(state => state.mode) const mode = useStore(state => state.mode)
const runStaus = useStore(state => state.runStaus) const runStaus = useStore(state => state.runStaus)
const nodes = useNodes<CommonNodeType>() const nodes = useNodes<CommonNodeType>()
const selectedNode = nodes.find(node => node.selected) const selectedNode = nodes.find(node => node.data.selected)
const showRunHistory = useStore(state => state.showRunHistory) const showRunHistory = useStore(state => state.showRunHistory)
const { const {
showWorkflowInfoPanel, showWorkflowInfoPanel,
......
...@@ -5,12 +5,14 @@ type State = { ...@@ -5,12 +5,14 @@ type State = {
showRunHistory: boolean showRunHistory: boolean
showFeaturesPanel: boolean showFeaturesPanel: boolean
runStaus: string runStaus: string
isDragging: boolean
} }
type Action = { type Action = {
setShowRunHistory: (showRunHistory: boolean) => void setShowRunHistory: (showRunHistory: boolean) => void
setShowFeaturesPanel: (showFeaturesPanel: boolean) => void setShowFeaturesPanel: (showFeaturesPanel: boolean) => void
setRunStaus: (runStaus: string) => void setRunStaus: (runStaus: string) => void
setIsDragging: (isDragging: boolean) => void
} }
export const useStore = create<State & Action>(set => ({ export const useStore = create<State & Action>(set => ({
...@@ -21,4 +23,6 @@ export const useStore = create<State & Action>(set => ({ ...@@ -21,4 +23,6 @@ export const useStore = create<State & Action>(set => ({
setShowFeaturesPanel: showFeaturesPanel => set(() => ({ showFeaturesPanel })), setShowFeaturesPanel: showFeaturesPanel => set(() => ({ showFeaturesPanel })),
runStaus: '', runStaus: '',
setRunStaus: runStaus => set(() => ({ runStaus })), setRunStaus: runStaus => set(() => ({ runStaus })),
isDragging: false,
setIsDragging: isDragging => set(() => ({ isDragging })),
})) }))
...@@ -28,6 +28,7 @@ export type CommonNodeType = { ...@@ -28,6 +28,7 @@ export type CommonNodeType = {
x: number x: number
y: number y: number
} }
selected?: boolean
hovering?: boolean hovering?: boolean
targetBranches?: Branch[] targetBranches?: Branch[]
title: string title: string
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment