import { Box, Card, CircularProgress, FormControl, FormLabel, Input, Option, Select, Typography, } from '@mui/joy' import { useCallback, useEffect, useState } from 'react' import ModalActions from '../../../components/common/ModalActions' import { useNavigate } from 'react-router-dom' import { useResponsiveModal } from '../../../hooks/useResponsiveModal' import { CheckUserDeletion, DeleteUser } from '../../../utils/Fetcher' import { useTranslation } from 'react-i18next' function UserDeletionModal({ isOpen, onClose }) { const { t } = useTranslation('settings') const { ResponsiveModal } = useResponsiveModal() const Navigate = useNavigate() const [step, setStep] = useState(1) // 1: Warning, 2: Transfer, 3: Confirm const [password, setPassword] = useState('') const [confirmation, setConfirmation] = useState('') const [transferOptions, setTransferOptions] = useState([]) const [circlesRequiringTransfer, setCirclesRequiringTransfer] = useState([]) const [availableMembers, setAvailableMembers] = useState([]) const [loading, setLoading] = useState(false) const [error, setError] = useState('') const resetModal = useCallback(() => { setStep(1) setPassword('') setConfirmation('') setTransferOptions([]) setCirclesRequiringTransfer([]) setAvailableMembers([]) setError('') }, []) const handleClose = useCallback( success => { resetModal() onClose(success) }, [onClose, resetModal], ) const checkDeletionRequirements = async () => { if (password.trim() === '') { setError(t('deletion.passwordRequired')) return } setLoading(true) setError('') try { const response = await CheckUserDeletion(password) const data = await response.json() if (response.ok) { if (data.requiresTransfer && data.circles) { setCirclesRequiringTransfer(data.circles) setAvailableMembers(data.availableMembers || []) setStep(2) } else { setStep(3) } } else { setError(data.error || 'Failed to check deletion requirements') } } catch (err) { console.error('Failed to check deletion requirements:', err) setError('Failed to check deletion requirements') } finally { setLoading(false) } } const handleTransferSelection = (circleId, newOwnerId, newOwnerName) => { setTransferOptions(prev => { const existing = prev.find(t => t.circleId === circleId) if (existing) { return prev.map(t => t.circleId === circleId ? { ...t, newOwnerId, newOwnerName } : t, ) } else { return [...prev, { circleId, newOwnerId, newOwnerName }] } }) } const proceedToConfirmation = () => { if (circlesRequiringTransfer.length === transferOptions.length) { setStep(3) } } const executeUserDeletion = async () => { if (password.trim() === '' || confirmation !== 'DELETE') { setError(t('deletion.passwordAndDelete')) return } setLoading(true) setError('') try { const response = await DeleteUser(password, confirmation, transferOptions) const data = await response.json() console.log(response) if (response.status === 200) { // Clear authentication tokens localStorage.removeItem('ca_token') localStorage.removeItem('ca_expiration') Navigate('/login', { replace: true }) handleClose(true) // Redirect to login or home page after successful deletion } else { setError(data.message || 'Failed to delete account') } } catch (err) { console.error('Failed to delete account:', err) setError(t('deletion.failed')) } finally { setLoading(false) } } // Keyboard shortcuts useEffect(() => { const handleKeyDown = event => { if (!isOpen) return if (event.key === 'Escape') { event.preventDefault() handleClose(false) return } } if (isOpen) { document.addEventListener('keydown', handleKeyDown) } return () => { document.removeEventListener('keydown', handleKeyDown) } }, [isOpen, handleClose]) const renderWarningStep = () => ( <> This action cannot be undone. Deleting your account will permanently remove: • Your user profile and authentication data • All your chores, chore history, and time tracking sessions • API tokens, MFA sessions, and password reset tokens • Storage files and usage data • Points history and notifications • Circle memberships and relationships Enter your password to continue setPassword(e.target.value)} placeholder={t('deletion.passwordPlaceholder')} /> {error && ( {error} )} ) const renderTransferStep = () => ( <> {t('deletion.transferIntro')} select new owners: {circlesRequiringTransfer.map(circle => ( Circle: {circle.name} New Owner ))} ) const renderConfirmationStep = () => ( <> {t('deletion.confirmPrompt')} on successful deletion, you will be logged out and redirected to the login page. Password setPassword(e.target.value)} placeholder={t('deletion.passwordPlaceholder')} /> Type "DELETE" to confirm setConfirmation(e.target.value)} placeholder={t('deletion.typeDelete')} /> {error && ( {error} )} ) const renderStep = () => { switch (step) { case 1: return renderWarningStep() case 2: return renderTransferStep() case 3: return renderConfirmationStep() default: return renderWarningStep() } } return ( handleClose(false)} size='lg' title={ step === 1 ? 'Delete Account' : step === 2 ? 'Transfer Circle Ownership' : 'Final Confirmation' } role={step === 3 ? 'alertdialog' : 'dialog'} closeOnBackdrop={false} footer={ !loading && ( handleClose(false), }} primary={{ label: step === 3 ? 'Delete Account' : 'Continue', color: step === 3 ? 'danger' : 'primary', onClick: step === 1 ? checkDeletionRequirements : step === 2 ? proceedToConfirmation : executeUserDeletion, disabled: step === 1 ? !password : step === 2 ? circlesRequiringTransfer.length !== transferOptions.length : !password || confirmation !== 'DELETE', }} /> ) } > {loading && step === 1 ? ( ) : ( renderStep() )} ) } export default UserDeletionModal