import { PagedSettingsContainer } from "@/src/components/PagedSettingsContainer"; import Header from "@/src/components/layouts/header"; import { Card } from "@/src/components/ui/card"; import { Button } from "@/src/components/ui/button"; import { Input } from "@/src/components/ui/input"; import { api } from "@/src/utils/api"; import * as z from "zod/v4"; import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import { Form, FormControl, FormField, FormItem, FormMessage, } from "@/src/components/ui/form"; import { Dialog, DialogBody, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/src/components/ui/dialog"; import { useSession, signOut } from "next-auth/react"; import { SettingsDangerZone } from "@/src/components/SettingsDangerZone"; import ContainerPage from "@/src/components/layouts/container-page"; import { useRouter } from "next/router"; import { StringNoHTML } from "@langfuse/shared"; import Link from "next/link"; import { showSuccessToast } from "@/src/features/notifications/showSuccessToast"; import { showErrorToast } from "@/src/features/notifications/showErrorToast"; import { env } from "@/src/env.mjs"; const displayNameSchema = z.object({ name: StringNoHTML.min(1, "Name cannot be empty").max( 100, "Name must be at most 100 characters", ), }); function UpdateDisplayName() { const { data: session, update: updateSession } = useSession(); const utils = api.useUtils(); const form = useForm({ resolver: zodResolver(displayNameSchema), defaultValues: { name: "", }, }); const updateDisplayName = api.userAccount.updateDisplayName.useMutation({ onSuccess: async () => { await updateSession(); await utils.invalidate(); form.reset(); showSuccessToast({ title: "Display Name Updated", description: "Your display name has been successfully updated.", }); }, onError: (error) => form.setError("name", { message: error.message }), }); function onSubmit(values: z.infer) { updateDisplayName.mutate({ name: values.name }); } return (
{form.getValues().name !== "" ? (

Your display name will be updated from " {session?.user?.name ?? ""} " to " {form.watch().name}".

) : (

Your display name is currently " {session?.user?.name ?? ""} ".

)}
( )} />
); } function DeleteAccountButton() { const { data: session } = useSession(); const userEmail = session?.user?.email ?? ""; const { data: canDeleteData } = api.userAccount.checkCanDelete.useQuery(); const deleteAccount = api.userAccount.delete.useMutation(); const formSchema = z.object({ email: z.string().refine((val) => val === userEmail, { message: `Please enter your email address: ${userEmail}`, }), }); const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { email: "", }, }); const canDelete = canDeleteData?.canDelete ?? false; const blockingOrganizations = canDeleteData?.blockingOrganizations ?? []; const onSubmit = async () => { if (!canDelete) return; try { await deleteAccount.mutateAsync(); showSuccessToast({ title: "Account Deleted", description: "Your account has been successfully deleted.", }); await new Promise((resolve) => setTimeout(resolve, 2000)); await signOut(); } catch (error) { console.error(error); showErrorToast( "Failed to Delete Account", error instanceof Error ? error.message : "An unexpected error occurred", ); } }; return ( Delete Account {!canDelete && blockingOrganizations.length > 0 ? (

You cannot delete your account because you are the last owner of the following organization(s):

    {blockingOrganizations.map((org) => (
  • {org.name}
  • ))}

Please add another owner or delete these organizations before deleting your account.

) : ( `To confirm, type your email address "${userEmail}" in the input box` )}
{canDelete && ( ( )} /> )}
); } type AccountSettingsPage = { title: string; slug: string; content: React.ReactNode; cmdKKeywords?: string[]; }; export function useAccountSettingsPages(): AccountSettingsPage[] { const { data: session } = useSession(); const userEmail = session?.user?.email ?? ""; return getAccountSettingsPages(userEmail); } const getAccountSettingsPages = (userEmail: string): AccountSettingsPage[] => [ { title: "General", slug: "index", cmdKKeywords: [ "account", "user", "profile", "email", "password", "name", "display", "delete", "remove", ], content: (

Your email address: {userEmail}

To change your password, we will send you a secure link to your email address. Click the button below to start the password reset process.

, }, ]} />
), }, ]; export default function AccountSettingsPage() { const { data: session } = useSession(); const router = useRouter(); const userEmail = session?.user?.email ?? ""; const pages = getAccountSettingsPages(userEmail); return ( ); }