You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

version-info-modal.tsx 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import React, { type FC, useCallback, useState } from 'react'
  2. import Modal from '@/app/components/base/modal'
  3. import type { VersionHistory } from '@/types/workflow'
  4. import { useTranslation } from 'react-i18next'
  5. import { RiCloseLine } from '@remixicon/react'
  6. import Input from '../../base/input'
  7. import Textarea from '../../base/textarea'
  8. import Button from '../../base/button'
  9. import Toast from '@/app/components/base/toast'
  10. type VersionInfoModalProps = {
  11. isOpen: boolean
  12. versionInfo?: VersionHistory
  13. onClose: () => void
  14. onPublish: (params: { title: string; releaseNotes: string; id?: string }) => void
  15. }
  16. const TITLE_MAX_LENGTH = 15
  17. const RELEASE_NOTES_MAX_LENGTH = 100
  18. const VersionInfoModal: FC<VersionInfoModalProps> = ({
  19. isOpen,
  20. versionInfo,
  21. onClose,
  22. onPublish,
  23. }) => {
  24. const { t } = useTranslation()
  25. const [title, setTitle] = useState(versionInfo?.marked_name || '')
  26. const [releaseNotes, setReleaseNotes] = useState(versionInfo?.marked_comment || '')
  27. const [titleError, setTitleError] = useState(false)
  28. const [releaseNotesError, setReleaseNotesError] = useState(false)
  29. const handlePublish = () => {
  30. if (title.length > TITLE_MAX_LENGTH) {
  31. setTitleError(true)
  32. Toast.notify({
  33. type: 'error',
  34. message: t('workflow.versionHistory.editField.titleLengthLimit', { limit: TITLE_MAX_LENGTH }),
  35. })
  36. return
  37. }
  38. else {
  39. titleError && setTitleError(false)
  40. }
  41. if (releaseNotes.length > RELEASE_NOTES_MAX_LENGTH) {
  42. setReleaseNotesError(true)
  43. Toast.notify({
  44. type: 'error',
  45. message: t('workflow.versionHistory.editField.releaseNotesLengthLimit', { limit: RELEASE_NOTES_MAX_LENGTH }),
  46. })
  47. return
  48. }
  49. else {
  50. releaseNotesError && setReleaseNotesError(false)
  51. }
  52. onPublish({ title, releaseNotes, id: versionInfo?.id })
  53. onClose()
  54. }
  55. const handleTitleChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
  56. setTitle(e.target.value)
  57. }, [])
  58. const handleDescriptionChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {
  59. setReleaseNotes(e.target.value)
  60. }, [])
  61. return <Modal className='p-0' isShow={isOpen} onClose={onClose}>
  62. <div className='relative w-full p-6 pb-4 pr-14'>
  63. <div className='text-text-primary title-2xl-semi-bold first-letter:capitalize'>
  64. {versionInfo?.marked_name ? t('workflow.versionHistory.editVersionInfo') : t('workflow.versionHistory.nameThisVersion')}
  65. </div>
  66. <div className='w-8 h-8 flex items-center justify-center p-1.5 absolute top-5 right-5 cursor-pointer' onClick={onClose}>
  67. <RiCloseLine className='w-[18px] h-[18px] text-text-tertiary' />
  68. </div>
  69. </div>
  70. <div className='flex flex-col gap-y-4 px-6 py-3'>
  71. <div className='flex flex-col gap-y-1'>
  72. <div className='flex items-center h-6 text-text-secondary system-sm-semibold'>
  73. {t('workflow.versionHistory.editField.title')}
  74. </div>
  75. <Input
  76. value={title}
  77. placeholder={t('workflow.versionHistory.nameThisVersion')}
  78. onChange={handleTitleChange}
  79. destructive={titleError}
  80. />
  81. </div>
  82. <div className='flex flex-col gap-y-1'>
  83. <div className='flex items-center h-6 text-text-secondary system-sm-semibold'>
  84. {t('workflow.versionHistory.editField.releaseNotes')}
  85. </div>
  86. <Textarea
  87. value={releaseNotes}
  88. placeholder={t('workflow.versionHistory.releaseNotesPlaceholder')}
  89. onChange={handleDescriptionChange}
  90. destructive={releaseNotesError}
  91. />
  92. </div>
  93. </div>
  94. <div className='flex justify-end p-6 pt-5'>
  95. <div className='flex items-center gap-x-3'>
  96. <Button onClick={onClose}>{t('common.operation.cancel')}</Button>
  97. <Button variant='primary' onClick={handlePublish}>{t('workflow.common.publish')}</Button>
  98. </div>
  99. </div>
  100. </Modal>
  101. }
  102. export default VersionInfoModal