generateur_v3/frontend/src/context/Auth.svelte

114 lines
3.8 KiB
Svelte

<script lang="ts">
import {getContext, onMount, setContext} from 'svelte';
import {writable} from 'svelte/store';
import {
loginRequest,
refreshRequest,
registerRequest,
logoutRequest
} from '../requests/auth.request';
import jwt_decode from 'jwt-decode';
import {checkExpire} from '../utils/utils';
import {goto} from '$app/navigation';
import {page} from "$app/stores";
const username = writable<string | null>(null);
const isAuth = writable(false);
const initialLoading = writable(true);
const getTokens = () => {
return {access: localStorage.getItem('token'), refresh: localStorage.getItem('refresh')};
};
const {
alert,
info,
success,
error
} = getContext<{ alert: Function, info: Function, success: Function, error: Function }>('notif');
const login = (username: string, password: string) => {
return loginRequest({username, password})
.then((r) => {
localStorage.setItem('token', `${r.access_token}`);
localStorage.setItem('refresh', `${r.refresh_token}`);
const {username: name} = jwt_decode<{ username: string }>(r.access_token);
$username = name;
$isAuth = true;
success('Connexion', `Connecté en tant que **${username}** !`);
goto('/dashboard');
})
.catch((r) => {
error('Connexion', 'Erreur lors de la connexion !');
throw r.response;
});
};
const register = (username: string, password: string, confirm: string) => {
return registerRequest({username, password, password_confirm: confirm})
.then((r) => {
localStorage.setItem('token', `${r.access_token}`);
localStorage.setItem('refresh', `${r.refresh_token}`);
const {username: name} = jwt_decode<{ username: string }>(r.access_token);
$isAuth = true;
$username = name;
success('Inscription', `Connecté en tant que **${username}** !`);
goto('/dashboard');
})
.catch((r) => {
error('Deconnexion', "Erreur lors de l'inscription !");
throw r.response;
});
};
const logout = () => {
const {access, refresh} = getTokens();
if (isAuth && access != null) {
logoutRequest()
.then(() => {
$isAuth = false;
$username = null;
localStorage.removeItem('token');
localStorage.removeItem('refresh');
localStorage.removeItem('reconnect');
success('Déconnexion', 'Déconnecté !');
if($page.url.href.indexOf('room')> -1){
goto('/room')
}
})
.catch(() => {
error('Déconnexion', 'Erreur lors de la déconnexion !');
});
}
};
setContext('auth', {username, isAuth, login, register, logout, initialLoading});
onMount(() => {
const {access, refresh} = getTokens();
if (access != null) {
const {exp, username: name} = jwt_decode<{ username: string, exp: number }>(access);
if (checkExpire(exp) && refresh != null) {
refreshRequest(refresh).then((r) => {
localStorage.setItem('token', r.access_token);
$username = name;
$isAuth = true;
});
$initialLoading = false;
return;
}
$isAuth = true;
$username = name;
}
$initialLoading = false;
});
</script>
{#if !$initialLoading}
<slot/>
{/if}