1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
import { useEffect, useContext, createContext } from "react";
import { useLocalStorage } from "../hooks/useLocalStorage";
const AuthContext = createContext({
signedIn: false,
setSignedIn: () => null,
sessionOver: new Date(),
setSessionOver: () => null,
setPlayer: () => null,
player: null,
signOut: () => null,
});
export const useAuthContext = () => useContext(AuthContext);
export const AuthProvider = ({ children }) => {
const [signedIn, setSignedIn] = useLocalStorage("signedIn", false);
const [sessionOver, setSessionOver] = useLocalStorage(
"sessionOver",
Date.now()
);
const [player, setPlayer] = useLocalStorage("player", null);
const setDefaults = () => {
setPlayer(null);
setSessionOver(Date.now());
setSignedIn(false);
};
const signOut = () =>
fetch("/api/player/logout", {
method: "GET",
credentials: "same-origin",
}).then(() => setDefaults());
useEffect(() => {
setTimeout(() => {
setSessionOver((sessionOver) => {
if (Date.now() >= sessionOver) {
setSignedIn((signedIn) => {
if (signedIn)
alert(
"Session expired. Any further privileged requests will fail until signed in again."
);
return false;
});
setPlayer(null);
}
return sessionOver;
});
}, sessionOver - Date.now());
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [sessionOver]);
return (
<AuthContext.Provider
value={{
signedIn,
setSignedIn,
sessionOver,
setSessionOver,
signOut,
setPlayer,
player,
}}
>
{children}
</AuthContext.Provider>
);
};
|