diff --git a/src/routes/sign-in/+page.server.ts b/src/routes/sign-in/+page.server.ts index 5cb7d82..f76bf3b 100644 --- a/src/routes/sign-in/+page.server.ts +++ b/src/routes/sign-in/+page.server.ts @@ -1,36 +1,39 @@ -import { redirect, type Actions, fail } from '@sveltejs/kit'; -import type { PageServerLoad } from './$types'; import { API_URL } from '$env/static/private'; -import { z } from 'zod'; +import { redirect, type Actions, fail } from '@sveltejs/kit'; -export const load = (async ({ locals: { user } }) => { - if (user) throw redirect(303, '/dashboard'); -}) satisfies PageServerLoad; +import type { PageServerLoad } from './$types'; + +import { superValidate } from 'sveltekit-superforms/server'; +import { z } from 'zod'; const schema = z.object({ pseudo: z.string().trim(), passwd: z.string() }); +export const load = (async ({ locals: { user } }) => { + if (user) throw redirect(303, '/dashboard'); + + const form = await superValidate(schema); + + return { + form + }; +}) satisfies PageServerLoad; + export const actions = { - default: async (event) => { - const data = await event.request.formData(); + default: async ({ request, cookies }) => { + const form = await superValidate(request, schema); - const parse = schema.safeParse(Object.fromEntries(data.entries())); - - if (!parse.success) { - const errors = parse.error.errors.map((error) => { - const { path, message } = error; - return { field: path[0], message }; - }); - return fail(400, { errors }); + if (!form.valid) { + return fail(400, { form }); } const res = await fetch(`${API_URL}/login`, { method: 'POST', body: JSON.stringify({ - ...parse.data + ...form.data }) }); @@ -39,15 +42,17 @@ export const actions = { if (!token) throw new Error('No token found'); - event.cookies.set('session', token, { + cookies.set('session', token, { path: '/' }); throw redirect(303, '/dashboard'); } + form.errors.passwd = ["Nom d'utilisateur ou mot de passe incorrect"]; + return fail(400, { - errors: [{ field: 'passwd', message: "Nom d'utilisateur ou mot de passe incorrect" }] + form }); } } satisfies Actions; diff --git a/src/routes/sign-in/+page.svelte b/src/routes/sign-in/+page.svelte index 7735925..f2b20ab 100644 --- a/src/routes/sign-in/+page.svelte +++ b/src/routes/sign-in/+page.svelte @@ -1,12 +1,26 @@
@@ -15,20 +29,18 @@

Connexion

- - {#if form?.errors.find((error) => error.field === 'pseudo')} -

- {form?.errors.find((error) => error.field === 'pseudo')?.message} -

- {/if} + + {#if $errors.pseudo}{$errors.pseudo}{/if} - - {#if form?.errors.find((error) => error.field === 'passwd')} -

- {form?.errors.find((error) => error.field === 'passwd')?.message} -

- {/if} + + {#if $errors.passwd}{$errors.passwd}{/if}
diff --git a/src/routes/sign-up/+page.server.ts b/src/routes/sign-up/+page.server.ts index 64aefbc..12f197c 100644 --- a/src/routes/sign-up/+page.server.ts +++ b/src/routes/sign-up/+page.server.ts @@ -4,12 +4,9 @@ import { fail, redirect, type Actions } from '@sveltejs/kit'; import type { PageServerLoad } from './$types'; +import { superValidate } from 'sveltekit-superforms/server'; import { z } from 'zod'; -export const load = (async ({ locals: { user } }) => { - if (user) throw redirect(303, '/dashboard'); -}) satisfies PageServerLoad; - const registerSchema = z.object({ email: z .string() @@ -19,7 +16,17 @@ const registerSchema = z.object({ .trim(), firstname: z.string().trim(), lastname: z.string().trim(), - pseudo: z.string().trim() + pseudo: z.string().trim(), + code: z + .string({ + required_error: 'Code manquant' + }) + .length(4, { + message: 'Code invalide, il doit contenir 4 chiffres' + }) + .regex(/^[0-9]+$/) + .optional(), + passwd: z.string().optional() }); const confirmationSchema = z.object({ @@ -32,80 +39,80 @@ const confirmationSchema = z.object({ firstname: z.string().trim(), lastname: z.string().trim(), pseudo: z.string().trim(), - code: z.string(), + code: z + .string({ + required_error: 'Code manquant' + }) + .regex(/^[0-9]{4}$/, { + message: 'Code invalide, il doit contenir 4 chiffres' + }), passwd: z.string() }); +export const load = (async ({ locals: { user } }) => { + if (user) throw redirect(303, '/dashboard'); + + const form = await superValidate(registerSchema); + + return { + form + }; +}) satisfies PageServerLoad; + export const actions = { - register: async (event) => { - const data = await event.request.formData(); + register: async ({ request }) => { + const form = await superValidate(request, registerSchema); - const parse = registerSchema.safeParse(Object.fromEntries(data.entries())); - - if (!parse.success) { - const errors = parse.error.errors.map((error) => { - const { path, message } = error; - return { field: path[0], message }; - }); - return fail(400, { errors }); + if (!form.valid) { + return fail(400, { form }); } const res = await fetch(`${API_URL}/register`, { method: 'POST', body: JSON.stringify({ - pseudo: parse.data.pseudo, - firstname: parse.data.firstname, - lastname: parse.data.lastname, - email: parse.data.email + pseudo: form.data.pseudo, + firstname: form.data.firstname, + lastname: form.data.lastname, + email: form.data.email }) }); if (res.ok) { return { - success: true + form }; } if (res.status === 400) { const { email_valid } = await res.json(); - const errors = []; + if (!email_valid) form.errors.email = ['Un compte avec cette adresse email existe déjà']; - if (!email_valid) - errors.push({ - field: 'email', - message: 'Cet email est déjà utilisé' - }); - - return fail(400, { errors }); + return fail(400, { form }); } + form.errors.passwd = ["Une erreur s'est produite"]; + return fail(400, { - errors: [{ field: 'passwd', message: "Une erreur s'est produite" }] + form }); }, - confirmation: async (event) => { - const data = await event.request.formData(); + confirmation: async ({ request, cookies }) => { + const form = await superValidate(request, confirmationSchema); - const parse = confirmationSchema.safeParse(Object.fromEntries(data.entries())); - - if (!parse.success) { - const errors = parse.error.errors.map((error) => { - const { path, message } = error; - return { field: path[0], message }; - }); - return fail(400, { errors }); + if (!form.valid) { + return fail(400, { form }); } const res = await fetch(`${API_URL}/confirmation`, { method: 'POST', body: JSON.stringify({ - firstname: parse.data.firstname, - lastname: parse.data.lastname, - pseudo: parse.data.pseudo, - email: parse.data.email, - code: parseInt(parse.data.code), - passwd: parse.data.passwd + firstname: form.data.firstname, + lastname: form.data.lastname, + pseudo: form.data.pseudo, + email: form.data.email, + code: parseInt(form.data.code), + passwd: form.data.passwd }) }); @@ -114,15 +121,17 @@ export const actions = { if (!token) throw new Error('No token'); - event.cookies.set('token', token, { + cookies.set('session', token, { path: '/' }); throw redirect(303, '/dashboard'); } + form.errors.code = [`Une erreur s'est produite (${res.status} ${res.statusText})`]; + return fail(400, { - errors: [{ field: 'passwd', message: "Une erreur s'est produite" }] + form }); } } satisfies Actions; diff --git a/src/routes/sign-up/+page.svelte b/src/routes/sign-up/+page.svelte index 472ba99..ed5837c 100644 --- a/src/routes/sign-up/+page.svelte +++ b/src/routes/sign-up/+page.svelte @@ -1,25 +1,39 @@ @@ -27,83 +41,59 @@

- {data.confirmation ? 'Confirmation' : 'Inscription'} + {confirmation ? 'Confirmation' : 'Inscription'}

{ - return async ({ result }) => { - switch (result.type) { - case 'success': - data.confirmation = true; - break; - } - }; - }} - action={data.confirmation ? '/sign-up?/confirmation' : '/sign-up?/register'} + action={confirmation ? '?/confirmation' : '?/register'} + use:enhance > - {#if form?.errors?.find((error) => error.field === 'email')} -

- {form?.errors.find((error) => error.field === 'email')?.message} -

- {/if} + {#if $errors.email}{$errors.email}{/if} - {#if form?.errors?.find((error) => error.field === 'firstname')} -

- {form?.errors?.find((error) => error.field === 'firstname')?.message} -

- {/if} + {#if $errors.firstname}{$errors.firstname}{/if} - {#if form?.errors?.find((error) => error.field === 'lastname')} -

- {form?.errors?.find((error) => error.field === 'lastname')?.message} -

- {/if} + {#if $errors.lastname}{$errors.lastname}{/if} - {#if form?.errors?.find((error) => error.field === 'pseudo')} -

- {form?.errors?.find((error) => error.field === 'pseudo')?.message} -

- {/if} + {#if $errors.pseudo}{$errors.pseudo}{/if} - {#if data.confirmation} + {#if confirmation}
- {#if form?.errors?.find((error) => error.field === 'passwd')} -

- {form?.errors?.find((error) => error.field === 'passwd')?.message} -

- {/if} + {#if $errors.passwd}{$errors.passwd}{/if} + - {#if form?.errors?.find((error) => error.field === 'code')} -

- {form?.errors?.find((error) => error.field === 'code')?.message} -

- {/if} + {#if $errors.code}{$errors.code}{/if}
{/if}
  • Se connecter
  • - {#if data.confirmation} + {#if confirmation}
  • - Pas reçu ?
  • {/if}