import { useState, useEffect, useCallback } from 'react' import api from '@/services/api' import type { User } from '@/types' interface AuthState { user: User | null token: string | null loading: boolean } export function useAuth() { const [state, setState] = useState({ user: null, token: localStorage.getItem('token'), loading: true, }) const fetchUser = useCallback(async () => { const token = localStorage.getItem('token') if (!token) { setState({ user: null, token: null, loading: false }) return } try { const { data } = await api.get('/auth/me') setState({ user: data, token, loading: false }) } catch { localStorage.removeItem('token') setState({ user: null, token: null, loading: false }) } }, []) useEffect(() => { fetchUser() }, [fetchUser]) const login = async (username: string, password: string) => { const form = new URLSearchParams() form.append('username', username) form.append('password', password) const { data } = await api.post('/auth/token', form, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, }) localStorage.setItem('token', data.access_token) setState((s) => ({ ...s, token: data.access_token })) await fetchUser() } const loginWithToken = async (token: string) => { localStorage.setItem('token', token) setState((s) => ({ ...s, token })) await fetchUser() } const logout = () => { localStorage.removeItem('token') setState({ user: null, token: null, loading: false }) } return { ...state, login, loginWithToken, logout } }