import { observer } from "mobx-react"; import * as React from "react"; import { useForm } from "react-hook-form"; import { useTranslation, Trans } from "react-i18next"; import { toast } from "sonner"; import Button from "~/components/Button"; import Flex from "~/components/Flex"; import Input from "~/components/Input"; import Text from "~/components/Text"; import env from "~/env"; import useStores from "~/hooks/useStores"; type FormData = { code: string; }; type Props = { /** Callback to close the dialog when user deletion completes. */ onSubmit: () => void; }; function UserDelete({ onSubmit }: Props) { const [isWaitingCode, setWaitingCode] = React.useState(false); const { auth } = useStores(); const { t } = useTranslation(); const { register, handleSubmit: formHandleSubmit, formState, } = useForm(); const handleRequestDelete = React.useCallback( async (ev: React.SyntheticEvent) => { ev.preventDefault(); try { await auth.requestDeleteUser(); setWaitingCode(true); } catch (err) { toast.error(err.message); } }, [auth] ); const handleSubmit = React.useCallback( async (data: FormData) => { try { await auth.deleteUser(data); await auth.logout(); onSubmit(); } catch (err) { toast.error(err.message); } }, [auth, onSubmit] ); const inputProps = register("code", { required: env.EMAIL_ENABLED, }); const appName = env.APP_NAME; return (
{isWaitingCode ? ( <> A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account. ) : ( <> Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{ appName }} and all your API tokens will be revoked. )} {env.EMAIL_ENABLED && !isWaitingCode ? ( ) : ( )}
); } export default observer(UserDelete);