diff --git a/frontends/nextjs/src/app/[tenant]/[package]/page.tsx b/frontends/nextjs/src/app/[tenant]/[package]/page.tsx index 2806f35d3..62c79e839 100644 --- a/frontends/nextjs/src/app/[tenant]/[package]/page.tsx +++ b/frontends/nextjs/src/app/[tenant]/[package]/page.tsx @@ -5,9 +5,11 @@ * Shows the package dashboard/home component. */ -// notFound will be used when package loading is implemented -// eslint-disable-next-line @typescript-eslint/no-unused-vars import { notFound } from 'next/navigation' +import { join } from 'path' +import { loadJSONPackage } from '@/lib/packages/json/functions/load-json-package' +import { renderJSONComponent } from '@/lib/packages/json/render-json-component' +import { getPackagesDir } from '@/lib/packages/unified/get-packages-dir' interface PackagePageProps { params: Promise<{ @@ -19,53 +21,46 @@ interface PackagePageProps { export default async function PackagePage({ params }: PackagePageProps) { const { tenant, package: pkg } = await params - // TODO: Load package component dynamically - // const packageData = await loadPackage(pkg) - // if (!packageData?.homeComponent) { - // notFound() - // } + // Load package from filesystem + try { + const packageData = await loadJSONPackage(join(getPackagesDir(), pkg)) + + // Find home component: prioritize 'home_page', then 'HomePage', then 'Home', then first component + const homeComponent = packageData.components?.find(c => + c.id === 'home_page' || + c.name === 'HomePage' || + c.name === 'Home' + ) ?? packageData.components?.[0] - return ( -
-
-

- {tenant} - {' / '} - {pkg} -

-
- -
- {/* Package home component will be rendered here */} -
-

Package: {pkg}

-

Tenant: {tenant}

-

- This page will render the package's home component. -

- -

API Endpoints

- -
{`
-GET    /api/v1/${tenant}/${pkg}/{entity}         # List
-GET    /api/v1/${tenant}/${pkg}/{entity}/{id}    # Read
-POST   /api/v1/${tenant}/${pkg}/{entity}         # Create
-PUT    /api/v1/${tenant}/${pkg}/{entity}/{id}    # Update
-DELETE /api/v1/${tenant}/${pkg}/{entity}/{id}    # Delete
-POST   /api/v1/${tenant}/${pkg}/{entity}/{id}/{action}  # Custom
-            `.trim()}
-
-
-
-
- ) + if (!homeComponent) { + // Package exists but has no components + notFound() + } + + // Render the home component with tenant and package context + return renderJSONComponent(homeComponent, { tenant, package: pkg }, {}) + } catch (error) { + // Package doesn't exist or can't be loaded + console.error(`Failed to load package ${pkg}:`, error) + notFound() + } } export async function generateMetadata({ params }: PackagePageProps) { const { tenant, package: pkg } = await params - return { - title: `${pkg} - ${tenant} | MetaBuilder`, - description: `${pkg} package for tenant ${tenant}`, + // Try to load package metadata + try { + const packageData = await loadJSONPackage(join(getPackagesDir(), pkg)) + return { + title: `${packageData.metadata.name} - ${tenant} | MetaBuilder`, + description: packageData.metadata.description || `${packageData.metadata.name} package for tenant ${tenant}`, + } + } catch { + // Fallback if package can't be loaded + return { + title: `${pkg} - ${tenant} | MetaBuilder`, + description: `${pkg} package for tenant ${tenant}`, + } } }