-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix (#273): a11y audit signup page #303
Merged
Merged
Changes from 56 commits
Commits
Show all changes
58 commits
Select commit
Hold shift + click to select a range
04ac51b
feat (#273): import and apply LinkCustom component
CorinaMurg fa8eb8b
feat (#273): update <title>
CorinaMurg 7c03632
fix: register page.tsx to be a server component
chris-nowicki e006e55
fix(#273): update title and description
CorinaMurg 7469ddd
fix(#273): remove Link import
CorinaMurg 652a260
fix(#273): add font-bold and text classes to LinkCustom
CorinaMurg 8fba3a6
fix(#273): update text of second Login link
CorinaMurg be6cf89
fix(#273): merge develop
CorinaMurg eb7a990
fix(#273): add return type to RegisterPage function
CorinaMurg 9777134
fix(#273): add JSDoc comment
CorinaMurg a1efcba
fix(#273): remove the hard-coded data-testid
CorinaMurg 4d33119
fix(#273): create label variants
CorinaMurg 2319374
fix(#273): wrap input fields in Label component
CorinaMurg 8b41dd6
Merge branch 'develop' into corina/a11y-audit-signup-page
CorinaMurg f0777a9
fix(#273): remove unused code
CorinaMurg 3b3929d
fix(#273): update data-testid in unit test for LinkCustom
CorinaMurg e99e554
fix(#273): merge develop
CorinaMurg 8916bc8
fix(#273): add Label variant to WeeklyPickButton
CorinaMurg 6382386
fix(#273): add unit test for Label
CorinaMurg 8b17c88
fix(#273): update placeholder text
CorinaMurg 54e31c3
fix(#273): update text size for Label
CorinaMurg a0d13ce
fix(#273): update gap values for Label variants
CorinaMurg b2f46ab
fix(#273): create interface export for LinkCustom
CorinaMurg ff1f640
fix(#273): remove interface file for LinkCustom
CorinaMurg c639f72
fix(#273): add Label.tsx file
CorinaMurg d189719
fix(#273): merge develop
CorinaMurg 0a9c881
Merge branch 'develop' into corina/a11y-audit-signup-page
CorinaMurg 29fa949
fix(#273): fix spelling mistake
CorinaMurg 2a84095
fix(#273): hyphenate data-testid and custom classes
CorinaMurg 892934e
Merge branch 'develop' into corina/a11y-audit-signup-page
CorinaMurg f419421
fix(#273): update variant names for Label
CorinaMurg 88a3bfd
fix(#273): update variants name in Label test
CorinaMurg 96cc8a6
fix(#273): merge develop
CorinaMurg c7e9c22
fix(#273): added back the data-testid to LinkCustom
CorinaMurg caf8de3
fix(#273): remove data-testid from LinkCustom test
CorinaMurg 56d4843
fix(#273): create file with Label variant types
CorinaMurg c749ace
fix(#273): merge develop
CorinaMurg b985de1
fix(#273): update test with correct name for Register page
CorinaMurg de0b89d
Merge branch 'develop' into corina/a11y-audit-signup-page
CorinaMurg d5b9267
Merge branch 'develop' into corina/a11y-audit-signup-page
CorinaMurg 79480b7
fix(#273): merge develop
CorinaMurg 61973e3
fix(#273): change label text color
CorinaMurg a3c6480
fix(#273): remove punctuation from LinkCustom
CorinaMurg 2f90856
fix(#273): update variant classes
CorinaMurg 8a661db
Merge branch 'develop' into corina/a11y-audit-signup-page
CorinaMurg 0b2630c
Merge branch 'develop' into corina/a11y-audit-signup-page
ryandotfurrer 8cf9b62
Merge branch 'corina/a11y-audit-signup-page' of https://github.com/Le…
CorinaMurg 9371d6d
fix(#273): Merge changes from develop except in Label and WeeklyPickB…
CorinaMurg 2ca6306
fix(#273): Merge changes from develop
CorinaMurg 0789402
Merge branch 'develop' into corina/a11y-audit-signup-page
CorinaMurg f79a31c
Merge 'develop' into corina/a11y-audit-signup-page
CorinaMurg 5e155f8
fix (#273): update Labal unit test after merging develop
CorinaMurg 0d380b2
fix(#273): add labels to registration input fields
CorinaMurg 8429c4a
fix(#273): update placeholder values for registration input fields
CorinaMurg 2640e7d
fix(#273): wrap the link only around the Link word
CorinaMurg 4bc7c76
fix(#273): remove extra lines
CorinaMurg 883b84e
fix(#273): add missing new line at the end of the file
CorinaMurg 252e1b9
Merge branch 'develop' into corina/a11y-audit-signup-page
shashilo File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,261 @@ | ||
// Copyright (c) Gridiron Survivor. | ||
// Licensed under the MIT License. | ||
|
||
'use client'; | ||
import { AlertVariants } from '@/components/AlertNotification/Alerts.enum'; | ||
import { Button } from '@/components/Button/Button'; | ||
import { Control, useForm, useWatch, SubmitHandler } from 'react-hook-form'; | ||
import { | ||
Form, | ||
FormControl, | ||
FormField, | ||
FormItem, | ||
FormLabel, | ||
FormMessage, | ||
} from '../../../components/Form/Form'; | ||
import { Input } from '@/components/Input/Input'; | ||
import { registerAccount } from '@/api/apiFunctions'; | ||
import { toast } from 'react-hot-toast'; | ||
import { useAuthContext } from '@/context/AuthContextProvider'; | ||
import { useRouter } from 'next/navigation'; | ||
import { z } from 'zod'; | ||
import { zodResolver } from '@hookform/resolvers/zod'; | ||
import Alert from '@/components/AlertNotification/AlertNotification'; | ||
import LinkCustom from '@/components/LinkCustom/LinkCustom'; | ||
import Logo from '@/components/Logo/Logo'; | ||
import logo from '/public/assets/logo-colored-outline.svg'; | ||
import React, { JSX, useEffect, useState } from 'react'; | ||
import LoadingSpinner from '@/components/LoadingSpinner/LoadingSpinner'; | ||
|
||
const RegisterUserSchema = z | ||
.object({ | ||
email: z | ||
.string() | ||
.min(1, { message: 'Please enter an email address' }) | ||
.email({ message: 'Please enter a valid email address' }), | ||
password: z | ||
.string() | ||
.min(1, { message: 'Please enter a password' }) | ||
.min(8, { message: 'Password must be at least 8 characters' }), | ||
confirmPassword: z | ||
.string() | ||
.min(1, { message: 'Please confirm your password' }) | ||
.min(8, { message: 'Password must be at least 8 characters' }), | ||
}) | ||
.refine((data) => data.password === data.confirmPassword, { | ||
message: "Passwords don't match", | ||
path: ['confirmPassword'], | ||
}); | ||
|
||
type RegisterUserSchemaType = z.infer<typeof RegisterUserSchema>; | ||
|
||
/** | ||
* Renders the registration page. | ||
* @returns {JSX.Element} The rendered registration page. | ||
*/ | ||
const Register = (): JSX.Element => { | ||
const router = useRouter(); | ||
const { login, isSignedIn } = useAuthContext(); | ||
const [isLoading, setIsLoading] = useState(false); | ||
|
||
useEffect(() => { | ||
if (isSignedIn) { | ||
router.push('/league/all'); | ||
} | ||
// eslint-disable-next-line react-hooks/exhaustive-deps | ||
}, [isSignedIn]); | ||
|
||
const form = useForm<RegisterUserSchemaType>({ | ||
resolver: zodResolver(RegisterUserSchema), | ||
}); | ||
|
||
/** | ||
* The current value of the 'email' field in the form. | ||
* @type {string} | ||
*/ | ||
const email: string = useWatch({ | ||
control: form.control, | ||
name: 'email', | ||
defaultValue: '', | ||
}); | ||
|
||
/** | ||
* The current value of the 'password' field in the form. | ||
* @type {string} | ||
*/ | ||
const password: string = useWatch({ | ||
control: form.control, | ||
name: 'password', | ||
defaultValue: '', | ||
}); | ||
|
||
/** | ||
* The current value of the 'confirmPassword' field in the form. | ||
* @type {string} | ||
*/ | ||
const confirmPassword: string = useWatch({ | ||
control: form.control, | ||
name: 'confirmPassword', | ||
defaultValue: '', | ||
}); | ||
|
||
/** | ||
* A function that handles form submission. | ||
* @param {RegisterUserSchemaType} data - The data submitted in the form. | ||
* @returns {Promise<void>} Promise that resolves after form submission is processed. | ||
*/ | ||
const onSubmit: SubmitHandler<RegisterUserSchemaType> = async ( | ||
data: RegisterUserSchemaType, | ||
): Promise<void> => { | ||
try { | ||
setIsLoading(true); | ||
await registerAccount(data); | ||
await login(data); | ||
toast.custom( | ||
<Alert | ||
variant={AlertVariants.Success} | ||
message="You have successfully registered your account." | ||
/>, | ||
); | ||
} catch (error) { | ||
console.error('Registration Failed', error); | ||
toast.custom( | ||
<Alert variant={AlertVariants.Error} message="Something went wrong!" />, | ||
); | ||
} finally { | ||
setIsLoading(false); | ||
} | ||
}; | ||
|
||
const isDisabled = !email || !password || password !== confirmPassword; | ||
|
||
return ( | ||
<section className="grid xl:grid-cols-2 xl:grid-rows-none"> | ||
<div | ||
data-testid="dark-mode-section" | ||
className="row-span-1 grid w-full place-items-center from-[#4E160E] to-zinc-950 bg-gradient-to-b xl:h-screen xl:bg-gradient-to-b" | ||
> | ||
<Logo className="mx-auto w-52 xl:w-64 xl:place-self-end" src={logo} /> | ||
<div className="mx-auto grid gap-4 place-self-end px-8 pb-8 text-foreground"> | ||
<p className="hidden leading-7 xl:block"> | ||
Thank you... fantasy football draft, for letting me know that even | ||
in my fantasies, I am bad at sports. | ||
</p> | ||
<p className="hidden leading-7 xl:block">Jimmy Fallon</p> | ||
</div> | ||
</div> | ||
<div className="row-span-1 mx-auto grid max-w-sm justify-center space-y-4 px-4 xl:flex xl:flex-col"> | ||
<div> | ||
<h1 className="text-5xl font-extrabold tracking-tight text-foreground"> | ||
Register A New Account | ||
</h1> | ||
<p className="pb-4 font-normal leading-7 text-muted-foreground"> | ||
If you have an existing account{' '} | ||
<LinkCustom href="/login">Login!</LinkCustom> | ||
</p> | ||
</div> | ||
|
||
<Form {...form}> | ||
<form | ||
id="input-container" | ||
className="grid gap-3" | ||
data-testid="register-form" | ||
onSubmit={form.handleSubmit(onSubmit)} | ||
> | ||
<FormField | ||
control={form.control as Control<object>} | ||
name="email" | ||
render={({ field }) => ( | ||
<FormItem> | ||
<FormLabel className="border-none px-0 py-0 pb-2 pl-1"> | ||
</FormLabel> | ||
<FormControl> | ||
<Input | ||
data-testid="email" | ||
type="email" | ||
placeholder="Your email" | ||
{...field} | ||
/> | ||
</FormControl> | ||
{form.formState.errors?.email && ( | ||
<FormMessage> | ||
{form.formState.errors?.email.message} | ||
</FormMessage> | ||
)} | ||
</FormItem> | ||
)} | ||
/> | ||
<FormField | ||
control={form.control as Control<object>} | ||
name="password" | ||
render={({ field }) => ( | ||
<FormItem> | ||
<FormLabel className="border-none px-0 py-0 pb-2 pl-1"> | ||
Password | ||
</FormLabel> | ||
<FormControl> | ||
<Input | ||
data-testid="password" | ||
type="password" | ||
placeholder="Your password" | ||
{...field} | ||
/> | ||
</FormControl> | ||
{form.formState.errors?.password && ( | ||
<FormMessage> | ||
{form.formState.errors?.password.message} | ||
</FormMessage> | ||
)} | ||
</FormItem> | ||
)} | ||
/> | ||
<FormField | ||
control={form.control as Control<object>} | ||
name="confirmPassword" | ||
render={({ field }) => ( | ||
<FormItem> | ||
<FormLabel className="border-none px-0 py-0 pb-2 pl-1"> | ||
Confirm Password | ||
</FormLabel> | ||
<FormControl> | ||
<Input | ||
data-testid="confirm-password" | ||
type="password" | ||
placeholder="Confirm your password" | ||
{...field} | ||
/> | ||
</FormControl> | ||
{form.formState.errors?.confirmPassword && ( | ||
<FormMessage> | ||
{form.formState.errors?.confirmPassword.message} | ||
</FormMessage> | ||
)} | ||
</FormItem> | ||
)} | ||
/> | ||
|
||
<Button | ||
data-testid="continue-button" | ||
label={ | ||
isLoading ? ( | ||
<LoadingSpinner data-testid="loading-spinner" /> | ||
) : ( | ||
'Continue' | ||
) | ||
} | ||
type="submit" | ||
disabled={isDisabled} | ||
/> | ||
<p className="pb-4 font-normal leading-7 text-muted-foreground"> | ||
<LinkCustom href="/login">Login</LinkCustom> | ||
{' '} to get started playing. | ||
</p> | ||
</form> | ||
</Form> | ||
</div> | ||
</section> | ||
); | ||
}; | ||
|
||
export default Register; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why do we have a new register page in this PR?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Register.tsx
is now the client component, andpage.tsx
is the server component (with the meta data) for the registration page. This breakdown is necessary in order for nextJS to render a page with the correct meta data.I’m tagging @chris-nowicki here just to make sure I’m explaining this correctly. He’s the one who took care of this fix.