- Validação cross-tenant no login e rotas protegidas
- File serving via /api/files/{bucket}/{path} (eliminação DNS)
- Mensagens de erro humanizadas inline (sem pop-ups)
- Middleware tenant detection via headers customizados
- Upload de logos retorna URLs via API
- README atualizado com changelog v1.4 completo
35 lines
1.0 KiB
TypeScript
35 lines
1.0 KiB
TypeScript
import { Metadata } from 'next';
|
|
import { getAgencyLogo, getAgencyColors } from '@/lib/server-api';
|
|
import { AgencyLayoutClient } from './AgencyLayoutClient';
|
|
|
|
// Forçar renderização dinâmica (não estática) para este layout
|
|
// Necessário porque usamos headers() para pegar o subdomínio
|
|
export const dynamic = 'force-dynamic';
|
|
|
|
/**
|
|
* generateMetadata - Executado no servidor antes do render
|
|
* Define o favicon dinamicamente baseado no subdomínio da agência
|
|
*/
|
|
export async function generateMetadata(): Promise<Metadata> {
|
|
const logoUrl = await getAgencyLogo();
|
|
|
|
return {
|
|
icons: {
|
|
icon: logoUrl || '/favicon.ico',
|
|
shortcut: logoUrl || '/favicon.ico',
|
|
apple: logoUrl || '/favicon.ico',
|
|
},
|
|
};
|
|
}
|
|
|
|
export default async function AgencyLayout({
|
|
children,
|
|
}: {
|
|
children: React.ReactNode;
|
|
}) {
|
|
// Buscar cores da agência no servidor
|
|
const colors = await getAgencyColors();
|
|
|
|
return <AgencyLayoutClient colors={colors}>{children}</AgencyLayoutClient>;
|
|
}
|