frontend/stores/useAuthStore.ts (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: Omit<UsersPermissionsUser, 'created_at' | 'updated_at' | '__typename'> | null;
8 setUser: (
9 user?: Omit<UsersPermissionsUser, 'created_at' | 'updated_at' | '__typename'>
10 ) => void;
11 logout: () => void;
12};
13
14const hasStorage = typeof localStorage !== 'undefined';
15
16const useAuthStore = create<State>((set, get) => ({
17 token: hasStorage ? localStorage.getItem('token') : null,
18 setToken: (token: string) => {
19 if (hasStorage) localStorage.setItem('token', token);
20 set({token});
21 },
22 user:
23 hasStorage &&
24 localStorage.getItem('user') &&
25 localStorage.getItem('user') !== 'undefined'
26 ? JSON.parse(localStorage.getItem('user'))
27 : null,
28 setUser: user => {
29 if (hasStorage) localStorage.setItem('user', JSON.stringify(user));
30 set({user});
31 },
32 logout: () => {
33 set({token: null, user: null});
34 localStorage.removeItem('token');
35 localStorage.removeItem('user');
36 window.location.href = '/auth/login';
37 },
38}));
39
40export default useAuthStore;