feat: implement authentication flow with login, registration, and OAuth support

This commit is contained in:
JSC
2025-07-26 18:37:47 +02:00
parent 12cb39503b
commit 57429f9414
11 changed files with 924 additions and 1 deletions

View File

@@ -0,0 +1,74 @@
import { createContext, useContext, useEffect, useState, type ReactNode } from 'react'
import { apiService } from '@/lib/api'
import type { AuthContextType, User, LoginRequest, RegisterRequest } from '@/types/auth'
const AuthContext = createContext<AuthContextType | null>(null)
export function useAuth() {
const context = useContext(AuthContext)
if (!context) {
throw new Error('useAuth must be used within an AuthProvider')
}
return context
}
interface AuthProviderProps {
children: ReactNode
}
export function AuthProvider({ children }: AuthProviderProps) {
const [user, setUser] = useState<User | null>(null)
const [loading, setLoading] = useState(true)
useEffect(() => {
const initAuth = async () => {
try {
// Try to get user info using cookies
const user = await apiService.getMe()
setUser(user)
} catch {
// User is not authenticated - this is normal for logged out users
}
setLoading(false)
}
initAuth()
}, [])
const login = async (credentials: LoginRequest) => {
try {
const response = await apiService.login(credentials)
setUser(response.user)
} catch (error) {
console.error('Login failed:', error)
throw error
}
}
const register = async (data: RegisterRequest) => {
try {
const response = await apiService.register(data)
setUser(response.user)
} catch (error) {
console.error('Registration failed:', error)
throw error
}
}
const logout = async () => {
await apiService.logout()
setUser(null)
}
const value: AuthContextType = {
user,
token: user ? 'cookie-based' : null,
login,
register,
logout,
loading,
setUser,
}
return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>
}