170 lines
7.0 KiB
JavaScript
170 lines
7.0 KiB
JavaScript
|
import { apiUrl, availableLangs, siteUrl, theme } from "../../../config/instance.js";
|
|||
|
const lang=availableLangs[0];
|
|||
|
|
|||
|
const configTemplate = require("../../../views/"+theme+"/config/"+lang+".js");
|
|||
|
|
|||
|
import { checkLoginRoute, timeDifferenceMax, timeDifferenceMin, userRoutes } from "../../../config/users.js";
|
|||
|
|
|||
|
import { getLocaly, removeLocaly, saveLocaly } from "./clientstorage.js";
|
|||
|
import { isEmpty } from "../../../tools/main";
|
|||
|
|
|||
|
// Récupère les données de configuration des utilisateurs
|
|||
|
// À terme, un fichier statique importable comme module devrait éviter une requête ajax
|
|||
|
export const getConfig = async () =>
|
|||
|
{
|
|||
|
return new Promise((resolve, reject) =>
|
|||
|
{
|
|||
|
const xhr = new XMLHttpRequest();
|
|||
|
xhr.open("GET", apiUrl+"/user/getconfig");
|
|||
|
xhr.onload = () => resolve(JSON.parse(xhr.responseText));
|
|||
|
xhr.onerror = () => reject(xhr.statusText);
|
|||
|
xhr.send();
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
export const getTimeDifference = () =>
|
|||
|
{
|
|||
|
// multiplier par -1, car c'est ce qu'il faut "ajouter" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse
|
|||
|
const timeLocal=new Date().getTimezoneOffset()*-1;
|
|||
|
if(timeLocal > timeDifferenceMax || timeLocal < timeDifferenceMin)
|
|||
|
return 0;
|
|||
|
else return timeLocal;
|
|||
|
}
|
|||
|
|
|||
|
// On enlève volontairement les 0/O pour éviter les confusions !
|
|||
|
// Et mieux vaut aussi débuter et finir par une lettre simple.
|
|||
|
export const getPassword = (nbCarMin, nbCarMax) =>
|
|||
|
{
|
|||
|
const nbCar=nbCarMin+Math.floor(Math.random()*(nbCarMax-nbCarMin));
|
|||
|
const letters="ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz";
|
|||
|
const others="123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";
|
|||
|
let password=letters[Math.floor(Math.random()*letters.length)];
|
|||
|
for(let i=1;i<(nbCar-1);i++)
|
|||
|
{
|
|||
|
if((i % 2) ===1)
|
|||
|
password+=others[Math.floor(Math.random()*others.length)];
|
|||
|
else
|
|||
|
password+=letters[Math.floor(Math.random()*letters.length)];
|
|||
|
}
|
|||
|
password+=letters[Math.floor(Math.random()*letters.length)];
|
|||
|
return password;
|
|||
|
}
|
|||
|
|
|||
|
// J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite
|
|||
|
// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides.
|
|||
|
export const setSession = (userId, token, durationTS) =>
|
|||
|
{
|
|||
|
const storageUser=
|
|||
|
{
|
|||
|
id: userId,
|
|||
|
token: token,
|
|||
|
duration: durationTS
|
|||
|
}
|
|||
|
saveLocaly("user", storageUser);
|
|||
|
}
|
|||
|
|
|||
|
// Vérifie qu'il y a des données locales concernant le résultat d'un quiz
|
|||
|
// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas
|
|||
|
export const checkAnswerDatas = (datas) =>
|
|||
|
{
|
|||
|
const lastAnswer=getLocaly("lastAnswer");
|
|||
|
if(!isEmpty(lastAnswer))
|
|||
|
{
|
|||
|
const answer=JSON.parse(lastAnswer);
|
|||
|
if(!isEmpty(answer.duration) && !isEmpty(answer.nbCorrectAnswers) && !isEmpty(answer.QuestionnaireId) && !isEmpty(answer.nbQuestions))
|
|||
|
{
|
|||
|
datas.duration=answer.duration;
|
|||
|
datas.nbCorrectAnswers=answer.nbCorrectAnswers;
|
|||
|
datas.QuestionnaireId=answer.QuestionnaireId;
|
|||
|
datas.nbQuestions=answer.nbQuestions;
|
|||
|
}
|
|||
|
}
|
|||
|
return datas;
|
|||
|
}
|
|||
|
|
|||
|
// Cette fonction teste la connexion de l'utilisateur d'une page
|
|||
|
// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté
|
|||
|
export const checkSession = async (status=[], urlRedirection, message, urlWanted) =>
|
|||
|
{
|
|||
|
return new Promise((resolve, reject) =>
|
|||
|
{
|
|||
|
const userDatas=getLocaly("user");
|
|||
|
if(isEmpty(userDatas))
|
|||
|
{
|
|||
|
redirectUser(urlRedirection, message, urlWanted);
|
|||
|
resolve(false);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
const user=JSON.parse(userDatas);
|
|||
|
if(isEmpty(user.id) || isEmpty(user.token) || isEmpty(user.duration) || user.duration < Date.now())
|
|||
|
{
|
|||
|
removeLocaly("user");
|
|||
|
redirectUser(urlRedirection, message, urlWanted);
|
|||
|
resolve(false);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
const xhr = new XMLHttpRequest();
|
|||
|
xhr.open("GET", apiUrl+userRoutes+checkLoginRoute+user.token);
|
|||
|
xhr.onload = () =>
|
|||
|
{
|
|||
|
let response=JSON.parse(xhr.responseText);
|
|||
|
if (xhr.status === 200 && response.isValid && response.id != undefined)
|
|||
|
{
|
|||
|
if(response.id===user.id)
|
|||
|
{
|
|||
|
user.name=response.name;
|
|||
|
user.language=response.language;
|
|||
|
user.timeDifference=response.timeDifference;
|
|||
|
user.status=response.status;// c'est le token qui sert à vérifier le statut à chaque requête à l'API
|
|||
|
saveLocaly("user", user);
|
|||
|
// si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-)
|
|||
|
if(response.status==="user" && response.nbDaysOk <= 0)
|
|||
|
{
|
|||
|
const urlAccount=siteUrl+"/"+configTemplate.accountPage;
|
|||
|
if(window.location.href.indexOf(urlAccount)===-1)
|
|||
|
window.location.assign("/"+configTemplate.accountPage+"#subscribe");// passée directement ici, l'ancre #subscribe ne fonctionne pas !?
|
|||
|
resolve(true);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if(status.length!==0 && status.indexOf(response.status)===-1)
|
|||
|
{
|
|||
|
redirectUser(urlRedirection, message, urlWanted);
|
|||
|
resolve(false);
|
|||
|
}
|
|||
|
else
|
|||
|
resolve(true);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
removeLocaly("user");
|
|||
|
redirectUser(urlRedirection, message, urlWanted);
|
|||
|
resolve(false);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
removeLocaly("user");
|
|||
|
redirectUser(urlRedirection, message, urlWanted);
|
|||
|
resolve(false);
|
|||
|
}
|
|||
|
}
|
|||
|
xhr.onerror = () => reject(xhr.statusText);
|
|||
|
xhr.send();
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
// Cette fonction sert à la précédente en cas de connexion non valide
|
|||
|
const redirectUser = (urlRedirection, message, urlWanted) =>
|
|||
|
{
|
|||
|
if(!isEmpty(message))
|
|||
|
saveLocaly("message", message);
|
|||
|
if(!isEmpty(urlWanted))
|
|||
|
saveLocaly("url", urlWanted);
|
|||
|
if(!isEmpty(urlRedirection))
|
|||
|
window.location.assign(urlRedirection);
|
|||
|
}
|