sstrong> layout.tsx:
Код: Выделить всё
import type { Metadata } from "next";
import "./globals.css";
import { getTenantData } from "@/lib/utils";
import MissingSubdomainError from "@/components/errors/MissingSubdomainError";
import InvalidTenantError from "@/components/errors/InvalidTenantError";
import { TenantProvider } from "@/components/providers/tenant-provider";
export async function generateMetadata(): Promise {
const { subdomain, tenant } = await getTenantData();
if (!subdomain) {
return {
title: "Subdominio no definido",
description: "No se proporcionó un subdominio válido",
};
}
if (!tenant) {
return {
title: "Tenant inválido",
description: `No se encontró ningún tenant llamado "${subdomain}"`,
};
}
return {
title: tenant.name,
description: `Sitio de ${tenant.name}`,
};
}
export default async function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
const { subdomain, tenant } = await getTenantData();
if (!subdomain) return ;
if (!tenant) return ;
return (
{children}
);
}
Код: Выделить всё
export default function InvalidTenantError({
subdomain,
}: {
subdomain: string;
}) {
return (
Subdominio inválido
El subdominio{" "}
{subdomain} no
está registrado.
Verifica que lo hayas escrito correctamente. Por ejemplo:
empresa.localhost
);
}
utils.ts:
Код: Выделить всё
import { headers } from "next/headers";
import { prisma } from "./prisma";
export async function validateTenant(subdomain: string) {
try {
const tenant = await prisma.tenant.findUnique({
where: {
subdomain: subdomain,
active: true,
},
});
return tenant;
} catch (error) {
console.error("Error validating tenant:", error);
return null;
}
}
export async function getTenantData() {
const headersList = await headers();
const subdomain = headersList.get("x-tenant");
if (!subdomain) {
return { subdomain: null, tenant: null };
}
const tenant = await validateTenant(subdomain);
return { subdomain, tenant };
}
Код: Выделить всё
{
"name": "tenanttest",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev --turbopack",
"build": "prisma generate && next build",
"start": "next start",
"lint": "next lint",
"db:seed": "tsx prisma/seed.ts"
},
"dependencies": {
"@prisma/client": "^6.8.2",
"next": "15.3.2",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"zustand": "^5.0.5"
},
"devDependencies": {
"@eslint/eslintrc": "^3",
"@tailwindcss/postcss": "^4",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"eslint": "^9",
"eslint-config-next": "15.3.2",
"prisma": "^6.8.2",
"tailwindcss": "^4",
"tsx": "^4.19.4",
"typescript": "^5"
}
}
метаданные не работают
Подробнее здесь: https://stackoverflow.com/questions/796 ... ring-in-la