From 7685173ed41fe25db7645f9ffdb565e66764561d Mon Sep 17 00:00:00 2001 From: Mathias Wagner Date: Sat, 20 Jul 2024 12:59:29 +0200 Subject: [PATCH] Create common User context --- .../src/common/contexts/User/UserContext.jsx | 56 +++++++++++++++++++ dashboard/src/common/contexts/User/index.js | 1 + 2 files changed, 57 insertions(+) create mode 100644 dashboard/src/common/contexts/User/UserContext.jsx create mode 100644 dashboard/src/common/contexts/User/index.js diff --git a/dashboard/src/common/contexts/User/UserContext.jsx b/dashboard/src/common/contexts/User/UserContext.jsx new file mode 100644 index 0000000..03231cc --- /dev/null +++ b/dashboard/src/common/contexts/User/UserContext.jsx @@ -0,0 +1,56 @@ +import {createContext, useEffect, useState} from "react"; +import Login from "@/states/Login"; +import Loading from "@/states/Loading"; +import {postRequest, sessionRequest} from "@/common/utils/RequestUtil.js"; +import Verify from "@/states/Verify"; + +export const UserContext = createContext({}); + +export const UserProvider = (props) => { + const [user, setUser] = useState({loggedIn: false}); + const [loading, setLoading] = useState(true); + const [sessionToken, setSessionToken] = useState(localStorage.getItem("sessionToken") || null); + + const updateUser = async (token) => { + if (!token && !sessionToken) { + setUser({loggedIn: false}); + return setLoading(false); + } + + try { + setUser({loggedIn: true, ...await sessionRequest("/user/me", "GET", token || sessionToken)}); + setLoading(false); + } catch (e) { + setLoading(false); + setUser({loggedIn: false}); + } + } + + const logout = async () => { + await postRequest("/auth/logout", {token: sessionToken}); + localStorage.removeItem("sessionToken"); + setSessionToken(null); + setUser({loggedIn: false}); + } + + useEffect(() => { + setTimeout(updateUser, 1000); + }, []); + + const updateSessionToken = (token) => { + localStorage.setItem("sessionToken", token); + setSessionToken(token); + updateUser(token); + } + + if (loading) return (); + + if (location.pathname.startsWith("/verify")) return ; + + return ( + + {!loading && !user.loggedIn && } + {!loading && user.loggedIn && props.children} + + ); +} \ No newline at end of file diff --git a/dashboard/src/common/contexts/User/index.js b/dashboard/src/common/contexts/User/index.js new file mode 100644 index 0000000..34132e3 --- /dev/null +++ b/dashboard/src/common/contexts/User/index.js @@ -0,0 +1 @@ +export * from "./UserContext"; \ No newline at end of file