Spaces:
Running
Running
| 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 }), | |
| })); | |