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 | null;
8 setUser: (user?: UsersPermissionsUser) => void;
9 logout: () => void;
10};
11
12const hasStorage = typeof localStorage !== 'undefined';
13
14const useAuthStore = 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 &&
22 localStorage.getItem('user') &&
23 localStorage.getItem('user') !== 'undefined'
24 ? JSON.parse(localStorage.getItem('user'))
25 : null,
26 setUser: user => {
27 if (hasStorage) localStorage.setItem('user', JSON.stringify(user));
28 set({user});
29 },
30 logout: () => {
31 set({token: null, user: null});
32 localStorage.removeItem('token');
33 localStorage.removeItem('user');
34 window.location.href = '/auth/login';
35 },
36}));
37
38export default useAuthStore;