RealBlocks / client /src /store /authStore.ts
Sebebeb's picture
I AM TRAPPED IN THE BASEMENT PLEASE LET ME OUT
4026879
Raw
History Blame Contribute Delete
3.31 kB
import { create } from 'zustand';
import { api } from '../api/client';
import { User } from '../types';
interface AuthStore {
token: string | null;
user: User | null;
loading: boolean;
error: string | null;
initialized: boolean;
init: () => Promise<void>;
login: (email: string, password: string) => Promise<void>;
register: (email: string, username: string, password: string) => Promise<void>;
logout: () => Promise<void>;
forgotPassword: (email: string) => Promise<void>;
resetPassword: (token: string, password: string) => Promise<void>;
handleGoogleCallback: (token: string) => Promise<void>;
clearError: () => void;
}
export const useAuthStore = create<AuthStore>((set, get) => ({
token: localStorage.getItem('token'),
user: null,
loading: false,
error: null,
initialized: false,
init: async () => {
const token = localStorage.getItem('token');
if (!token) {
set({ initialized: true });
return;
}
api.setToken(token);
try {
const { user } = await api.getMe();
set({ user, token, initialized: true });
} catch {
localStorage.removeItem('token');
api.setToken(null);
set({ token: null, user: null, initialized: true });
}
},
login: async (email: string, password: string) => {
set({ loading: true, error: null });
try {
const { token, user } = await api.login(email, password);
localStorage.setItem('token', token);
api.setToken(token);
set({ token, user, loading: false });
} catch (err: any) {
set({ error: err.message, loading: false });
throw err;
}
},
register: async (email: string, username: string, password: string) => {
set({ loading: true, error: null });
try {
const { token, user } = await api.register(email, username, password);
localStorage.setItem('token', token);
api.setToken(token);
set({ token, user, loading: false });
} catch (err: any) {
set({ error: err.message, loading: false });
throw err;
}
},
logout: async () => {
try {
await api.logout();
} catch {}
localStorage.removeItem('token');
api.setToken(null);
set({ token: null, user: null });
},
forgotPassword: async (email: string) => {
set({ loading: true, error: null });
try {
await api.forgotPassword(email);
set({ loading: false });
} catch (err: any) {
set({ error: err.message, loading: false });
throw err;
}
},
resetPassword: async (token: string, password: string) => {
set({ loading: true, error: null });
try {
await api.resetPassword(token, password);
set({ loading: false });
} catch (err: any) {
set({ error: err.message, loading: false });
throw err;
}
},
handleGoogleCallback: async (token: string) => {
set({ loading: true, error: null });
try {
localStorage.setItem('token', token);
api.setToken(token);
const { user } = await api.getMe();
set({ token, user, loading: false });
} catch (err: any) {
localStorage.removeItem('token');
api.setToken(null);
set({ error: err.message, loading: false, token: null, user: null });
throw err;
}
},
clearError: () => set({ error: null }),
}));