This commit covers a variety of actions that includes the refactoring of the authentication components to accept paths and invite tokens as props instead of a singular callback prop, thereby improving the component's flexibility. This refactor process removes 'withI18n' calls as i18n functionalities are no longer used. The commit also contains several adjustments to the UI components, including the authorization layout, pricing table, and sign-up page. It also includes minor changes to error messages, specifically those related to password resetting. Lastly, several peer dependencies are removed in the 'package.json' files and changes made to the 'browser.client.ts' file providing a significant code cleanup.
166 lines
4.2 KiB
TypeScript
166 lines
4.2 KiB
TypeScript
'use client';
|
|
|
|
import Link from 'next/link';
|
|
|
|
import { zodResolver } from '@hookform/resolvers/zod';
|
|
import {
|
|
ArrowLeftIcon,
|
|
CheckIcon,
|
|
ExclamationTriangleIcon,
|
|
} from '@radix-ui/react-icons';
|
|
import { useForm } from 'react-hook-form';
|
|
import type { z } from 'zod';
|
|
|
|
import { useUpdateUser } from '@kit/supabase/hooks/use-update-user-mutation';
|
|
import { Alert, AlertDescription, AlertTitle } from '@kit/ui/alert';
|
|
import { Button } from '@kit/ui/button';
|
|
import {
|
|
Form,
|
|
FormControl,
|
|
FormField,
|
|
FormItem,
|
|
FormLabel,
|
|
FormMessage,
|
|
} from '@kit/ui/form';
|
|
import { Heading } from '@kit/ui/heading';
|
|
import { Input } from '@kit/ui/input';
|
|
import { Trans } from '@kit/ui/trans';
|
|
|
|
import { PasswordResetSchema } from '../schemas/password-reset.schema';
|
|
|
|
export function PasswordResetForm(params: { redirectTo: string }) {
|
|
const updateUser = useUpdateUser();
|
|
|
|
const form = useForm<z.infer<typeof PasswordResetSchema>>({
|
|
resolver: zodResolver(PasswordResetSchema),
|
|
defaultValues: {
|
|
password: '',
|
|
repeatPassword: '',
|
|
},
|
|
});
|
|
|
|
if (updateUser.error) {
|
|
return <ErrorState onRetry={() => updateUser.reset()} />;
|
|
}
|
|
|
|
if (updateUser.data && !updateUser.isPending) {
|
|
return <SuccessState />;
|
|
}
|
|
|
|
return (
|
|
<div className={'flex w-full flex-col space-y-6'}>
|
|
<div className={'flex justify-center'}>
|
|
<Heading level={5}>
|
|
<Trans i18nKey={'auth:passwordResetLabel'} />
|
|
</Heading>
|
|
</div>
|
|
|
|
<Form {...form}>
|
|
<form
|
|
className={'flex w-full flex-1 flex-col'}
|
|
onSubmit={form.handleSubmit(({ password }) => {
|
|
return updateUser.mutateAsync({
|
|
password,
|
|
redirectTo: params.redirectTo,
|
|
});
|
|
})}
|
|
>
|
|
<div className={'flex-col space-y-4'}>
|
|
<FormField
|
|
name={'password'}
|
|
render={({ field }) => (
|
|
<FormItem>
|
|
<FormLabel>
|
|
<Trans i18nKey={'common:password'} />
|
|
</FormLabel>
|
|
|
|
<FormControl>
|
|
<Input required type="password" {...field} />
|
|
</FormControl>
|
|
|
|
<FormMessage />
|
|
</FormItem>
|
|
)}
|
|
/>
|
|
|
|
<FormField
|
|
name={'repeatPassword'}
|
|
render={({ field }) => (
|
|
<FormItem>
|
|
<FormLabel>
|
|
<Trans i18nKey={'common:repeatPassword'} />
|
|
</FormLabel>
|
|
|
|
<FormControl>
|
|
<Input required type="password" {...field} />
|
|
</FormControl>
|
|
|
|
<FormMessage />
|
|
</FormItem>
|
|
)}
|
|
/>
|
|
|
|
<Button
|
|
disabled={updateUser.isPending}
|
|
type="submit"
|
|
className={'w-full'}
|
|
>
|
|
<Trans i18nKey={'auth:passwordResetLabel'} />
|
|
</Button>
|
|
</div>
|
|
</form>
|
|
</Form>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
function SuccessState() {
|
|
return (
|
|
<div className={'flex flex-col space-y-4'}>
|
|
<Alert variant={'success'}>
|
|
<CheckIcon className={'s-6'} />
|
|
|
|
<AlertTitle>
|
|
<Trans i18nKey={'account:updatePasswordSuccess'} />
|
|
</AlertTitle>
|
|
|
|
<AlertDescription>
|
|
<Trans i18nKey={'account:updatePasswordSuccessMessage'} />
|
|
</AlertDescription>
|
|
</Alert>
|
|
|
|
<Link href={'/'}>
|
|
<Button variant={'outline'} className={'w-full'}>
|
|
<ArrowLeftIcon className={'mr-2 h-4'} />
|
|
|
|
<span>
|
|
<Trans i18nKey={'common:backToHomePage'} />
|
|
</span>
|
|
</Button>
|
|
</Link>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
function ErrorState(props: { onRetry: () => void }) {
|
|
return (
|
|
<div className={'flex flex-col space-y-4'}>
|
|
<Alert variant={'destructive'}>
|
|
<ExclamationTriangleIcon className={'s-6'} />
|
|
|
|
<AlertTitle>
|
|
<Trans i18nKey={'common:genericError'} />
|
|
</AlertTitle>
|
|
|
|
<AlertDescription>
|
|
<Trans i18nKey={'auth:resetPasswordError'} />
|
|
</AlertDescription>
|
|
</Alert>
|
|
|
|
<Button onClick={props.onRetry} variant={'outline'}>
|
|
<Trans i18nKey={'common:retry'} />
|
|
</Button>
|
|
</div>
|
|
);
|
|
}
|