import { zodResolver } from '@hookform/resolvers/zod' import { SupportCategories } from '@supabase/shared-types/out/constants' import { LOCAL_STORAGE_KEYS } from 'common' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' import { Button, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogSection, DialogTitle, DialogTrigger, Form, FormControl, FormField, FormItem, FormLabel, Input, Separator, } from 'ui' import * as z from 'zod' import { NO_PROJECT_MARKER } from '@/components/interfaces/Support/SupportForm.utils' import { useSendSupportTicketMutation } from '@/data/feedback/support-ticket-send' import { useOrganizationsQuery } from '@/data/organizations/organizations-query' import { useProfile } from '@/lib/profile' const setDeletionRequestFlag = () => { const expiryDate = new Date() expiryDate.setDate(expiryDate.getDate() + 30) localStorage.setItem(LOCAL_STORAGE_KEYS.ACCOUNT_DELETION_REQUEST, expiryDate.toString()) } const hasActiveDeletionRequest = () => { const expiryDateStr = localStorage.getItem(LOCAL_STORAGE_KEYS.ACCOUNT_DELETION_REQUEST) if (!expiryDateStr) return false const expiryDate = new Date(expiryDateStr) const now = new Date() if (now > expiryDate) { localStorage.removeItem(LOCAL_STORAGE_KEYS.ACCOUNT_DELETION_REQUEST) return false } return true } export const DeleteAccountButton = () => { const { profile } = useProfile() const [isOpen, setIsOpen] = useState(false) const { data: organizations, isSuccess } = useOrganizationsQuery() const accountEmail = profile?.primary_email const FormSchema = z.object({ account: z.string() }) const form = useForm>({ mode: 'onBlur', reValidateMode: 'onBlur', resolver: zodResolver(FormSchema as any), defaultValues: { account: '' }, }) const { account } = form.watch() const { mutate: submitSupportTicket, isPending } = useSendSupportTicketMutation({ onSuccess: () => { setIsOpen(false) setDeletionRequestFlag() toast.success( 'Successfully submitted account deletion request - we will reach out to you via email once the request is completed!', { duration: 8000 } ) }, onError: (error) => { toast.error(`Failed to submit account deletion request: ${error}`) }, }) const onConfirmDelete = async () => { if (!accountEmail) return console.error('Account information is required') if (hasActiveDeletionRequest()) { return toast.error('You have already submitted a deletion request within the last 30 days.') } const payload = { subject: 'Account Deletion Request', message: 'I want to delete my account.', category: SupportCategories.ACCOUNT_DELETION, severity: 'Low', allowSupportAccess: false, verified: true, projectRef: NO_PROJECT_MARKER, } submitSupportTicket(payload) } useEffect(() => { if (isOpen && form !== undefined) form.reset({ account: '' }) }, [form, isOpen]) return ( {(organizations ?? []).length > 0 ? ( <> Leave all organizations before requesting account deletion This will allow us to process your account deletion request faster ) : ( <> Are you sure you want to delete your account? Deleting your account is permanent and{' '} cannot be undone )} {isSuccess && ( <> {organizations.length > 0 ? ( <> Before submitting an account deletion request, please ensure that your account is not part of any organization. This can be done by leaving or deleting the organizations that you are a part of. ) : (
onConfirmDelete())} > ( Please type{' '} {profile?.primary_email ?? ''} to confirm )} />
)} )}
) }