Auth - Login/Signup/Forgot/Rest

This commit is contained in:
Rotimi Best
2022-12-03 22:45:01 +01:00
parent 8e169241e1
commit 3b0ff79c60
21 changed files with 881 additions and 283 deletions
+14 -1
View File
@@ -1,6 +1,19 @@
export const SIGNUP_FIELDS = {
name: '',
email: '',
password: '',
confirmPassword: '',
};
export const RESET_FIELDS = {
password: '',
confirmPassword: '',
};
export const LOGIN_FIELDS = {
email: '',
password: '',
};
export const FORGOT_PASSWORD_FIELDS = {
email: '',
};
+24
View File
@@ -0,0 +1,24 @@
export const ROUTE = {
HOME: '/',
DASHBOARD: '/dashboard',
ONBOARDING: '/onboarding',
COURSES: '/courses',
LOGIN: '/login',
SIGN_UP: '/signup',
PROFILE: '/profile',
PEOPLE: '/people',
DISCUSSIONS: '/discussions',
ASK: '/ask',
FORGOT: '/forgot',
RESET: '/reset',
};
export const PUBLIC_ROUTES = [
ROUTE.HOME,
ROUTE.LOGIN,
ROUTE.SIGN_UP,
ROUTE.FORGOT,
ROUTE.RESET,
];
export const ROUTES_TO_HIDE_NAV = [...PUBLIC_ROUTES, ROUTE.ONBOARDING];
+66 -5
View File
@@ -1,10 +1,13 @@
import z from 'zod';
const validationSchema = z.object({
name: z.string().min(3, {
message: 'Must be 3 or more characters long',
const forgotValidationSchema = z.object({
email: z.string().email({
message: 'Invalid email address',
invalid_type_error: 'Must not be empty',
}),
});
const authValidationSchema = z.object({
email: z.string().email({
message: 'Invalid email address',
invalid_type_error: 'Must not be empty',
@@ -15,14 +18,44 @@ const validationSchema = z.object({
}),
});
const resetValidationSchema = z.object({
password: z.string().min(6, {
message: 'Must be 6 or more characters long',
invalid_type_error: 'Must not be empty',
}),
});
const onboardingValidationSchema = {
stepOne: z.object({
fullname: z.string().min(1, { message: 'Enter your fullname' }),
role: z.string({
required_error: 'Please select a goal',
invalid_type_error: 'Please select a goal',
}),
}),
stepTwo: z.object({
goal: z
.string({
required_error: 'Select an option',
invalid_type_error: 'Select an option',
})
.min(1),
source: z
.string({
required_error: 'Select an option',
invalid_type_error: 'Select an option',
})
.min(1),
}),
};
export const getConfirmPasswordError = ({ password, confirmPassword }) => {
return password > 6 && confirmPassword > 6 && password !== confirmPassword
? 'Does not match password'
: null;
};
export const signUpValidation = (fields = {}) => {
const { error } = validationSchema.safeParse(fields);
const processErrors = (error) => {
const errors = {};
if (Array.isArray(error?.issues)) {
@@ -38,6 +71,34 @@ export const signUpValidation = (fields = {}) => {
return errors;
};
export const authValidation = (fields = {}) => {
const { error } = authValidationSchema.safeParse(fields);
return processErrors(error);
};
export const resetValidation = (fields = {}) => {
const { error } = resetValidationSchema.safeParse(fields);
return processErrors(error);
};
export const forgotValidation = (fields = {}) => {
const { error } = forgotValidationSchema.safeParse(fields);
return processErrors(error);
};
export const onboardingValidation = (fields = {}, step) => {
const schema =
step === 1
? onboardingValidationSchema.stepOne
: onboardingValidationSchema.stepTwo;
const { error } = schema.safeParse(fields);
return processErrors(error);
};
export const getDisableSubmit = ({ password, confirmPassword }) => {
return !!(password && confirmPassword && password !== confirmPassword);
};
+6 -1
View File
@@ -2,7 +2,7 @@ import { writable } from 'svelte/store';
export const user = writable({
openAuthModal: false,
fetchingUser: false,
fetchingUser: null,
isLoggedIn: false,
currentSession: null,
expiresAt: 0,
@@ -10,8 +10,13 @@ export const user = writable({
export const profile = writable({
id: null,
fullname: '',
avatar_url:
'https://pbs.twimg.com/profile_images/1416443682157473795/dGtFbtht_normal.jpg',
username: 'Elon',
user_id: '',
email: '',
role: '',
goal: '',
source: '',
});
+1 -1
View File
@@ -11,7 +11,7 @@ export interface CurrentSessionType {
export interface UserType {
openAuthModal: boolean;
fetchingUser: boolean;
fetchingUser: boolean | null;
isLoggedIn: boolean;
currentSession: CurrentSessionType | null;
expiresAt: number;
+1 -1
View File
@@ -8,7 +8,7 @@ export interface CurrentSessionType {
export interface UserType {
openAuthModal: boolean;
fetchingUser: boolean;
fetchingUser: boolean | null;
isLoggedIn: boolean;
currentSession: CurrentSessionType | null;
expiresAt: number;