'use client'; import { useEffect, useState } from 'react'; import { useRouter, usePathname } from 'next/navigation'; import { useToast } from '@/components/layout/ToastContext'; interface SolutionGuardProps { children: React.ReactNode; requiredSolution: string; // slug da solução (ex: 'crm', 'erp') } export function SolutionGuard({ children, requiredSolution }: SolutionGuardProps) { const router = useRouter(); const pathname = usePathname(); const { error } = useToast(); const [hasAccess, setHasAccess] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { const checkAccess = async () => { try { const response = await fetch('/api/tenant/solutions', { headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}`, }, }); if (response.ok) { const data = await response.json(); const solutions = data.solutions || []; const solutionSlugs = solutions.map((s: any) => s.slug.toLowerCase()); // Dashboard é sempre permitido if (requiredSolution === 'dashboard') { setHasAccess(true); } else { const hasPermission = solutionSlugs.includes(requiredSolution.toLowerCase()); if (!hasPermission) { // Mostra toast de aviso error('Acesso Negado', 'Você não tem acesso a este módulo. Contate o suporte para mais informações.'); // Redireciona imediatamente router.replace('/dashboard'); return; } setHasAccess(hasPermission); } } else { // Em caso de erro, redireciona para segurança error('Erro de Acesso', 'Não foi possível verificar suas permissões. Contate o suporte.'); router.replace('/dashboard'); return; } } catch (err) { // Em caso de erro, redireciona para segurança error('Erro de Acesso', 'Não foi possível verificar suas permissões. Contate o suporte.'); router.replace('/dashboard'); return; } finally { setLoading(false); } }; checkAccess(); }, [requiredSolution, router, pathname, error]); if (loading || hasAccess === false) { return null; } return <>{children}; }