Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

create-content.tsx 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React, { useCallback, useState } from 'react'
  4. import { DataType } from '../types'
  5. import ModalLikeWrap from '../../../base/modal-like-wrap'
  6. import Field from './field'
  7. import OptionCard from '../../../workflow/nodes/_base/components/option-card'
  8. import Input from '@/app/components/base/input'
  9. import { RiArrowLeftLine } from '@remixicon/react'
  10. import { useTranslation } from 'react-i18next'
  11. import { noop } from 'lodash-es'
  12. const i18nPrefix = 'dataset.metadata.createMetadata'
  13. export type Props = {
  14. onClose?: () => void
  15. onSave: (data: any) => void
  16. hasBack?: boolean
  17. onBack?: () => void
  18. }
  19. const CreateContent: FC<Props> = ({
  20. onClose = noop,
  21. hasBack,
  22. onBack,
  23. onSave,
  24. }) => {
  25. const { t } = useTranslation()
  26. const [type, setType] = useState(DataType.string)
  27. const handleTypeChange = useCallback((newType: DataType) => {
  28. return () => setType(newType)
  29. }, [setType])
  30. const [name, setName] = useState('')
  31. const handleNameChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
  32. setName(e.target.value)
  33. }, [setName])
  34. const handleSave = useCallback(() => {
  35. onSave({
  36. type,
  37. name,
  38. })
  39. }, [onSave, type, name])
  40. return (
  41. <ModalLikeWrap
  42. title={t(`${i18nPrefix}.title`)}
  43. onClose={onClose}
  44. onConfirm={handleSave}
  45. hideCloseBtn={hasBack}
  46. beforeHeader={hasBack && (
  47. <div className='relative left-[-4px] mb-1 flex cursor-pointer items-center space-x-1 py-1 text-text-accent' onClick={onBack}>
  48. <RiArrowLeftLine className='size-4' />
  49. <div className='system-xs-semibold-uppercase'>{t(`${i18nPrefix}.back`)}</div>
  50. </div>
  51. )}
  52. >
  53. <div className='space-y-3'>
  54. <Field label={t(`${i18nPrefix}.type`)}>
  55. <div className='grid grid-cols-3 gap-2'>
  56. <OptionCard
  57. title='String'
  58. selected={type === DataType.string}
  59. onSelect={handleTypeChange(DataType.string)}
  60. />
  61. <OptionCard
  62. title='Number'
  63. selected={type === DataType.number}
  64. onSelect={handleTypeChange(DataType.number)}
  65. />
  66. <OptionCard
  67. title='Time'
  68. selected={type === DataType.time}
  69. onSelect={handleTypeChange(DataType.time)}
  70. />
  71. </div>
  72. </Field>
  73. <Field label={t(`${i18nPrefix}.name`)}>
  74. <Input
  75. value={name}
  76. onChange={handleNameChange}
  77. placeholder={t(`${i18nPrefix}.namePlaceholder`)}
  78. />
  79. </Field>
  80. </div>
  81. </ModalLikeWrap>
  82. )
  83. }
  84. export default React.memo(CreateContent)