update account form for email login

This commit is contained in:
2025-09-10 06:34:05 +03:00
parent e3cdba6a7c
commit fa0bbe64fb
13 changed files with 102 additions and 46 deletions

View File

@@ -1,6 +1,9 @@
'use client';
import Link from 'next/link';
import { useTranslation } from 'react-i18next';
import { useRouter } from 'next/navigation';
import { z } from 'zod';
import { ExternalLink } from '@/public/assets/external-link';
import { zodResolver } from '@hookform/resolvers/zod';
@@ -21,9 +24,10 @@ import { Trans } from '@kit/ui/trans';
import { UpdateAccountSchemaClient } from '../_lib/schemas/update-account.schema';
import { onUpdateAccount } from '../_lib/server/update-account';
import { z } from 'zod';
import { toast } from '@kit/ui/sonner';
import { pathsConfig } from '@/packages/shared/src/config';
type UpdateAccountFormValues = z.infer<typeof UpdateAccountSchemaClient>;
type UpdateAccountFormValues = z.infer<ReturnType<typeof UpdateAccountSchemaClient>>;
export function UpdateAccountForm({
defaultValues,
@@ -32,33 +36,56 @@ export function UpdateAccountForm({
defaultValues: UpdateAccountFormValues,
isEmailUser: boolean,
}) {
const router = useRouter();
const { t } = useTranslation('account');
const form = useForm({
resolver: zodResolver(UpdateAccountSchemaClient),
resolver: zodResolver(UpdateAccountSchemaClient({ isEmailUser })),
mode: 'onChange',
defaultValues,
});
const { firstName, lastName, personalCode, email, weight, height, userConsent } = defaultValues;
const { firstName, lastName, personalCode, email, userConsent } = defaultValues;
const defaultValues_weight = "weight" in defaultValues ? defaultValues.weight : null;
const defaultValues_height = "height" in defaultValues ? defaultValues.height : null;
const hasFirstName = !!firstName;
const hasLastName = !!lastName;
const hasPersonalCode = !!personalCode;
const hasEmail = !!email;
const hasWeight = !!weight;
const hasHeight = !!height;
const onUpdateAccountOptions = async (values: UpdateAccountFormValues) =>
onUpdateAccount({
firstName: hasFirstName ? firstName : values.firstName,
lastName: hasLastName ? lastName : values.lastName,
personalCode: hasPersonalCode ? personalCode : values.personalCode,
email: hasEmail ? email : values.email,
phone: values.phone,
weight: (hasWeight ? weight : values.weight) as number,
height: (hasHeight ? height : values.height) as number,
userConsent: values.userConsent ?? userConsent,
city: values.city,
});
const onUpdateAccountOptions = async (values: UpdateAccountFormValues) => {
const loading = toast.loading(t('updateAccount.updateAccountLoading'));
try {
const response = await onUpdateAccount({
firstName: hasFirstName ? firstName : values.firstName,
lastName: hasLastName ? lastName : values.lastName,
personalCode: hasPersonalCode ? personalCode : values.personalCode,
email: hasEmail ? email : values.email,
phone: values.phone,
weight: ((("weight" in values && values.weight) ?? defaultValues_weight) || null) as number,
height: ((("height" in values && values.height) ?? defaultValues_height) || null) as number,
userConsent: values.userConsent ?? userConsent,
city: values.city,
});
if (!response) {
throw new Error('Failed to update account');
}
toast.dismiss(loading);
toast.success(t('updateAccount.updateAccountSuccess'));
if (response.hasUnseenMembershipConfirmation) {
router.push(pathsConfig.auth.membershipConfirmation);
} else {
router.push(pathsConfig.app.selectPackage);
}
} catch (error) {
console.info("promiseresult error", error);
toast.error(t('updateAccount.updateAccountError'));
toast.dismiss(loading);
}
};
return (
<Form {...form}>

View File

@@ -12,7 +12,9 @@ const updateAccountSchema = {
.string({
error: 'Last name is required',
})
.nonempty(),
.nonempty({
error: 'common:formFieldError.stringNonEmpty',
}),
personalCode: z.string().refine(
(val) => {
try {
@@ -30,7 +32,7 @@ const updateAccountSchema = {
}),
phone: z
.string({
error: 'Phone number is required',
error: 'error:invalidPhone',
})
.nonempty()
.refine(
@@ -75,18 +77,26 @@ export const UpdateAccountSchemaServer = z.object({
email: updateAccountSchema.email,
phone: updateAccountSchema.phone,
city: updateAccountSchema.city,
weight: updateAccountSchema.weight,
height: updateAccountSchema.height,
weight: updateAccountSchema.weight.nullable(),
height: updateAccountSchema.height.nullable(),
userConsent: updateAccountSchema.userConsent,
});
export const UpdateAccountSchemaClient = z.object({
export const UpdateAccountSchemaClient = ({ isEmailUser }: { isEmailUser: boolean }) => z.object({
firstName: updateAccountSchema.firstName,
lastName: updateAccountSchema.lastName,
personalCode: updateAccountSchema.personalCode,
email: updateAccountSchema.email,
phone: updateAccountSchema.phone,
city: updateAccountSchema.city,
weight: updateAccountSchema.weight.gt(-1).gte(0).nullable(),
height: updateAccountSchema.height.gt(-1).gte(0).nullable(),
...(isEmailUser
? {
city: z.string().optional(),
weight: z.number().optional(),
height: z.number().optional(),
}
: {
city: updateAccountSchema.city,
weight: updateAccountSchema.weight,
height: updateAccountSchema.height,
}),
userConsent: updateAccountSchema.userConsent,
});

View File

@@ -1,7 +1,5 @@
'use server';
import { redirect } from 'next/navigation';
import { updateCustomer } from '@lib/data/customer';
import { AccountSubmitData, createAuthApi } from '@kit/auth/api';
@@ -39,11 +37,8 @@ export const onUpdateAccount = enhanceAction(
const hasUnseenMembershipConfirmation =
await api.hasUnseenMembershipConfirmation();
if (hasUnseenMembershipConfirmation) {
redirect(pathsConfig.auth.membershipConfirmation);
} else {
redirect(pathsConfig.app.selectPackage);
return {
hasUnseenMembershipConfirmation,
}
},
{