The Link component is modified to be nested within the Button component in various JSX files. This change was made with the aid of the 'asChild' property, it ensures that the link remains operable even when wrapped by the button, improving the site's semantics and accessibility.
133 lines
3.3 KiB
TypeScript
133 lines
3.3 KiB
TypeScript
'use client';
|
|
|
|
import Link from 'next/link';
|
|
|
|
import { zodResolver } from '@hookform/resolvers/zod';
|
|
import { ArrowRight } from 'lucide-react';
|
|
import { useForm } from 'react-hook-form';
|
|
import { useTranslation } from 'react-i18next';
|
|
import type { z } from 'zod';
|
|
|
|
import { Button } from '@kit/ui/button';
|
|
import {
|
|
Form,
|
|
FormControl,
|
|
FormField,
|
|
FormItem,
|
|
FormLabel,
|
|
FormMessage,
|
|
} from '@kit/ui/form';
|
|
import { If } from '@kit/ui/if';
|
|
import { Input } from '@kit/ui/input';
|
|
import { Trans } from '@kit/ui/trans';
|
|
|
|
import { PasswordSignInSchema } from '../schemas/password-sign-in.schema';
|
|
|
|
export const PasswordSignInForm: React.FC<{
|
|
onSubmit: (params: z.infer<typeof PasswordSignInSchema>) => unknown;
|
|
loading: boolean;
|
|
}> = ({ onSubmit, loading }) => {
|
|
const { t } = useTranslation('auth');
|
|
|
|
const form = useForm<z.infer<typeof PasswordSignInSchema>>({
|
|
resolver: zodResolver(PasswordSignInSchema),
|
|
defaultValues: {
|
|
email: '',
|
|
password: '',
|
|
},
|
|
});
|
|
|
|
return (
|
|
<Form {...form}>
|
|
<form
|
|
className={'w-full space-y-2.5'}
|
|
onSubmit={form.handleSubmit(onSubmit)}
|
|
>
|
|
<FormField
|
|
control={form.control}
|
|
name={'email'}
|
|
render={({ field }) => (
|
|
<FormItem>
|
|
<FormLabel>
|
|
<Trans i18nKey={'common:emailAddress'} />
|
|
</FormLabel>
|
|
|
|
<FormControl>
|
|
<Input
|
|
data-test={'email-input'}
|
|
required
|
|
type="email"
|
|
placeholder={t('emailPlaceholder')}
|
|
{...field}
|
|
/>
|
|
</FormControl>
|
|
|
|
<FormMessage />
|
|
</FormItem>
|
|
)}
|
|
/>
|
|
|
|
<FormField
|
|
control={form.control}
|
|
name={'password'}
|
|
render={({ field }) => (
|
|
<FormItem>
|
|
<FormLabel>
|
|
<Trans i18nKey={'common:password'} />
|
|
</FormLabel>
|
|
|
|
<FormControl>
|
|
<Input
|
|
required
|
|
data-test={'password-input'}
|
|
type="password"
|
|
placeholder={''}
|
|
{...field}
|
|
/>
|
|
</FormControl>
|
|
|
|
<FormMessage />
|
|
|
|
<Button
|
|
asChild
|
|
type={'button'}
|
|
size={'sm'}
|
|
variant={'link'}
|
|
className={'text-xs'}
|
|
>
|
|
<Link href={'/auth/password-reset'}>
|
|
<Trans i18nKey={'auth:passwordForgottenQuestion'} />
|
|
</Link>
|
|
</Button>
|
|
</FormItem>
|
|
)}
|
|
/>
|
|
|
|
<Button
|
|
data-test="auth-submit-button"
|
|
className={'group w-full'}
|
|
type="submit"
|
|
disabled={loading}
|
|
>
|
|
<If
|
|
condition={loading}
|
|
fallback={
|
|
<>
|
|
<Trans i18nKey={'auth:signInWithEmail'} />
|
|
|
|
<ArrowRight
|
|
className={
|
|
'zoom-in animate-in slide-in-from-left-2 fill-mode-both h-4 delay-500 duration-500'
|
|
}
|
|
/>
|
|
</>
|
|
}
|
|
>
|
|
<Trans i18nKey={'auth:signingIn'} />
|
|
</If>
|
|
</Button>
|
|
</form>
|
|
</Form>
|
|
);
|
|
};
|