all repos — caroster @ 649b38a11d20cec38f1990bbb7adf5cf651aab44

[Octree] Group carpool to your event https://caroster.io

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;