'use client'; import * as React from 'react'; import { useQuery, useQueryClient } from '@tanstack/react-query'; import { authService } from '@/services/auth'; import { ApiError } from '@/lib/api-client'; import type { CurrentUser } from '@/types'; import type { Permission } from '@/lib/permissions'; import { hasPermission, hasAnyPermission } from '@/lib/permissions'; interface AuthContextValue { user: CurrentUser | undefined; isLoading: boolean; isAuthenticated: boolean; can: (permission: Permission | Permission[]) => boolean; canAny: (permissions: Permission[]) => boolean; refetch: () => void; } const AuthContext = React.createContext(null); export function AuthProvider({ children }: { children: React.ReactNode }) { const { data, isLoading, refetch } = useQuery({ queryKey: ['auth', 'me'], queryFn: async () => { try { return await authService.me(); } catch (err) { if (err instanceof ApiError && err.status === 401) return null; throw err; } }, retry: false, staleTime: 60_000, }); const value: AuthContextValue = { user: data ?? undefined, isLoading, isAuthenticated: Boolean(data), can: (permission) => hasPermission(data?.permissions, permission), canAny: (permissions) => hasAnyPermission(data?.permissions, permissions), refetch, }; return {children}; } export function useAuth() { const ctx = React.useContext(AuthContext); if (!ctx) throw new Error('useAuth deve ser usado dentro de AuthProvider'); return ctx; } export function useLogout() { const queryClient = useQueryClient(); return async () => { await authService.logout(); queryClient.clear(); window.location.href = '/login'; }; }