create-content.tsx 2.6 KB

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