2020-10-20 16:41:34 +02:00
// -- PAGE AFFICHANT L'ÉLÉMENT D'UN GROUPE DE QUIZ ET PROPOSANT DE CRÉER SON COMPTE DE MANIÈRE SIMPLIFIÉE
2020-10-20 11:01:52 +02:00
2020-10-20 16:41:34 +02:00
/// L'utilisateur peut avoir répondu à un quiz avant de lancer la création de son compte
/// Dans ce cas il faut enregistrer son résultat en même temps que les informations de son compte
2020-10-20 11:01:52 +02:00
// Fichier de configuration tirés du backend :
import { apiUrl , availableLangs , theme } from "../../config/instance.js" ;
const lang = availableLangs [ 0 ] ;
const configTemplate = require ( "../../views/" + theme + "/config/" + lang + ".js" ) ; // besoin de toutes les déclarations, car appel dynamique : configTemplate[homePage]
const configUsers = require ( "../../config/users" ) ; // idem pour configurer formulaire
// Importation des fonctions utiles au script :
2020-10-20 16:41:34 +02:00
import { getLocaly , removeLocaly } from "./tools/clientstorage.js" ;
2020-10-20 11:01:52 +02:00
import { addElement } from "./tools/dom.js" ;
2020-10-20 16:41:34 +02:00
import { helloDev , updateAccountLink } from "./tools/everywhere.js" ;
2020-10-20 11:01:52 +02:00
import { getDatasFromInputs , setAttributesToInputs } from "./tools/forms.js" ;
import { loadMatomo } from "./tools/matomo.js" ;
2020-10-20 16:41:34 +02:00
import { checkAnswerDatas , checkSession , getTimeDifference } from "./tools/users.js" ;
2020-10-20 11:01:52 +02:00
// Dictionnaires :
2020-10-20 16:41:34 +02:00
const { serverError } = require ( "../../lang/" + lang + "/general" ) ;
const { needUniqueEmail } = require ( "../../lang/" + lang + "/user" ) ;
2020-10-20 11:01:52 +02:00
// Principaux éléments du DOM manipulés :
2020-10-20 16:41:34 +02:00
const btnSubmit = document . getElementById ( "submitDatas" ) ;
2020-10-20 11:01:52 +02:00
const divResponse = document . getElementById ( "response" ) ;
const emailInput = document . getElementById ( "email" ) ;
2020-10-20 16:41:34 +02:00
const myForm = document . getElementById ( "subscription" ) ;
2020-10-20 11:01:52 +02:00
2020-10-20 16:41:34 +02:00
// Test de connexion de l'utilisateur + affichage formulaire d'inscription :
2020-10-20 11:01:52 +02:00
const initialise = async ( ) =>
{
try
{
2020-10-20 16:41:34 +02:00
let isConnected = await checkSession ( ) , user ;
2020-10-20 11:01:52 +02:00
if ( isConnected )
{
2020-10-20 16:41:34 +02:00
user = getLocaly ( "user" , true ) ;
updateAccountLink ( user . status , configTemplate ) ; // lien vers le compte adapté pour les utilisateurs connectés
2020-10-20 11:01:52 +02:00
}
else
{
loadMatomo ( ) ;
setAttributesToInputs ( configUsers , myForm ) ;
myForm . style . display = "block" ;
}
}
catch ( e )
{
addElement ( divResponse , "p" , serverError , "" , [ "error" ] ) ;
console . error ( e ) ;
}
}
initialise ( ) ;
2020-10-20 16:41:34 +02:00
helloDev ( ) ;
2020-10-20 11:01:52 +02:00
// Test si l'e-mail saisi est déjà utilisé par un autre compte.
// Si c'est le cas, la validation du formulaire est bloquée.
emailInput . addEventListener ( "focus" , function ( e )
{
document . getElementById ( "emailMessage" ) . innerHTML = "" ; // pour supprimer l'éventuel message d'erreur déjà affiché
} ) ;
emailInput . addEventListener ( "blur" , function ( e )
{
const emailValue = emailInput . value . trim ( ) ;
if ( emailValue !== "" )
{
const xhr = new XMLHttpRequest ( ) ;
xhr . open ( "POST" , apiUrl + configUsers . userRoutes + configUsers . checkIfIsEmailfreeRoute ) ;
xhr . onreadystatechange = function ( )
{
if ( this . readyState == XMLHttpRequest . DONE )
{
let response = JSON . parse ( this . responseText ) ;
2020-10-20 16:41:34 +02:00
if ( this . status === 200 && response . free !== undefined && response . free === false )
2020-10-20 11:01:52 +02:00
{
addElement ( document . getElementById ( "emailMessage" ) , "div" , needUniqueEmail . replace ( "#URL" , configTemplate . connectionPage ) , "" , [ "error" ] ) ;
btnSubmit . setAttribute ( "disabled" , true ) ;
}
else
btnSubmit . removeAttribute ( "disabled" ) ;
}
}
xhr . setRequestHeader ( "Content-Type" , "application/json" ) ;
const datas = { emailTest : emailValue } ;
xhr . send ( JSON . stringify ( datas ) ) ;
}
} ) ;
// Traitement de l'envoi des données d'inscription :
myForm . addEventListener ( "submit" , function ( e )
{
try
{
e . preventDefault ( ) ;
const xhr = new XMLHttpRequest ( ) ;
xhr . open ( "POST" , apiUrl + configUsers . userRoutes + configUsers . subscribeRoute ) ;
xhr . onreadystatechange = function ( )
{
if ( this . readyState == XMLHttpRequest . DONE )
{
let response = JSON . parse ( this . responseText ) ;
if ( this . status === 201 )
{
myForm . style . display = "none" ;
addElement ( divResponse , "p" , response . message , "" , [ "success" ] ) ;
2020-10-20 16:41:34 +02:00
removeLocaly ( "lastAnswer" ) ; // !! important, pour ne pas enregister plusieurs fois le résultat.
2020-10-20 11:01:52 +02:00
}
else if ( response . errors )
{
2020-10-20 16:41:34 +02:00
if ( Array . isArray ( response . errors ) )
response . errors = response . errors . join ( "<br>" ) ;
else
response . errors = serverError ;
2020-10-20 11:01:52 +02:00
addElement ( divResponse , "p" , response . errors , "" , [ "error" ] ) ;
}
else
addElement ( divResponse , "p" , serverError , "" , [ "error" ] ) ;
}
}
xhr . setRequestHeader ( "Content-Type" , "application/json" ) ;
let datas = getDatasFromInputs ( myForm ) ;
if ( datas )
{
datas . timeDifference = getTimeDifference ( configUsers ) ;
2020-10-21 16:45:34 +02:00
// Si l'utilisateur a précédement répondu à un quiz, on ajoute les données de son résultat :
2020-10-20 11:01:52 +02:00
datas = checkAnswerDatas ( datas ) ;
xhr . send ( JSON . stringify ( datas ) ) ;
}
}
catch ( e )
{
addElement ( divResponse , "p" , serverError , "" , [ "error" ] ) ;
console . error ( e ) ;
}
} ) ;