148 lines
4.3 KiB
JavaScript
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);
|