index.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import {
  2. memo,
  3. useCallback,
  4. useState,
  5. } from 'react'
  6. import cn from 'classnames'
  7. import { useVariableAssigner } from '../../hooks'
  8. import type { VariableAssignerNodeType } from '../../types'
  9. import {
  10. PortalToFollowElem,
  11. PortalToFollowElemContent,
  12. PortalToFollowElemTrigger,
  13. } from '@/app/components/base/portal-to-follow-elem'
  14. import { Plus02 } from '@/app/components/base/icons/src/vender/line/general'
  15. import AddVariablePopup from '@/app/components/workflow/nodes/_base/components/add-variable-popup'
  16. import type {
  17. NodeOutPutVar,
  18. ValueSelector,
  19. Var,
  20. } from '@/app/components/workflow/types'
  21. export type AddVariableProps = {
  22. variableAssignerNodeId: string
  23. variableAssignerNodeData: VariableAssignerNodeType
  24. availableVars: NodeOutPutVar[]
  25. handleId?: string
  26. }
  27. const AddVariable = ({
  28. availableVars,
  29. variableAssignerNodeId,
  30. variableAssignerNodeData,
  31. handleId,
  32. }: AddVariableProps) => {
  33. const [open, setOpen] = useState(false)
  34. const { handleAssignVariableValueChange } = useVariableAssigner()
  35. const handleSelectVariable = useCallback((v: ValueSelector, varDetail: Var) => {
  36. handleAssignVariableValueChange(
  37. variableAssignerNodeId,
  38. v,
  39. varDetail,
  40. handleId,
  41. )
  42. setOpen(false)
  43. }, [handleAssignVariableValueChange, variableAssignerNodeId, handleId, setOpen])
  44. return (
  45. <div className={cn(
  46. open && '!flex',
  47. variableAssignerNodeData.selected && '!flex',
  48. )}>
  49. <PortalToFollowElem
  50. placement={'right'}
  51. offset={4}
  52. open={open}
  53. onOpenChange={setOpen}
  54. >
  55. <PortalToFollowElemTrigger
  56. onClick={() => setOpen(!open)}
  57. >
  58. <div
  59. className={cn(
  60. 'group/addvariable flex items-center justify-center',
  61. 'w-4 h-4 cursor-pointer',
  62. 'hover:rounded-full hover:bg-primary-600',
  63. open && '!rounded-full !bg-primary-600',
  64. )}
  65. >
  66. <Plus02
  67. className={cn(
  68. 'w-2.5 h-2.5 text-gray-500',
  69. 'group-hover/addvariable:text-white',
  70. open && '!text-white',
  71. )}
  72. />
  73. </div>
  74. </PortalToFollowElemTrigger>
  75. <PortalToFollowElemContent className='z-[1000]'>
  76. <AddVariablePopup
  77. onSelect={handleSelectVariable}
  78. availableVars={availableVars}
  79. />
  80. </PortalToFollowElemContent>
  81. </PortalToFollowElem>
  82. </div>
  83. )
  84. }
  85. export default memo(AddVariable)