78 lines
2.1 KiB
TypeScript
78 lines
2.1 KiB
TypeScript
// ARQUIVO COMPLETO PARA: hooks/useAuthLayout.ts
|
|
|
|
import { useState, useEffect } from "react";
|
|
import { useRouter } from "next/navigation";
|
|
import { usersService } from "@/services/usersApi.mjs";
|
|
import { toast } from "@/hooks/use-toast";
|
|
|
|
interface UserLayoutData {
|
|
id: string;
|
|
name: string;
|
|
email: string;
|
|
roles: string[];
|
|
avatar_url?: string;
|
|
avatarFullUrl?: string;
|
|
}
|
|
|
|
interface UseAuthLayoutOptions {
|
|
requiredRole?: string[];
|
|
}
|
|
|
|
export function useAuthLayout(
|
|
{ requiredRole }: UseAuthLayoutOptions = {}
|
|
) {
|
|
const [user, setUser] = useState<UserLayoutData | null>(null);
|
|
const [isLoading, setIsLoading] = useState(true);
|
|
const router = useRouter();
|
|
|
|
useEffect(() => {
|
|
const fetchUserData = async () => {
|
|
try {
|
|
const fullUserData = await usersService.getMe();
|
|
|
|
// só verifica papel se requiredRole existir
|
|
if (
|
|
requiredRole &&
|
|
!fullUserData.roles.some((role: string) =>
|
|
requiredRole.includes(role)
|
|
)
|
|
) {
|
|
console.error(
|
|
`Acesso negado. Requer perfil '${requiredRole}', mas o usuário tem '${fullUserData.roles.join(", ")}'.`
|
|
);
|
|
toast({
|
|
title: "Acesso Negado",
|
|
description: "Você não tem permissão para acessar esta página.",
|
|
variant: "destructive",
|
|
});
|
|
router.push("/");
|
|
return;
|
|
}
|
|
|
|
const avatarPath = fullUserData.profile.avatar_url;
|
|
const avatarFullUrl = avatarPath
|
|
? `https://yuanqfswhberkoevtmfr.supabase.co/storage/v1/object/public/avatars/${avatarPath}`
|
|
: undefined;
|
|
|
|
setUser({
|
|
id: fullUserData.user.id,
|
|
name: fullUserData.profile.full_name || "Usuário",
|
|
email: fullUserData.user.email,
|
|
roles: fullUserData.roles,
|
|
avatar_url: avatarPath,
|
|
avatarFullUrl,
|
|
});
|
|
} catch (error) {
|
|
console.error("Falha na autenticação do layout:", error);
|
|
router.push("/login");
|
|
} finally {
|
|
setIsLoading(false);
|
|
}
|
|
};
|
|
|
|
fetchUserData();
|
|
}, [router]); // não depende mais de requiredRole
|
|
|
|
return { user, isLoading };
|
|
}
|