import { t, Trans } from "@lingui/macro" import { Anchor, Box, Button, Checkbox, Divider, Group, Input, PasswordInput, Stack, Text, TextInput } from "@mantine/core" import { useForm } from "@mantine/form" import { openConfirmModal } from "@mantine/modals" import { client, errorsToStrings } from "app/client" import { redirectToLogin, redirectToSelectedSource } from "app/slices/redirect" import { reloadProfile } from "app/slices/user" import { useAppDispatch, useAppSelector } from "app/store" import { ProfileModificationRequest } from "app/types" import { Alert } from "components/Alert" import { useEffect } from "react" import { TbDeviceFloppy, TbTrash } from "react-icons/tb" import useMutation from "use-mutation" interface FormData extends ProfileModificationRequest { newPasswordConfirmation?: string } export function ProfileSettings() { const profile = useAppSelector(state => state.user.profile) const dispatch = useAppDispatch() const form = useForm({ validate: { newPasswordConfirmation: (value: string, values: FormData) => (value !== values.newPassword ? t`Passwords do not match` : null), }, }) const { setValues } = form const [saveProfile, saveProfileResult] = useMutation(client.user.saveProfile, { onSuccess: () => { dispatch(reloadProfile()) dispatch(redirectToSelectedSource()) }, }) const [deleteProfile, deleteProfileResult] = useMutation(client.user.deleteProfile, { onSuccess: () => { dispatch(redirectToLogin()) }, }) const errors = errorsToStrings([saveProfileResult.error, deleteProfileResult.error]) const openDeleteProfileModal = () => openConfirmModal({ title: t`Delete account`, children: ( Are you sure you want to delete your account? There's no turning back! ), labels: { confirm: t`Confirm`, cancel: t`Cancel` }, confirmProps: { color: "red" }, onConfirm: () => deleteProfile({}), }) useEffect(() => { if (!profile) return setValues({ currentPassword: "", email: profile.email ?? "", newApiKey: false, }) }, [setValues, profile]) return ( <> {errors.length > 0 && ( )}
{profile?.name} Download
) }