import { useState, useEffect, createContext, useContext } from 'react' import * as SecureStore from 'expo-secure-store' import { login as apiLogin, getMe } from '../services/api' interface User { username: string display_name: string role: string email?: string } interface AuthCtx { user: User | null token: string | null loading: boolean login: (u: string, p: string) => Promise logout: () => Promise } import { createContext as _cc } from 'react' export const AuthContext = _cc({} as AuthCtx) export function useAuth() { return useContext(AuthContext) } export function useAuthState(): AuthCtx { const [user, setUser] = useState(null) const [token, setToken] = useState(null) const [loading, setLoading] = useState(true) useEffect(() => { ;(async () => { try { const t = await SecureStore.getItemAsync('grd_token') const u = await SecureStore.getItemAsync('grd_user') if (t && u) { setToken(t) setUser(JSON.parse(u)) } } catch {} setLoading(false) })() }, []) const login = async (username: string, password: string) => { const r = await apiLogin(username, password) const { access_token } = r.data await SecureStore.setItemAsync('grd_token', access_token) const me = await getMe() await SecureStore.setItemAsync('grd_user', JSON.stringify(me.data)) setToken(access_token) setUser(me.data) } const logout = async () => { await SecureStore.deleteItemAsync('grd_token') await SecureStore.deleteItemAsync('grd_user') setToken(null) setUser(null) } return { user, token, loading, login, logout } }