@@ -2,20 +2,26 @@ import React, { Suspense } from "react";
22import type { Metadata } from "next" ;
33import { notFound , redirect } from "next/navigation" ;
44
5- import { getGlobalPayload , queryPageBySlug } from "@/lib/payload" ;
5+ import {
6+ getGlobalPayload ,
7+ queryGlobalPageBySlug ,
8+ queryPageBySlug ,
9+ } from "@/lib/payload" ;
610import { getDomain } from "@/lib/domain" ;
7- import { CommonHomePage } from "@/components/CommonHomePage" ;
811import { BlockRenderer } from "@/components/BlockRenderer" ;
912import Navigation from "@/components/Navigation" ;
1013import Footer from "@/components/Footer" ;
1114import { getTenantBySubDomain , getTenantNavigation } from "@/lib/data/tenants" ;
1215import { getPoliticalEntitiesByTenant } from "@/lib/data/politicalEntities" ;
1316import {
1417 buildSeoMetadata ,
18+ composeTitleSegments ,
1519 getEntitySeo ,
1620 getPageSeo ,
1721 resolveTenantSeoContext ,
1822} from "@/lib/seo" ;
23+ import { resolveTenantLocale } from "@/utils/locales" ;
24+ import { resolveBrowserLocale } from "../layout" ;
1925
2026type Args = {
2127 params : Promise < {
@@ -26,18 +32,35 @@ type Args = {
2632export async function generateMetadata ( { params } : Args ) : Promise < Metadata > {
2733 const paramsValue = await params ;
2834 const slugs = paramsValue ?. slugs ?? [ ] ;
35+ const pageSlug = slugs [ 0 ] ?? "index" ;
2936
3037 const { subdomain } = await getDomain ( ) ;
3138 const tenantResolution = await resolveTenantSeoContext ( subdomain ) ;
3239
3340 if ( tenantResolution . status === "missing" ) {
34- return tenantResolution . metadata ;
41+ const locale = await resolveBrowserLocale ( ) ;
42+ const globalPage = await queryGlobalPageBySlug ( { slug : pageSlug , locale } ) ;
43+
44+ if ( ! globalPage ) {
45+ return tenantResolution . metadata ;
46+ }
47+
48+ return buildSeoMetadata ( {
49+ defaults : {
50+ ...tenantResolution . defaultSeo ,
51+ title : globalPage . title || tenantResolution . defaultSeo . title ,
52+ } ,
53+ } ) ;
3554 }
3655
3756 const { tenant, tenantSettings, tenantSeo, tenantTitleBase } =
3857 tenantResolution . context ;
58+ const tenantLocale = resolveTenantLocale ( tenant ) ;
3959
40- const politicalEntities = await getPoliticalEntitiesByTenant ( tenant ) ;
60+ const politicalEntities = await getPoliticalEntitiesByTenant (
61+ tenant ,
62+ tenantLocale
63+ ) ;
4164 const [ maybePoliticalEntitySlug , pageSlugCandidate ] = slugs ;
4265 const politicalEntity = politicalEntities . find (
4366 ( entity ) => entity . slug === maybePoliticalEntitySlug
@@ -57,10 +80,30 @@ export async function generateMetadata({ params }: Args): Promise<Metadata> {
5780 tenantTitleBase,
5881 } ) ;
5982
60- const pageSlug = pageSlugCandidate ?? "index" ;
61- const page = await queryPageBySlug ( { slug : pageSlug , tenant } ) ;
83+ const tenantPageSlug = pageSlugCandidate ?? "index" ;
84+ const page = await queryPageBySlug ( {
85+ slug : tenantPageSlug ,
86+ tenant,
87+ locale : tenantLocale ,
88+ } ) ;
6289
6390 if ( ! page ) {
91+ const globalPage = await queryGlobalPageBySlug ( {
92+ slug : tenantPageSlug ,
93+ locale : tenantLocale ,
94+ } ) ;
95+
96+ if ( globalPage ) {
97+ return buildSeoMetadata ( {
98+ defaults : {
99+ ...entitySeo ,
100+ title :
101+ composeTitleSegments ( globalPage . title , politicalEntity . name ) ||
102+ entitySeo . title ,
103+ } ,
104+ } ) ;
105+ }
106+
64107 return buildSeoMetadata ( {
65108 meta : politicalEntity . meta ,
66109 defaults : entitySeo ,
@@ -85,11 +128,26 @@ export default async function Page(params: Args) {
85128 const { subdomain, tenantSelectionHref } = await getDomain ( ) ;
86129
87130 const tenant = await getTenantBySubDomain ( subdomain ) ;
131+ const locale = tenant
132+ ? resolveTenantLocale ( tenant )
133+ : await resolveBrowserLocale ( ) ;
88134
89- const { title, description, navigation, footer } =
90- await getTenantNavigation ( tenant ) ;
135+ const { title, description, navigation, footer } = await getTenantNavigation (
136+ tenant ,
137+ locale
138+ ) ;
139+
140+ const paramsValue = await params . params ;
141+ const slugs = paramsValue ?. slugs ?? [ ] ;
91142
92143 if ( ! tenant ) {
144+ const pageSlug = slugs [ 0 ] ?? "index" ;
145+ const globalPage = await queryGlobalPageBySlug ( { slug : pageSlug , locale } ) ;
146+
147+ if ( ! globalPage ) {
148+ return notFound ( ) ;
149+ }
150+
93151 return (
94152 < >
95153 < Navigation
@@ -98,16 +156,17 @@ export default async function Page(params: Args) {
98156 tenantSelectionHref = { tenantSelectionHref }
99157 showSearch = { false }
100158 />
101- < CommonHomePage />
159+ < Suspense >
160+ < BlockRenderer blocks = { globalPage . blocks } />
161+ </ Suspense >
162+ < Footer title = { title } description = { description } { ...footer } />
102163 </ >
103164 ) ;
104165 }
105166
106- const paramsValue = await params . params ;
107- const slugs = paramsValue ?. slugs ?? [ ] ;
108167 const [ maybePoliticalEntitySlug , pageSlugCandidate ] = slugs ;
109168
110- const politicalEntities = await getPoliticalEntitiesByTenant ( tenant ) ;
169+ const politicalEntities = await getPoliticalEntitiesByTenant ( tenant , locale ) ;
111170
112171 const politicalEntity = politicalEntities . find (
113172 ( entity ) => entity . slug === maybePoliticalEntitySlug
@@ -128,17 +187,13 @@ export default async function Page(params: Args) {
128187 redirect ( targetPath ) ;
129188 }
130189 }
131- const fallbackPageSlugs = slugs . length > 0 ? slugs : [ "index" ] ;
190+
132191 const payload = await getGlobalPayload ( ) ;
133192 const homePage = await payload . findGlobal ( {
134- slug : "home-page" ,
193+ slug : "entity-page" ,
194+ locale,
135195 } ) ;
136- const entityBlocks = ( homePage ?. entitySelector ?. blocks ?? [ ] ) . map (
137- ( block ) =>
138- block . blockType === "entity-selection"
139- ? { ...block , pageSlugs : fallbackPageSlugs }
140- : block
141- ) ;
196+ const entityBlocks = homePage ?. entitySelector ?. blocks ?? [ ] ;
142197
143198 return (
144199 < >
@@ -147,18 +202,53 @@ export default async function Page(params: Args) {
147202 { ...navigation }
148203 tenantSelectionHref = { tenantSelectionHref }
149204 />
150- < BlockRenderer blocks = { entityBlocks } />
205+ < Suspense >
206+ < BlockRenderer blocks = { entityBlocks } />
207+ </ Suspense >
151208 < Footer title = { title } description = { description } { ...footer } />
152209 </ >
153210 ) ;
154211 }
155212
156- const pageSlug = pageSlugCandidate ?? "index" ;
213+ const tenantPageSlug = pageSlugCandidate ?? "index" ;
157214
158- const page = await queryPageBySlug ( { slug : pageSlug , tenant } ) ;
215+ const page = await queryPageBySlug ( {
216+ slug : tenantPageSlug ,
217+ tenant,
218+ locale,
219+ } ) ;
159220
160221 if ( ! page ) {
161- return notFound ( ) ;
222+ const globalPage = await queryGlobalPageBySlug ( {
223+ slug : tenantPageSlug ,
224+ locale,
225+ } ) ;
226+ if ( ! globalPage ) {
227+ return notFound ( ) ;
228+ }
229+
230+ return (
231+ < >
232+ < Navigation
233+ title = { title }
234+ { ...navigation }
235+ entitySlug = { politicalEntity . slug }
236+ tenantName = { tenant ?. name ?? null }
237+ tenantSelectionHref = { tenantSelectionHref }
238+ tenantFlag = { tenant ?. flag ?? null }
239+ tenantFlagLabel = { tenant ?. name ?? tenant ?. country ?? null }
240+ />
241+ < Suspense >
242+ < BlockRenderer blocks = { globalPage . blocks } entity = { politicalEntity } />
243+ </ Suspense >
244+ < Footer
245+ title = { title }
246+ description = { description }
247+ { ...footer }
248+ entitySlug = { politicalEntity . slug }
249+ />
250+ </ >
251+ ) ;
162252 }
163253
164254 const { blocks } = page ;
0 commit comments