114 lines
3.8 KiB
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}
|