import styles from './index.module.scss'; import axios from "axios"; import delve from 'dlv'; import {useRouter} from "next/router"; import {SubmitHandler, useForm} from 'react-hook-form'; import {BehaviorSubject, catchError, debounceTime, distinctUntilChanged, filter, map, of, switchMap} from "rxjs"; import {useEffect, useState} from "react"; import SeoConfig from "../../components/seo-config/seo-config"; import Layout from "../../components/layout/layout"; import {Inputs, signUpRequest} from "../../libs/api"; import {createJwtToken} from "../../libs/auth"; import {config} from "../../config"; import {environment} from "../../environments/environment"; const getPageMetadata = async (path) => { try { return await axios.get(`${environment.strapiApiUrl}/pages?filters[slug]=${path === '/' ? 'home' : path.slice(1, path.length)}&populate=deep`); } catch (e) { console.error(e); return Promise.resolve({}) } } export const getServerSideProps = async (context) => { const path = context.resolvedUrl; const menuHeader = await axios.get(`${environment.strapiApiUrl}/menus/1?nested&populate=deep`); const menuFooter = await axios.get(`${environment.strapiApiUrl}/menus/2?nested&populate=deep`); const page = await getPageMetadata(path); return { props: { menuHeaders: delve(menuHeader, 'data.data.attributes.items.data', []), menuFooter: delve(menuFooter, 'data.data.attributes.items.data', []), page: delve(page, "data.data.0.attributes", {}), seo: delve(page, "data.data.0.attributes.seo", {}) } } } export function SignUp({seo, menuHeaders, menuFooter}) { const router = useRouter(); const {register, handleSubmit, watch, getValues, formState: {errors}, setError, clearErrors} = useForm({ defaultValues: { email: "", username: "", password: "", passwordConfirmation: "", agreement: false, newsletter: false, } }); const [spinner, setSpinner] = useState(false); const [subject, setSubject] = useState(null); useEffect(() => { if (subject === null) { const sub = new BehaviorSubject(''); setSubject(sub); } else { subject.pipe( map((s: string) => s.trim()), distinctUntilChanged(), filter((s: string) => s.length >= 2), debounceTime(200), switchMap(async (value) => { setSpinner(true); const result = await axios.get(`http://localhost:1337/api/username/${value}`) if (result.data) { setError('email', {type: 'custom', message: "Cet email est déjà utilisé. Veuillez en saisir un autre."}); } else { clearErrors('email'); } }), catchError((err) => of(false)) ).subscribe(() => setSpinner(false)); } }, [subject]); const onSubmit: SubmitHandler = async (data: Inputs) => { try { const response = await signUpRequest(data); if (response && response.user) { if (response.user.confirmed) { const result = await createJwtToken(data.email, data.password); if (result.ok) { await router.replace('/'); return; } } else { await router.push('/signup-confirmation') return; } } else { throw new Error('no registered'); } } catch (e) { console.error(e); } }; const onEmailChange = (e) => subject.next(e.target.value); const hasErrors = () => Object.keys(errors).length > 0; return ( <>

Création de votre compte

Créez un compte gratuit 100% sécurisé.
Vous avez déjà un compte ? Connectez-vous ici .

{spinner && (
Loading...
)} {errors.email && (

{errors.email.message}

)}
{errors.username && (

{errors.username.message}

)}
{errors.password && errors.password.type !== "minLength" && (

{errors.password.message}

)} {errors.password && errors.password.type === "minLength" && (

Le mot de passe doit avoir une longueur minimum de 8 charactères

)}
{ const {password} = getValues(); return password === value || "Les mots de passe ne correspondent pas"; } } })} className={errors.passwordConfirmation ? "bg-red-50 border border-red-500 text-red-900 placeholder-red-700 text-sm rounded-lg focus:ring-red-500 dark:bg-gray-700 focus:border-red-500 block w-full p-2.5 dark:text-red-500 dark:placeholder-red-500 dark:border-red-500" : "bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-600 dark:border-gray-500 dark:placeholder-gray-400 dark:text-white"} placeholder=""/> {errors.passwordConfirmation && (

{errors.passwordConfirmation.message}

)}
{errors.agreement && (

{errors.agreement.message}

)}
Phone image
); } export default SignUp;