Aethel Bot OSS repository! aethel.xyz
bot fun ai discord discord-bot aethel
at dev 1.8 kB view raw
1import { create } from 'zustand'; 2import { persist } from 'zustand/middleware'; 3import axios from 'axios'; 4 5interface User { 6 id: string; 7 username: string; 8 discriminator: string | null; 9 avatar: string | null; 10 email?: string; 11} 12 13interface AuthState { 14 user: User | null; 15 token: string | null; 16 isAuthenticated: boolean; 17 login: (token: string, user: User) => void; 18 logout: () => void; 19 checkAuth: () => Promise<void>; 20} 21 22export const useAuthStore = create<AuthState>()( 23 persist( 24 (set, get) => ({ 25 user: null, 26 token: null, 27 isAuthenticated: false, 28 29 login: (token: string, user: User) => { 30 localStorage.setItem('token', token); 31 axios.defaults.headers.common['Authorization'] = `Bearer ${token}`; 32 set({ token, user, isAuthenticated: true }); 33 }, 34 35 logout: () => { 36 localStorage.removeItem('token'); 37 delete axios.defaults.headers.common['Authorization']; 38 set({ token: null, user: null, isAuthenticated: false }); 39 }, 40 41 checkAuth: async () => { 42 const token = localStorage.getItem('token'); 43 if (!token) { 44 set({ isAuthenticated: false }); 45 return; 46 } 47 48 try { 49 axios.defaults.headers.common['Authorization'] = `Bearer ${token}`; 50 const response = await axios.get(`${import.meta.env.VITE_FRONTEND_URL}/api/auth/me`); 51 set({ 52 token, 53 user: response.data.user, 54 isAuthenticated: true, 55 }); 56 } catch (error) { 57 console.error('Auth check failed:', error); 58 get().logout(); 59 } 60 }, 61 }), 62 { 63 name: 'auth-storage', 64 partialize: (state) => ({ 65 token: state.token, 66 user: state.user, 67 isAuthenticated: state.isAuthenticated, 68 }), 69 }, 70 ), 71);