import React, { useState } from 'react' import { Trans, useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' import { RiCloseLine } from '@remixicon/react' import { useAppContext } from '@/context/app-context' import { ToastContext } from '@/app/components/base/toast' import Modal from '@/app/components/base/modal' import Button from '@/app/components/base/button' import Input from '@/app/components/base/input' import MemberSelector from './member-selector' import { ownershipTransfer, sendOwnerEmail, verifyOwnerEmail, } from '@/service/common' import { noop } from 'lodash-es' type Props = { show: boolean onClose: () => void } enum STEP { start = 'start', verify = 'verify', transfer = 'transfer', } const TransferOwnershipModal = ({ onClose, show }: Props) => { const { t } = useTranslation() const { notify } = useContext(ToastContext) const { currentWorkspace, userProfile } = useAppContext() const [step, setStep] = useState(STEP.start) const [code, setCode] = useState('') const [time, setTime] = useState(0) const [stepToken, setStepToken] = useState('') const [newOwner, setNewOwner] = useState('') const [isTransfer, setIsTransfer] = useState(false) const startCount = () => { setTime(60) const timer = setInterval(() => { setTime((prev) => { if (prev <= 0) { clearInterval(timer) return 0 } return prev - 1 }) }, 1000) } const sendEmail = async () => { try { const res = await sendOwnerEmail({}) startCount() if (res.data) setStepToken(res.data) } catch (error) { notify({ type: 'error', message: `Error sending verification code: ${error ? (error as any).message : ''}`, }) } } const verifyEmailAddress = async (code: string, token: string, callback?: () => void) => { try { const res = await verifyOwnerEmail({ code, token, }) if (res.is_valid) { setStepToken(res.token) callback?.() } else { notify({ type: 'error', message: 'Verifying email failed', }) } } catch (error) { notify({ type: 'error', message: `Error verifying email: ${error ? (error as any).message : ''}`, }) } } const sendCodeToOriginEmail = async () => { await sendEmail() setStep(STEP.verify) } const handleVerifyOriginEmail = async () => { await verifyEmailAddress(code, stepToken, () => setStep(STEP.transfer)) setCode('') } const handleTransfer = async () => { setIsTransfer(true) try { await ownershipTransfer( newOwner, { token: stepToken, }, ) globalThis.location.reload() } catch (error) { notify({ type: 'error', message: `Error ownership transfer: ${error ? (error as any).message : ''}`, }) } finally { setIsTransfer(false) } } return (
{step === STEP.start && ( <>
{t('common.members.transferModal.title')}
{t('common.members.transferModal.warning', { workspace: currentWorkspace.name.replace(/'/g, '’') })}
{t('common.members.transferModal.warningTip')}
}} values={{ email: userProfile.email }} />
)} {step === STEP.verify && ( <>
{t('common.members.transferModal.verifyEmail')}
}} values={{ email: userProfile.email }} />
{t('common.members.transferModal.verifyContent2')}
{t('common.members.transferModal.codeLabel')}
setCode(e.target.value)} maxLength={6} />
{t('common.members.transferModal.resendTip')} {time > 0 && ( {t('common.members.transferModal.resendCount', { count: time })} )} {!time && ( {t('common.members.transferModal.resend')} )}
)} {step === STEP.transfer && ( <>
{t('common.members.transferModal.title')}
{t('common.members.transferModal.warning', { workspace: currentWorkspace.name.replace(/'/g, '’') })}
{t('common.members.transferModal.warningTip')}
{t('common.members.transferModal.transferLabel')}
)}
) } export default TransferOwnershipModal