/* Copyright (C) 2023-2026 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import { create } from 'zustand' export type UserPermissions = { sidebar_settings?: boolean sidebar_modules?: Record } export interface AuthUser { id: number username: string display_name?: string email?: string role: number status?: number group?: string quota?: number used_quota?: number request_count?: number aff_code?: string aff_count?: number aff_quota?: number aff_history_quota?: number inviter_id?: number github_id?: string oidc_id?: string wechat_id?: string telegram_id?: string linux_do_id?: string setting?: Record | string stripe_customer?: string sidebar_modules?: string permissions?: UserPermissions } interface AuthState { auth: { user: AuthUser | null setUser: (user: AuthUser | null) => void reset: () => void } } export const useAuthStore = create()((set) => { // Restore user info from localStorage const initUser = (() => { try { if (typeof window !== 'undefined') { const saved = window.localStorage.getItem('user') return saved ? JSON.parse(saved) : null } } catch { // Clear dirty data when parsing fails if (typeof window !== 'undefined') { window.localStorage.removeItem('user') } } return null })() return { auth: { user: initUser, setUser: (user) => set((state) => { // Persist user to localStorage if (typeof window !== 'undefined') { if (user) { window.localStorage.setItem('user', JSON.stringify(user)) } else { window.localStorage.removeItem('user') } } return { ...state, auth: { ...state.auth, user } } }), reset: () => set((state) => { if (typeof window !== 'undefined') { window.localStorage.removeItem('user') } return { ...state, auth: { ...state.auth, user: null }, } }), }, } })