cnmksjs's picture
Upload 59 files
2c6bb7b verified
import { create } from 'zustand'
import { persist } from 'zustand/middleware'
import { User } from '../../../shared/types'
import { authService } from '../services/authService'
interface AuthState {
user: User | null
token: string | null
loading: boolean
error: string | null
}
interface AuthActions {
login: (email: string, password: string) => Promise<void>
register: (data: {
email: string
username: string
password: string
displayName: string
}) => Promise<void>
logout: () => void
checkAuth: () => Promise<void>
updateUser: (user: Partial<User>) => void
clearError: () => void
}
export const useAuthStore = create<AuthState & AuthActions>()(
persist(
(set, get) => ({
// State
user: null,
token: null,
loading: false,
error: null,
// Actions
login: async (email: string, password: string) => {
set({ loading: true, error: null })
try {
const response = await authService.login({ email, password })
set({
user: response.user,
token: response.token,
loading: false,
error: null,
})
} catch (error: any) {
set({
loading: false,
error: error.message || 'Login failed',
})
throw error
}
},
register: async (data) => {
set({ loading: true, error: null })
try {
const response = await authService.register(data)
set({
user: response.user,
token: response.token,
loading: false,
error: null,
})
} catch (error: any) {
set({
loading: false,
error: error.message || 'Registration failed',
})
throw error
}
},
logout: () => {
authService.logout()
set({
user: null,
token: null,
error: null,
})
},
checkAuth: async () => {
const { token } = get()
if (!token) {
set({ loading: false })
return
}
set({ loading: true })
try {
const user = await authService.getCurrentUser()
set({
user,
loading: false,
error: null,
})
} catch (error) {
set({
user: null,
token: null,
loading: false,
error: null,
})
}
},
updateUser: (userData) => {
const { user } = get()
if (user) {
set({
user: { ...user, ...userData },
})
}
},
clearError: () => {
set({ error: null })
},
}),
{
name: 'auth-storage',
partialize: (state) => ({
token: state.token,
user: state.user,
}),
}
)
)