選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

regeneration-modal.tsx 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import React, { type FC, useRef, useState } from 'react'
  2. import { useTranslation } from 'react-i18next'
  3. import { RiLoader2Line } from '@remixicon/react'
  4. import { useCountDown } from 'ahooks'
  5. import Modal from '@/app/components/base/modal'
  6. import Button from '@/app/components/base/button'
  7. import { useEventEmitterContextContext } from '@/context/event-emitter'
  8. import { noop } from 'lodash-es'
  9. type IDefaultContentProps = {
  10. onCancel: () => void
  11. onConfirm: () => void
  12. }
  13. const DefaultContent: FC<IDefaultContentProps> = React.memo(({
  14. onCancel,
  15. onConfirm,
  16. }) => {
  17. const { t } = useTranslation()
  18. return (
  19. <>
  20. <div className='pb-4'>
  21. <span className='title-2xl-semi-bold text-text-primary'>{t('datasetDocuments.segment.regenerationConfirmTitle')}</span>
  22. <p className='system-md-regular text-text-secondary'>{t('datasetDocuments.segment.regenerationConfirmMessage')}</p>
  23. </div>
  24. <div className='flex justify-end gap-x-2 pt-6'>
  25. <Button onClick={onCancel}>
  26. {t('common.operation.cancel')}
  27. </Button>
  28. <Button variant='warning' destructive onClick={onConfirm}>
  29. {t('common.operation.regenerate')}
  30. </Button>
  31. </div>
  32. </>
  33. )
  34. })
  35. DefaultContent.displayName = 'DefaultContent'
  36. const RegeneratingContent: FC = React.memo(() => {
  37. const { t } = useTranslation()
  38. return (
  39. <>
  40. <div className='pb-4'>
  41. <span className='title-2xl-semi-bold text-text-primary'>{t('datasetDocuments.segment.regeneratingTitle')}</span>
  42. <p className='system-md-regular text-text-secondary'>{t('datasetDocuments.segment.regeneratingMessage')}</p>
  43. </div>
  44. <div className='flex justify-end pt-6'>
  45. <Button variant='warning' destructive disabled className='inline-flex items-center gap-x-0.5'>
  46. <RiLoader2Line className='h-4 w-4 animate-spin text-components-button-destructive-primary-text-disabled' />
  47. <span>{t('common.operation.regenerate')}</span>
  48. </Button>
  49. </div>
  50. </>
  51. )
  52. })
  53. RegeneratingContent.displayName = 'RegeneratingContent'
  54. type IRegenerationCompletedContentProps = {
  55. onClose: () => void
  56. }
  57. const RegenerationCompletedContent: FC<IRegenerationCompletedContentProps> = React.memo(({
  58. onClose,
  59. }) => {
  60. const { t } = useTranslation()
  61. const targetTime = useRef(Date.now() + 5000)
  62. const [countdown] = useCountDown({
  63. targetDate: targetTime.current,
  64. onEnd: () => {
  65. onClose()
  66. },
  67. })
  68. return (
  69. <>
  70. <div className='pb-4'>
  71. <span className='title-2xl-semi-bold text-text-primary'>{t('datasetDocuments.segment.regenerationSuccessTitle')}</span>
  72. <p className='system-md-regular text-text-secondary'>{t('datasetDocuments.segment.regenerationSuccessMessage')}</p>
  73. </div>
  74. <div className='flex justify-end pt-6'>
  75. <Button variant='primary' onClick={onClose}>
  76. {`${t('common.operation.close')}${countdown === 0 ? '' : `(${Math.round(countdown / 1000)})`}`}
  77. </Button>
  78. </div>
  79. </>
  80. )
  81. })
  82. RegenerationCompletedContent.displayName = 'RegenerationCompletedContent'
  83. type IRegenerationModalProps = {
  84. isShow: boolean
  85. onConfirm: () => void
  86. onCancel: () => void
  87. onClose: () => void
  88. }
  89. const RegenerationModal: FC<IRegenerationModalProps> = ({
  90. isShow,
  91. onConfirm,
  92. onCancel,
  93. onClose,
  94. }) => {
  95. const [loading, setLoading] = useState(false)
  96. const [updateSucceeded, setUpdateSucceeded] = useState(false)
  97. const { eventEmitter } = useEventEmitterContextContext()
  98. eventEmitter?.useSubscription((v) => {
  99. if (v === 'update-segment') {
  100. setLoading(true)
  101. setUpdateSucceeded(false)
  102. }
  103. if (v === 'update-segment-success')
  104. setUpdateSucceeded(true)
  105. if (v === 'update-segment-done')
  106. setLoading(false)
  107. })
  108. return (
  109. <Modal isShow={isShow} onClose={noop} className='!max-w-[480px] !rounded-2xl'>
  110. {!loading && !updateSucceeded && <DefaultContent onCancel={onCancel} onConfirm={onConfirm} />}
  111. {loading && !updateSucceeded && <RegeneratingContent />}
  112. {!loading && updateSucceeded && <RegenerationCompletedContent onClose={onClose} />}
  113. </Modal>
  114. )
  115. }
  116. export default RegenerationModal