2020-08-07 12:23:59 +02:00
// -- GESTION DU FORMULAIRE PERMETTANT DE CRÉER SON COMPTE
/// L'utilisateur peut avoir répondu à un quiz avant d'arriver sur la page d'inscription
2020-10-21 16:45:34 +02:00
/// Des ce cas il faut enregistrer son résultat en même temps que les premières informations de son compte (email, ok CGU)
/// Les infos du compte sont complétées (mot de passe, code parrain...) au moment de la validation.
2020-08-07 12:23:59 +02:00
// Fichier de configuration tirés du backend :
import { apiUrl , availableLangs , theme } from "../../config/instance.js" ;
const lang = availableLangs [ 0 ] ;
2020-10-07 12:29:31 +02:00
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
2020-08-07 12:23:59 +02:00
2020-08-12 17:08:26 +02:00
// Importation des fonctions utiles au script :
2020-08-07 12:23:59 +02:00
import { getLocaly , removeLocaly , saveLocaly } from "./tools/clientstorage.js" ;
import { addElement } from "./tools/dom.js" ;
2020-11-30 17:04:58 +01:00
import { helloDev , updateAccountLink } from "./tools/everywhere.js" ;
2020-08-07 12:23:59 +02:00
import { getDatasFromInputs , setAttributesToInputs } from "./tools/forms.js" ;
2020-08-13 12:12:29 +02:00
import { loadMatomo } from "./tools/matomo.js" ;
2020-10-20 16:41:34 +02:00
import { checkAnswerDatas , checkSession , getTimeDifference } from "./tools/users.js" ;
2020-08-07 12:23:59 +02:00
// Dictionnaires :
2020-10-21 16:45:34 +02:00
const { serverError } = require ( "../../lang/" + lang + "/general" ) ;
const { alreadyConnected , needUniqueEmail } = require ( "../../lang/" + lang + "/user" ) ;
2020-08-07 12:23:59 +02:00
// Principaux éléments du DOM manipulés :
2020-10-21 16:45:34 +02:00
const btnSubmit = document . getElementById ( "submitDatas" ) ;
2020-08-07 12:23:59 +02:00
const divResponse = document . getElementById ( "response" ) ;
const emailInput = document . getElementById ( "email" ) ;
2020-10-21 16:45:34 +02:00
const myForm = document . getElementById ( "subscription" ) ;
2020-08-07 12:23:59 +02:00
// Test de connexion de l'utilisateur + affichage formulaire d'inscription.
const initialise = async ( ) =>
{
try
{
const isConnected = await checkSession ( ) ;
if ( isConnected )
{
2020-11-30 17:04:58 +01:00
// on change le lien d'accès au compte
2020-08-07 12:23:59 +02:00
const user = getLocaly ( "user" , true ) ;
2020-11-30 17:04:58 +01:00
updateAccountLink ( user . status , configTemplate ) ;
myForm . style . display = "block" ;
myForm . innerHTML = "<p class='info'>" + alreadyConnected + "</p>" ;
2020-08-07 12:23:59 +02:00
}
else
{
2020-08-13 12:12:29 +02:00
loadMatomo ( ) ;
2020-08-07 12:23:59 +02:00
setAttributesToInputs ( configUsers , myForm ) ;
myForm . style . display = "block" ;
}
}
catch ( e )
{
2020-10-06 16:34:17 +02:00
addElement ( divResponse , "p" , serverError , "" , [ "error" ] ) ;
2020-08-07 12:23:59 +02:00
console . error ( e ) ;
}
}
initialise ( ) ;
2020-10-21 16:45:34 +02:00
helloDev ( ) ;
2020-08-07 12:23:59 +02:00
2020-10-21 16:45:34 +02:00
// Teste si l'e-mail saisi est déjà utilisé par un autre compte.
2020-08-07 12:23:59 +02:00
// Si c'est le cas, la validation du formulaire est bloquée.
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-21 16:45:34 +02:00
if ( this . status === 200 && response . free !== undefined && response . free === false )
2020-08-07 12:23:59 +02:00
{
2020-10-06 16:34:17 +02:00
addElement ( document . getElementById ( "emailMessage" ) , "div" , needUniqueEmail . replace ( "#URL" , configTemplate . connectionPage ) , "" , [ "error" ] ) ;
2020-08-07 12:23:59 +02:00
btnSubmit . setAttribute ( "disabled" , true ) ;
}
else
btnSubmit . removeAttribute ( "disabled" ) ;
}
}
xhr . setRequestHeader ( "Content-Type" , "application/json" ) ;
const datas = { emailTest : emailValue } ;
xhr . send ( JSON . stringify ( datas ) ) ;
}
} ) ;
2020-10-21 16:45:34 +02:00
// Supprime l'éventuel message d'erreur déjà injecté si l'utilisateur revient dans le champ :
emailInput . addEventListener ( "focus" , function ( e )
2020-08-07 12:23:59 +02:00
{
2020-10-21 16:45:34 +02:00
document . getElementById ( "emailMessage" ) . innerHTML = "" ;
2020-08-07 12:23:59 +02:00
} ) ;
// 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-08-12 17:08:26 +02:00
removeLocaly ( "lastAnswer" ) ; // ! important pour ne pas enregister plusieurs fois le résultat.
2020-08-07 12:23:59 +02:00
}
else if ( response . errors )
{
2020-08-12 17:08:26 +02:00
response . errors = response . errors . join ( "<br>" ) ;
2020-08-07 12:23:59 +02:00
addElement ( divResponse , "p" , response . errors , "" , [ "error" ] ) ;
}
else
2020-10-06 16:34:17 +02:00
addElement ( divResponse , "p" , serverError , "" , [ "error" ] ) ;
2020-08-07 12:23:59 +02:00
}
}
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, j'ajoute les infos de son résultat :
2020-08-07 12:23:59 +02:00
datas = checkAnswerDatas ( datas ) ;
xhr . send ( JSON . stringify ( datas ) ) ;
}
}
catch ( e )
{
2020-10-06 16:34:17 +02:00
addElement ( divResponse , "p" , serverError , "" , [ "error" ] ) ;
2020-08-07 12:23:59 +02:00
console . error ( e ) ;
}
} ) ;