import React, { createContext, useContext, useState, useEffect, useCallback } from "react"; import * as SecureStore from "expo-secure-store"; import { login as apiLogin, getMe } from "../api/client"; interface User { id: number; username: string; email: string; role: { name: string }; } interface AuthCtx { user: User | null; loading: boolean; login(u: string, p: string): Promise; logout(): void; isAdmin: boolean; } const AuthContext = createContext(null); export function AuthProvider({ children }: { children: React.ReactNode }) { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); const loadUser = useCallback(async () => { const token = await SecureStore.getItemAsync("access_token"); if (!token) { setLoading(false); return; } try { const { data } = await getMe(); setUser(data); } catch { await SecureStore.deleteItemAsync("access_token"); await SecureStore.deleteItemAsync("refresh_token"); } finally { setLoading(false); } }, []); useEffect(() => { loadUser(); }, []); const login = async (username: string, password: string) => { const { data } = await apiLogin(username, password); await SecureStore.setItemAsync("access_token", data.access_token); await SecureStore.setItemAsync("refresh_token", data.refresh_token); await loadUser(); }; const logout = async () => { await SecureStore.deleteItemAsync("access_token"); await SecureStore.deleteItemAsync("refresh_token"); setUser(null); }; const isAdmin = user?.role?.name === "admin"; return ( {children} ); } export const useAuth = () => useContext(AuthContext)!;