generateur_v3/frontend/src/context/auth.context.jsx

148 lines
4.3 KiB
JavaScript

import { useNavigate } from "@solidjs/router";
import jwtDecode from "jwt-decode";
import { useContext } from "solid-js";
import { createSignal } from "solid-js";
import { Show } from "solid-js";
import { createEffect } from "solid-js";
import { createContext } from "solid-js";
import { createStore } from "solid-js/store";
import toast from "solid-toast";
import { setSourceMapRange } from "typescript";
import {
check_access,
get_user,
login_request,
refresh_request,
register_request,
revoke_access,
revoke_refresh,
} from "../requests/auth.requests.js";
import { useLoginPopup } from "./loginPopUp.context.jsx";
import { AiFillAndroid } from 'solid-icons/ai'
import { useNotification } from "./notification.context.jsx";
const AuthContext = createContext();
const jwt_expire_check = (token) => {
var { exp } = jwtDecode(token);
return Date.now() >= exp * 1000;
};
export function AuthProvider(props) {
const [username, setUsername] = createSignal(null);
const [isAuthenticated, setAuthenticated] = createSignal(false);
const [loading, setLoading] = createSignal(false);
const [initialLoading, setInitialLoading] = createSignal(true);
const navigate = useNavigate();
const notification = useNotification()
const popup = useLoginPopup();
createEffect(() => {
var token = localStorage.getItem("token");
var refresh = localStorage.getItem("refresh_token");
if (token != null) {
var is_expired = jwt_expire_check(token);
if (is_expired && refresh != null) {
refresh_request(refresh)
.then((r) => {
localStorage.setItem("token", r.access_token);
return r.access_token;
})
.then((t) => {
setAuthenticated(true);
var { sub } = jwtDecode(t);
setUsername(sub);
}).catch((err) => {
if ( !!err.response.status && err.reponse.status == 422) {
localStorage.removeItem("refresh_token");
localStorage.removeItem("token");
}
});
} else {
check_access(token)
.then(() => {
setAuthenticated(true);
var { sub } = jwtDecode(token);
setUsername(sub);
})
.catch((err) => {
if (err.reponse.status == 422) {
localStorage.removeItem("refresh_token");
localStorage.removeItem("token");
}
});
}
}
setInitialLoading(false);
});
const login = (username, password) => {
var data = new URLSearchParams({ username, password });
return login_request(data).then((r) => {
localStorage.setItem("token", r.access_token);
localStorage.setItem("refresh_token", r.refresh_token);
var decoded = jwtDecode(r.access_token);
setAuthenticated(true);
setUsername(decoded.sub);
if (popup.active == true) {
popup.next();
} else {
navigate("/dashboard");
}
});
};
const signup = (username, password, password2) => {
var data = new URLSearchParams({
username: username,
password: password,
password_confirm: password2,
});
register_request(data).then((r) => {
localStorage.setItem("token", r.access_token);
localStorage.setItem("refresh_token", r.refresh_token);
var decoded = jwtDecode(r.access_token);
setAuthenticated(true);
setUsername(decoded.sub);
navigate("/dashboard");
});
};
const logout = () => {
var token = localStorage.getItem("token");
var refresh = localStorage.getItem("refresh_token");
revoke_access(token)
.then(() => {
return revoke_refresh(refresh);
})
.then(() => {
localStorage.removeItem("token");
localStorage.removeItem("refresh_token");
setUsername(null)
setAuthenticated(false)
navigate("/login");
notification.success('Déconnexion', "Vous n'êtes plus connecté !")
});
};
return (
<AuthContext.Provider
value={{
username: username,
isAuthenticated: isAuthenticated,
loading: loading,
login,
signup,
logout,
}}
>
<Show when={!initialLoading()}>{props.children}</Show>
</AuthContext.Provider>
);
}
export const useAuth = () => useContext(AuthContext);