summaryrefslogtreecommitdiff
path: root/front/src/context/auth_context.js
blob: 19747c661912690ab9338e1a7199823e445d2c28 (plain)
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>
  );
};