Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

control.tsx 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import type { MouseEvent } from 'react'
  2. import {
  3. memo,
  4. } from 'react'
  5. import { useTranslation } from 'react-i18next'
  6. import {
  7. RiCursorLine,
  8. RiFunctionAddLine,
  9. RiHand,
  10. RiStickyNoteAddLine,
  11. } from '@remixicon/react'
  12. import {
  13. useNodesReadOnly,
  14. useWorkflowMoveMode,
  15. useWorkflowOrganize,
  16. } from '../hooks'
  17. import {
  18. ControlMode,
  19. } from '../types'
  20. import { useStore } from '../store'
  21. import Divider from '../../base/divider'
  22. import AddBlock from './add-block'
  23. import TipPopup from './tip-popup'
  24. import ExportImage from './export-image'
  25. import { useOperator } from './hooks'
  26. import cn from '@/utils/classnames'
  27. const Control = () => {
  28. const { t } = useTranslation()
  29. const controlMode = useStore(s => s.controlMode)
  30. const { handleModePointer, handleModeHand } = useWorkflowMoveMode()
  31. const { handleLayout } = useWorkflowOrganize()
  32. const { handleAddNote } = useOperator()
  33. const {
  34. nodesReadOnly,
  35. getNodesReadOnly,
  36. } = useNodesReadOnly()
  37. const addNote = (e: MouseEvent<HTMLDivElement>) => {
  38. if (getNodesReadOnly())
  39. return
  40. e.stopPropagation()
  41. handleAddNote()
  42. }
  43. return (
  44. <div className='flex items-center rounded-lg border-[0.5px] border-components-actionbar-border bg-components-actionbar-bg p-0.5 text-text-tertiary shadow-lg'>
  45. <AddBlock />
  46. <TipPopup title={t('workflow.nodes.note.addNote')}>
  47. <div
  48. className={cn(
  49. 'ml-[1px] flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg hover:bg-state-base-hover hover:text-text-secondary',
  50. `${nodesReadOnly && 'cursor-not-allowed text-text-disabled hover:bg-transparent hover:text-text-disabled'}`,
  51. )}
  52. onClick={addNote}
  53. >
  54. <RiStickyNoteAddLine className='h-4 w-4' />
  55. </div>
  56. </TipPopup>
  57. <Divider type='vertical' className='mx-0.5 h-3.5' />
  58. <TipPopup title={t('workflow.common.pointerMode')} shortcuts={['v']}>
  59. <div
  60. className={cn(
  61. 'mr-[1px] flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg',
  62. controlMode === ControlMode.Pointer ? 'bg-state-accent-active text-text-accent' : 'hover:bg-state-base-hover hover:text-text-secondary',
  63. `${nodesReadOnly && 'cursor-not-allowed text-text-disabled hover:bg-transparent hover:text-text-disabled'}`,
  64. )}
  65. onClick={handleModePointer}
  66. >
  67. <RiCursorLine className='h-4 w-4' />
  68. </div>
  69. </TipPopup>
  70. <TipPopup title={t('workflow.common.handMode')} shortcuts={['h']}>
  71. <div
  72. className={cn(
  73. 'flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg',
  74. controlMode === ControlMode.Hand ? 'bg-state-accent-active text-text-accent' : 'hover:bg-state-base-hover hover:text-text-secondary',
  75. `${nodesReadOnly && 'cursor-not-allowed text-text-disabled hover:bg-transparent hover:text-text-disabled'}`,
  76. )}
  77. onClick={handleModeHand}
  78. >
  79. <RiHand className='h-4 w-4' />
  80. </div>
  81. </TipPopup>
  82. <Divider type='vertical' className='mx-0.5 h-3.5' />
  83. <ExportImage />
  84. <TipPopup title={t('workflow.panel.organizeBlocks')} shortcuts={['ctrl', 'o']}>
  85. <div
  86. className={cn(
  87. 'flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg hover:bg-state-base-hover hover:text-text-secondary',
  88. `${nodesReadOnly && 'cursor-not-allowed text-text-disabled hover:bg-transparent hover:text-text-disabled'}`,
  89. )}
  90. onClick={handleLayout}
  91. >
  92. <RiFunctionAddLine className='h-4 w-4' />
  93. </div>
  94. </TipPopup>
  95. </div>
  96. )
  97. }
  98. export default memo(Control)