Commit 9b577fa3 authored by StyleZhang's avatar StyleZhang

chore

parent 94cda3e8
...@@ -7,17 +7,17 @@ import { ...@@ -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 = ({ ...@@ -43,7 +43,7 @@ const CustomEdge = ({
/> />
<EdgeLabelRenderer> <EdgeLabelRenderer>
{ {
hoveringEdgeId === id && ( data?.hovering && (
<div <div
className='nopan nodrag' className='nopan nodrag'
style={{ style={{
......
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' ...@@ -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' ...@@ -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 = ( ...@@ -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,
} }
} }
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(({ ...@@ -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(({ ...@@ -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' ...@@ -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 { ...@@ -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 = ({ ...@@ -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' ...@@ -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 = { ...@@ -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: '',
......
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