WikiLerni/front/src/tools/users.js

141 lines
5.9 KiB
JavaScript
Raw Normal View History

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";
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;
}
// 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 ou d'un groupe de quizs
// 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.nbQuestions) && (!isEmpty(answer.QuestionnaireId) || !isEmpty(answer.GroupId)))
{
datas.duration=answer.duration;
datas.nbCorrectAnswers=answer.nbCorrectAnswers;
datas.nbQuestions=answer.nbQuestions;
if(!isEmpty(answer.QuestionnaireId))
datas.QuestionnaireId=answer.QuestionnaireId;
else
datas.GroupId=answer.GroupId;
}
}
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);
}