WikiLerni/front/src/connection.js

148 lines
6.5 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// -- GESTION DU FORMULAIRE PERMETTANT DE SE CONNECTER
/// L'utilisateur peut avoir répondu à un quiz avant d'arriver sur la page de connexion
/// Dans ce cas il faut enregistrer son résultat en même temps, une fois la connexion validée
/// Le connexion peut se faire directement ici via la saisie d'un mot de passe
/// Ou via l'envoi d'un token par e-mail
// Fichier de configuration tirés du backend :
import { apiUrl, availableLangs, siteUrl, theme } from "../../config/instance.js";
const lang=availableLangs[0];
import { connectionRoute, getLoginLinkRoute, userRoutes } from "../../config/users.js";
const configTemplate = require("../../views/"+theme+"/config/"+lang+".js");
// Importation des fonctions utile au script :
import { getLocaly, removeLocaly, saveLocaly } from "./tools/clientstorage.js";
import { addElement } from "./tools/dom.js";
import { helloDev } from "./tools/everywhere.js";
import { getDatasFromInputs } from "./tools/forms.js";
import { isEmpty } from "../../tools/main";
import { checkAnswerDatas, checkSession, getConfig, getTimeDifference, setSession } from "./tools/users.js";
// Dictionnaires :
const txt = require("../../lang/"+lang+"/general");
const txtUsers = require("../../lang/"+lang+"/user");
// Principaux éléments du DOM manipulés :
const myForm = document.getElementById("connection");
const divMessage = document.getElementById("message");
const divResponse = document.getElementById("response");
helloDev();
// Test de connexion de l'utilisateur + affichage formulaire d'inscription.
const initialise = async () =>
{
try
{
const isConnected=await checkSession();
if(isConnected)
{
saveLocaly("message", { message: txtUsers.alreadyConnected, color:"information" });// pour l'afficher sur la page suivante
const user=getLocaly("user", true);
const homePage=user.status+"HomePage";
window.location.assign("/"+configTemplate[homePage]);
addElement(divResponse, "p", txtUsers.alreadyConnected, "", ["information"]);// au cas où blocage redirection
}
else
{
myForm.style.display="block";
if(!isEmpty(getLocaly("message")))
{
addElement(divMessage, "p", getLocaly("message", true).message, "", [getLocaly("message", true).color]);
removeLocaly("message");
}
}
}
catch(e)
{
addElement(divResponse, "p", txt.serverError, "", ["error"]);
console.error(e);
}
}
initialise();
// Traitement de l'envoi des données de connexion :
myForm.addEventListener("submit", function(e)
{
try
{
e.preventDefault();
divResponse.innerHTML="";// efface d'éventuels messages déjà affichés
let datas=getDatasFromInputs(myForm);
if(isEmpty(datas.password) && isEmpty(datas.getLoginLink))
addElement(divResponse, "div", txtUsers.needChooseLoginWay, "", ["error"]);
else
{
const xhr = new XMLHttpRequest();
if(!isEmpty(datas.getLoginLink))
xhr.open("POST", apiUrl+userRoutes+getLoginLinkRoute);
else
xhr.open("POST", apiUrl+userRoutes+connectionRoute);
xhr.onreadystatechange = function()
{
if (this.readyState == XMLHttpRequest.DONE)
{
let response=JSON.parse(this.responseText);
if (this.status === 200)
{
if(!isEmpty(response.message))
{ // cas d'une demande de lien de connexion
myForm.style.display="none";
addElement(divResponse, "p", response.message, "", ["success"]);
}
else if(!isEmpty(response.userId) && !isEmpty(response.connexionTime) && !isEmpty(response.token))
{ // cas d'une connexion directe, on créé une session de connexion et redirige l'utilisateur
let connexionMaxTime=Date.now();
if(response.connexionTime.endsWith("days"))
connexionMaxTime+=parseInt(response.connexionTime,10)*24*3600*1000;
else
connexionMaxTime+=parseInt(response.connexionTime,10)*3600*1000;
setSession(response.userId, response.token, connexionMaxTime);
removeLocaly("lastAnswer");// ! important pour ne pas enregister plusieurs fois le résultat
myForm.style.display="none";
//addElement(divResponse, "p", txtUsers.connectionOk, "", ["success"]);// au cas où blocage redirection
// l'utilisateur peut avoir tenté d'accéder à une autre page que sa page d'accueil :
let url=getLocaly("url", true);
if(!isEmpty(url) && url.href.indexOf(siteUrl)!==-1)
{
url=url.href;
removeLocaly("url");
}
else
url=configTemplate[response.status+"HomePage"]
window.location.assign(url);
}
else
addElement(divResponse, "p", txt.serverError, "", ["error"]);
}
else if (response.errors)
{
if(Array.isArray(response.errors))
response.errors = response.errors.join("<br>");
else
response.errors = txt.serverError;
addElement(divResponse, "p", response.errors, "", ["error"]);
}
else
addElement(divResponse, "p", txt.serverError, "", ["error"]);
}
}
xhr.setRequestHeader("Content-Type", "application/json");
if(datas)
{
datas.timeDifference=getTimeDifference();
// si l'utilisateur a précédement répondu à un quiz, j'ajoute les infos de son résultat :
datas=checkAnswerDatas(datas);
xhr.send(JSON.stringify(datas));
}
}
}
catch(e)
{
addElement(divResponse, "p", txt.serverError, "", ["error"]);
console.error(e);
}
});