123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- import React, { type FC, useRef, useState } from 'react'
- import { useTranslation } from 'react-i18next'
- import { RiLoader2Line } from '@remixicon/react'
- import { useCountDown } from 'ahooks'
- import Modal from '@/app/components/base/modal'
- import Button from '@/app/components/base/button'
- import { useEventEmitterContextContext } from '@/context/event-emitter'
- type IDefaultContentProps = {
- onCancel: () => void
- onConfirm: () => void
- }
- const DefaultContent: FC<IDefaultContentProps> = React.memo(({
- onCancel,
- onConfirm,
- }) => {
- const { t } = useTranslation()
- return (
- <>
- <div className='pb-4'>
- <span className='text-text-primary title-2xl-semi-bold'>{t('datasetDocuments.segment.regenerationConfirmTitle')}</span>
- <p className='text-text-secondary system-md-regular'>{t('datasetDocuments.segment.regenerationConfirmMessage')}</p>
- </div>
- <div className='flex justify-end gap-x-2 pt-6'>
- <Button onClick={onCancel}>
- {t('common.operation.cancel')}
- </Button>
- <Button variant='warning' destructive onClick={onConfirm}>
- {t('common.operation.regenerate')}
- </Button>
- </div>
- </>
- )
- })
- DefaultContent.displayName = 'DefaultContent'
- const RegeneratingContent: FC = React.memo(() => {
- const { t } = useTranslation()
- return (
- <>
- <div className='pb-4'>
- <span className='text-text-primary title-2xl-semi-bold'>{t('datasetDocuments.segment.regeneratingTitle')}</span>
- <p className='text-text-secondary system-md-regular'>{t('datasetDocuments.segment.regeneratingMessage')}</p>
- </div>
- <div className='flex justify-end pt-6'>
- <Button variant='warning' destructive disabled className='inline-flex items-center gap-x-0.5'>
- <RiLoader2Line className='w-4 h-4 text-components-button-destructive-primary-text-disabled animate-spin' />
- <span>{t('common.operation.regenerate')}</span>
- </Button>
- </div>
- </>
- )
- })
- RegeneratingContent.displayName = 'RegeneratingContent'
- type IRegenerationCompletedContentProps = {
- onClose: () => void
- }
- const RegenerationCompletedContent: FC<IRegenerationCompletedContentProps> = React.memo(({
- onClose,
- }) => {
- const { t } = useTranslation()
- const targetTime = useRef(Date.now() + 5000)
- const [countdown] = useCountDown({
- targetDate: targetTime.current,
- onEnd: () => {
- onClose()
- },
- })
- return (
- <>
- <div className='pb-4'>
- <span className='text-text-primary title-2xl-semi-bold'>{t('datasetDocuments.segment.regenerationSuccessTitle')}</span>
- <p className='text-text-secondary system-md-regular'>{t('datasetDocuments.segment.regenerationSuccessMessage')}</p>
- </div>
- <div className='flex justify-end pt-6'>
- <Button variant='primary' onClick={onClose}>
- {`${t('common.operation.close')}${countdown === 0 ? '' : `(${Math.round(countdown / 1000)})`}`}
- </Button>
- </div>
- </>
- )
- })
- RegenerationCompletedContent.displayName = 'RegenerationCompletedContent'
- type IRegenerationModalProps = {
- isShow: boolean
- onConfirm: () => void
- onCancel: () => void
- onClose: () => void
- }
- const RegenerationModal: FC<IRegenerationModalProps> = ({
- isShow,
- onConfirm,
- onCancel,
- onClose,
- }) => {
- const [loading, setLoading] = useState(false)
- const [updateSucceeded, setUpdateSucceeded] = useState(false)
- const { eventEmitter } = useEventEmitterContextContext()
- eventEmitter?.useSubscription((v) => {
- if (v === 'update-segment') {
- setLoading(true)
- setUpdateSucceeded(false)
- }
- if (v === 'update-segment-success')
- setUpdateSucceeded(true)
- if (v === 'update-segment-done')
- setLoading(false)
- })
- return (
- <Modal isShow={isShow} onClose={() => {}} className='!max-w-[480px] !rounded-2xl'>
- {!loading && !updateSucceeded && <DefaultContent onCancel={onCancel} onConfirm={onConfirm} />}
- {loading && !updateSucceeded && <RegeneratingContent />}
- {!loading && updateSucceeded && <RegenerationCompletedContent onClose={onClose} />}
- </Modal>
- )
- }
- export default RegenerationModal
|