Sistema Auth Multi-Tenant - Guida Utilizzo
Setup Completato
✅ Redux Slice: src/store/slices/authSlice.ts
✅ Hooks: src/store/hooks/useAuth.ts
✅ Provider: src/components/AuthProvider.tsx
✅ API Aggiornata: /api/auth/me restituisce user + tenant
Come Usare nei Componenti
1. Accedere ai dati dell’utente
import { useUser } from "@/store/hooks/useAuth";
function MyComponent() {
const user = useUser();
if (!user) return <div>Loading...</div>;
return (
<div>
<h1>Benvenuto, {user.firstName}!</h1>
<p>Email: {user.email}</p>
<p>Ruolo: {user.role}</p>
</div>
);
}2. Accedere ai dati del tenant
import { useTenant } from "@/store/hooks/useAuth";
function CompanyInfo() {
const tenant = useTenant();
if (!tenant) return null;
return (
<div>
<h2>{tenant.companyName}</h2>
<p>P.IVA: {tenant.vatNumber}</p>
<p>Piano: {tenant.plan}</p>
<p>
Indirizzo: {tenant.address}, {tenant.city}
</p>
</div>
);
}3. Verificare se l’utente è autenticato
import { useIsAuthenticated } from "@/store/hooks/useAuth";
function ProtectedContent() {
const isAuthenticated = useIsAuthenticated();
if (!isAuthenticated) {
return <div>Devi effettuare il login</div>;
}
return <div>Contenuto protetto</div>;
}4. Accedere a tutti i dati auth
import { useAuth } from "@/store/hooks/useAuth";
function AuthStatus() {
const { user, tenant, isLoading, isAuthenticated, error } = useAuth();
if (isLoading) return <div>Caricamento...</div>;
if (error) return <div>Errore: {error}</div>;
if (!isAuthenticated) return <div>Non autenticato</div>;
return (
<div>
<p>
Utente: {user?.firstName} {user?.lastName}
</p>
<p>Azienda: {tenant?.companyName}</p>
</div>
);
}5. Logout
import { useAppDispatch } from "@/store/hooks";
import { logout } from "@/store/slices/authSlice";
function LogoutButton() {
const dispatch = useAppDispatch();
const handleLogout = async () => {
await dispatch(logout());
window.location.href = "/auth/login";
};
return <button onClick={handleLogout}>Logout</button>;
}Dati Disponibili
User
{
userId: string;
email: string;
firstName: string;
lastName: string;
phone?: string;
role: string; // "owner" | "chef" | "manager" | "accountant" | "staff"
tenant_id: string;
isActive: boolean;
lastLogin?: Date;
}Tenant
{
_id: string;
name: string;
companyName: string;
vatNumber?: string;
taxCode?: string;
address?: string;
city?: string;
postalCode?: string;
country?: string;
pec?: string;
sdi?: string;
plan: "starter" | "professional" | "enterprise";
isActive: boolean;
}Esempio Completo: Dashboard
"use client";
import { useUser, useTenant } from "@/store/hooks/useAuth";
import { Card } from "@/components/ui/card";
export default function DashboardPage() {
const user = useUser();
const tenant = useTenant();
return (
<div className="p-6">
<h1>Dashboard</h1>
{user && (
<Card className="p-4 mb-4">
<h2>Informazioni Utente</h2>
<p>
Nome: {user.firstName} {user.lastName}
</p>
<p>Email: {user.email}</p>
<p>Ruolo: {user.role}</p>
</Card>
)}
{tenant && (
<Card className="p-4">
<h2>Informazioni Azienda</h2>
<p>Ragione Sociale: {tenant.companyName}</p>
<p>P.IVA: {tenant.vatNumber}</p>
<p>Piano: {tenant.plan}</p>
</Card>
)}
</div>
);
}Note
- I dati vengono caricati automaticamente all’avvio dell’app tramite
AuthProvider - Il caricamento avviene una sola volta, poi i dati sono sempre disponibili nello store Redux
- Se l’utente non è autenticato, i dati saranno
null - La sidebar usa già questi dati per mostrare nome utente e azienda
Last updated on