node-handle.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import type { MouseEvent } from 'react'
  2. import {
  3. memo,
  4. useCallback,
  5. useState,
  6. } from 'react'
  7. import cn from 'classnames'
  8. import {
  9. Handle,
  10. Position,
  11. } from 'reactflow'
  12. import type { VariableAssignerNodeType } from '../types'
  13. import AddVariable from './add-variable'
  14. import type { NodeOutPutVar } from '@/app/components/workflow/types'
  15. import { useStore } from '@/app/components/workflow/store'
  16. type NodeHandleProps = {
  17. handleId?: string
  18. connected?: boolean
  19. variableAssignerNodeId: string
  20. availableVars: NodeOutPutVar[]
  21. variableAssignerNodeData: VariableAssignerNodeType
  22. }
  23. const NodeHandle = ({
  24. connected,
  25. variableAssignerNodeId,
  26. handleId = 'target',
  27. availableVars,
  28. variableAssignerNodeData,
  29. }: NodeHandleProps) => {
  30. const [open, setOpen] = useState(false)
  31. const connectingNodePayload = useStore(s => s.connectingNodePayload)
  32. const isUnConnectable = connectingNodePayload?.handleType === 'source'
  33. const handleOpenChange = useCallback((v: boolean) => {
  34. setOpen(v)
  35. }, [])
  36. const handleHandleClick = useCallback((e: MouseEvent) => {
  37. e.stopPropagation()
  38. setOpen(v => !v)
  39. }, [])
  40. return (
  41. <Handle
  42. id={handleId}
  43. type='target'
  44. onClick={handleHandleClick}
  45. position={Position.Left}
  46. isConnectable={!isUnConnectable}
  47. className={cn(
  48. '!-left-[13px] !top-1 !w-4 !h-4 !bg-transparent !rounded-none !outline-none !border-none z-[1] !transform-none',
  49. 'after:absolute after:w-0.5 after:h-2 after:left-[5px] after:top-1 after:bg-primary-500 pointer-events-none',
  50. !connected && 'after:opacity-0',
  51. )}
  52. >
  53. <AddVariable
  54. open={open}
  55. onOpenChange={handleOpenChange}
  56. variableAssignerNodeId={variableAssignerNodeId}
  57. variableAssignerNodeData={variableAssignerNodeData}
  58. handleId={handleId}
  59. availableVars={availableVars}
  60. />
  61. </Handle>
  62. )
  63. }
  64. export default memo(NodeHandle)