Aethel Bot OSS repository!
aethel.xyz
bot
fun
ai
discord
discord-bot
aethel
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);