frontend/stores/useAuthStore.tsx (view raw)
1import create from 'zustand';
2import {UsersPermissionsUser} from '../generated/graphql';
3
4type State = {
5 token: string | null;
6 setToken: (token: string) => void;
7 user: UsersPermissionsUser;
8 setUser: (user: UsersPermissionsUser) => void;
9 logout: () => void;
10};
11
12const hasStorage = typeof localStorage !== 'undefined';
13
14const useAuth = create<State>((set, get) => ({
15 token: hasStorage ? localStorage.getItem('token') : null,
16 setToken: (token: string) => {
17 if (hasStorage) localStorage.setItem('token', token);
18 set({token});
19 },
20 user:
21 hasStorage && localStorage.getItem('user')
22 ? JSON.parse(localStorage.getItem('user'))
23 : null,
24 setUser: user => {
25 if (hasStorage) localStorage.setItem('user', JSON.stringify(user));
26 set({user});
27 },
28 logout: () => {
29 set({token: null, user: null});
30 localStorage.removeItem('token');
31 localStorage.removeItem('user');
32 window.location.href = '/login';
33 },
34}));
35
36export default useAuth;