@estation/create-cms-site 1.4.2 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +91 -6
- package/dist/index.js.map +1 -1
- package/dist/tools/blocks.d.ts +3 -0
- package/dist/tools/blocks.d.ts.map +1 -1
- package/dist/tools/blocks.js +2 -0
- package/dist/tools/blocks.js.map +1 -1
- package/dist/utils/api-client.d.ts.map +1 -1
- package/dist/utils/api-client.js +5 -1
- package/dist/utils/api-client.js.map +1 -1
- package/package.json +1 -1
- package/template/src/app/{[slug] → [locale]/[slug]}/page.tsx +5 -5
- package/template/src/app/{blog → [locale]/blog}/[slug]/page.tsx +6 -6
- package/template/src/app/{blog → [locale]/blog}/page.tsx +8 -3
- package/template/src/app/{collections → [locale]/collections}/[uuid]/page.tsx +3 -3
- package/template/src/app/{events → [locale]/events}/[slug]/page.tsx +6 -6
- package/template/src/app/{events → [locale]/events}/page.tsx +8 -3
- package/template/src/app/[locale]/layout.tsx +34 -0
- package/template/src/app/{news → [locale]/news}/[slug]/page.tsx +6 -6
- package/template/src/app/{news → [locale]/news}/page.tsx +8 -3
- package/template/src/app/[locale]/page.tsx +46 -0
- package/template/src/app/{search → [locale]/search}/page.tsx +11 -9
- package/template/src/app/layout.tsx +2 -14
- package/template/src/app/page.tsx +3 -38
- package/template/src/components/Navigation.tsx +46 -19
- package/template/src/lib/cms-api.ts +16 -9
- package/template/src/lib/types.ts +27 -0
- package/template/src/middleware.ts +57 -0
package/dist/index.js
CHANGED
|
@@ -12,7 +12,7 @@ import { listCollections, getCollection, createCollection, updateCollection, del
|
|
|
12
12
|
import { searchContent } from "./tools/search.js";
|
|
13
13
|
const server = new McpServer({
|
|
14
14
|
name: "estation-cms",
|
|
15
|
-
version: "1.
|
|
15
|
+
version: "1.5.0",
|
|
16
16
|
}, {
|
|
17
17
|
instructions: `You are connected to the eSTATION CMS — a headless content management system at cms-gateway.estation.io.
|
|
18
18
|
|
|
@@ -34,6 +34,68 @@ When the user wants to work with the CMS for the first time, walk them through t
|
|
|
34
34
|
- **Collections** are saved queries that dynamically group blocks by tags or types.
|
|
35
35
|
- The website template has 10 section components (hero, text, features, faq, testimonials, cta, slider, gallery, contact, generic). Each renders a specific block tag. Use \`list_sections\` to see the exact field schemas.
|
|
36
36
|
|
|
37
|
+
## Content types (Blogs, News, Events, etc.)
|
|
38
|
+
|
|
39
|
+
The CMS supports dynamic content types using content blocks. Each content item (blog post, news article, event, etc.) is stored as its **own individual content block** — NOT as items in a list field.
|
|
40
|
+
|
|
41
|
+
### How it works
|
|
42
|
+
|
|
43
|
+
- Use the block \`type\` field to identify the content type: \`"blog"\`, \`"news"\`, \`"event"\`, etc.
|
|
44
|
+
- Use \`tags\` to categorize and filter: e.g. \`["blog", "tech"]\` or \`["news", "featured"]\`.
|
|
45
|
+
- Each block's \`content\` holds the item's fields using the standard \`{ fieldType, fieldValue }\` structure.
|
|
46
|
+
|
|
47
|
+
### Creating a blog post
|
|
48
|
+
|
|
49
|
+
Use \`create_block\` with type \`"blog"\` and a tag like \`"blog"\`:
|
|
50
|
+
\`\`\`json
|
|
51
|
+
{
|
|
52
|
+
"type": "blog",
|
|
53
|
+
"name": "My First Blog Post",
|
|
54
|
+
"tags": ["blog"],
|
|
55
|
+
"content": {
|
|
56
|
+
"title": { "fieldType": "text", "fieldValue": "My First Blog Post" },
|
|
57
|
+
"slug": { "fieldType": "text", "fieldValue": "my-first-blog-post" },
|
|
58
|
+
"author": { "fieldType": "text", "fieldValue": "John Doe" },
|
|
59
|
+
"excerpt": { "fieldType": "textarea", "fieldValue": "A short summary..." },
|
|
60
|
+
"body": { "fieldType": "richtext", "fieldValue": "<p>Full article content...</p>" },
|
|
61
|
+
"featuredImage": { "fieldType": "image", "fieldValue": "https://..." },
|
|
62
|
+
"publishDate": { "fieldType": "text", "fieldValue": "2026-03-14" },
|
|
63
|
+
"status": { "fieldType": "text", "fieldValue": "published" }
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
\`\`\`
|
|
67
|
+
|
|
68
|
+
Then \`publish_block\` to make it visible via public API.
|
|
69
|
+
|
|
70
|
+
### Fetching content (public API)
|
|
71
|
+
|
|
72
|
+
- **List all blog posts (paginated):** \`list_blocks\` with \`tags: "blog"\` — returns paginated results
|
|
73
|
+
- **Get a single post:** \`get_block\` with the post's UUID
|
|
74
|
+
- **Public endpoints (for websites):**
|
|
75
|
+
- \`GET /public/content/blocks/by-tags?tags=blog&page=1&size=10\` — paginated list
|
|
76
|
+
- \`GET /public/content/blocks/{uuid}\` — single item
|
|
77
|
+
|
|
78
|
+
### Response format for create_block
|
|
79
|
+
|
|
80
|
+
When creating a block, the API returns the full block object:
|
|
81
|
+
\`\`\`json
|
|
82
|
+
{
|
|
83
|
+
"uuid": "550e8400-...",
|
|
84
|
+
"tenant_uuid": "123e4567-...",
|
|
85
|
+
"type": "blog",
|
|
86
|
+
"name": "My First Blog Post",
|
|
87
|
+
"tags": ["blog"],
|
|
88
|
+
"locale": "en",
|
|
89
|
+
"content": { ... },
|
|
90
|
+
"version": 1,
|
|
91
|
+
"is_published": false,
|
|
92
|
+
"created_at": "2026-03-14T...",
|
|
93
|
+
"updated_at": "2026-03-14T..."
|
|
94
|
+
}
|
|
95
|
+
\`\`\`
|
|
96
|
+
|
|
97
|
+
This pattern works for any content type — blogs, news, events, products, team members, etc. Just change the \`type\` and \`tags\` accordingly.
|
|
98
|
+
|
|
37
99
|
## Content field structure
|
|
38
100
|
|
|
39
101
|
Block content fields follow this pattern:
|
|
@@ -142,11 +204,30 @@ A page's \`blocks\` field is an ordered array of content block UUIDs. The websit
|
|
|
142
204
|
|
|
143
205
|
When users say things like "add a hero to my homepage" or "remove the FAQ section", follow these workflows. Always use \`list_sections\` to get the correct field structure for the block type being created.
|
|
144
206
|
|
|
207
|
+
## Localization (i18n)
|
|
208
|
+
|
|
209
|
+
The CMS supports per-locale content blocks. Each block has a \`locale\` field (e.g. "en", "ar", "fr"). Supported locales: en, es, fr, de, zh, ja, ko, pt, ar, ku. Arabic and Kurdish use RTL text direction.
|
|
210
|
+
|
|
211
|
+
**How it works:**
|
|
212
|
+
- When creating a block, set \`locale\` to the target language (defaults to "en" if omitted).
|
|
213
|
+
- To serve content in multiple languages, create separate blocks per locale with the same tags. For example, a hero block tagged \`["hero"]\` in English and another hero block tagged \`["hero"]\` in Arabic.
|
|
214
|
+
- Pages store block UUIDs for ALL locales. When the website requests a page with \`?locale=en\`, only English blocks are returned. Missing locale blocks are simply absent.
|
|
215
|
+
- Use \`list_blocks\` with \`locale\` filter to see blocks for a specific language.
|
|
216
|
+
- The website template uses \`[locale]/\` route segments (e.g. \`/en/about-us\`, \`/ar/about-us\`). The root \`/\` redirects to \`/en\`.
|
|
217
|
+
- RTL locales (ar, ku) automatically set \`dir="rtl"\` on the HTML element.
|
|
218
|
+
|
|
219
|
+
**Workflow for multi-language content:**
|
|
220
|
+
1. Create blocks in the default language (en) with appropriate tags
|
|
221
|
+
2. For each additional language, create new blocks with the same tags but different \`locale\`
|
|
222
|
+
3. Add all block UUIDs (all locales) to the page's \`blocks\` array
|
|
223
|
+
4. The website filters by locale at request time
|
|
224
|
+
|
|
145
225
|
## Page slug conventions
|
|
146
226
|
|
|
147
227
|
The website template uses these reserved slugs:
|
|
148
|
-
- \`index\` → homepage (rendered by
|
|
149
|
-
- All other slugs render at \`/{slug}\` (e.g. \`about-us\` → \`/about-us\`)
|
|
228
|
+
- \`index\` → homepage (rendered by \`/{locale}\`, e.g. \`/en\`)
|
|
229
|
+
- All other slugs render at \`/{locale}/{slug}\` (e.g. \`about-us\` → \`/en/about-us\`)
|
|
230
|
+
- The root \`/\` redirects to \`/en\` (or the user's preferred locale via Accept-Language)
|
|
150
231
|
|
|
151
232
|
When a user says "homepage" or "main page", they mean the page with slug \`index\`. When creating a new site, the first page should always have slug \`index\`.
|
|
152
233
|
|
|
@@ -179,6 +260,7 @@ interface ContentBlock {
|
|
|
179
260
|
type: string;
|
|
180
261
|
name: string;
|
|
181
262
|
tags: string[]; // ARRAY of strings, NOT a comma-separated string
|
|
263
|
+
locale: string; // Language code (e.g. "en", "ar", "fr"). Defaults to "en".
|
|
182
264
|
content: Record<string, { fieldType: string; fieldValue: string | ListItem[] }>;
|
|
183
265
|
metadata: Record<string, unknown>;
|
|
184
266
|
version: number;
|
|
@@ -273,22 +355,24 @@ server.tool("set_api_token", "Set an API token for read-only public access to eS
|
|
|
273
355
|
}, wrap(({ token }) => handleSetApiToken(token)));
|
|
274
356
|
server.tool("auth_status", "Check current authentication status with eSTATION CMS.", {}, wrap(() => handleAuthStatus()));
|
|
275
357
|
// ── Content Blocks ──────────────────────────────────────────────────
|
|
276
|
-
server.tool("list_blocks", "List content blocks in the CMS. Filter by tags, search text,
|
|
358
|
+
server.tool("list_blocks", "List content blocks in the CMS. Filter by tags, search text, publish status, or locale.", {
|
|
277
359
|
page: z.number().optional().describe("Page number (default: 1)"),
|
|
278
360
|
size: z.number().optional().describe("Items per page (default: 10)"),
|
|
279
361
|
search: z.string().optional().describe("Search blocks by name"),
|
|
280
362
|
status: z.enum(["published", "unpublished", "all"]).optional().describe("Filter by publish status"),
|
|
281
363
|
tags: z.string().optional().describe("Comma-separated tags to filter by"),
|
|
364
|
+
locale: z.string().optional().describe("Filter by locale (e.g. 'en', 'ar', 'fr'). Omit to return all locales."),
|
|
282
365
|
}, wrap(listBlocks));
|
|
283
366
|
server.tool("get_block", "Get a content block by UUID with all its fields and content.", {
|
|
284
367
|
uuid: z.string().describe("Block UUID"),
|
|
285
368
|
}, wrap(({ uuid }) => getBlock(uuid)));
|
|
286
|
-
server.tool("create_block", "Create a new content block in the CMS. Use list_sections to see available
|
|
287
|
-
type: z.string().describe("Block type
|
|
369
|
+
server.tool("create_block", "Create a new content block in the CMS. Use list_sections to see available section types. For content types (blog posts, news articles, events), use the content type as the block type (e.g. type: 'blog') with appropriate tags.", {
|
|
370
|
+
type: z.string().describe("Block type — section types: hero, text, features, faq, testimonials, cta, slider, gallery, contact, custom. Content types: blog, news, event, or any custom type."),
|
|
288
371
|
name: z.string().describe("Display name for the block"),
|
|
289
372
|
tags: z.array(z.string()).optional().describe("Tags for categorizing and querying the block"),
|
|
290
373
|
content: z.record(z.unknown()).describe("Block content fields — structure depends on block type. Each field should have { fieldType, fieldValue }"),
|
|
291
374
|
metadata: z.record(z.unknown()).optional().describe("Optional metadata"),
|
|
375
|
+
locale: z.string().optional().describe("Locale for this block (e.g. 'en', 'ar', 'fr'). Defaults to 'en' if not specified."),
|
|
292
376
|
}, wrap(createBlock));
|
|
293
377
|
server.tool("update_block", "Update an existing content block. Only provided fields are changed.", {
|
|
294
378
|
uuid: z.string().describe("Block UUID to update"),
|
|
@@ -296,6 +380,7 @@ server.tool("update_block", "Update an existing content block. Only provided fie
|
|
|
296
380
|
tags: z.array(z.string()).optional().describe("New tags"),
|
|
297
381
|
content: z.record(z.unknown()).optional().describe("Updated content fields"),
|
|
298
382
|
metadata: z.record(z.unknown()).optional().describe("Updated metadata"),
|
|
383
|
+
locale: z.string().optional().describe("Change the block's locale (e.g. 'en', 'ar', 'fr')"),
|
|
299
384
|
}, wrap(({ uuid, ...data }) => updateBlock(uuid, data)));
|
|
300
385
|
server.tool("delete_block", "Delete a content block from the CMS.", {
|
|
301
386
|
uuid: z.string().describe("Block UUID to delete"),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/blocks.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export declare function listBlocks(params: {
|
|
|
17
17
|
search?: string;
|
|
18
18
|
status?: string;
|
|
19
19
|
tags?: string;
|
|
20
|
+
locale?: string;
|
|
20
21
|
}): Promise<string>;
|
|
21
22
|
export declare function getBlock(uuid: string): Promise<string>;
|
|
22
23
|
export declare function createBlock(data: {
|
|
@@ -25,12 +26,14 @@ export declare function createBlock(data: {
|
|
|
25
26
|
tags?: string[];
|
|
26
27
|
content: Record<string, unknown>;
|
|
27
28
|
metadata?: Record<string, unknown>;
|
|
29
|
+
locale?: string;
|
|
28
30
|
}): Promise<string>;
|
|
29
31
|
export declare function updateBlock(uuid: string, data: {
|
|
30
32
|
name?: string;
|
|
31
33
|
tags?: string[];
|
|
32
34
|
content?: Record<string, unknown>;
|
|
33
35
|
metadata?: Record<string, unknown>;
|
|
36
|
+
locale?: string;
|
|
34
37
|
}): Promise<string>;
|
|
35
38
|
export declare function deleteBlock(uuid: string): Promise<string>;
|
|
36
39
|
export declare function publishBlock(uuid: string, publish: boolean): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/tools/blocks.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAUD,wBAAsB,UAAU,CAAC,MAAM,EAAE;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/tools/blocks.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAUD,wBAAsB,UAAU,CAAC,MAAM,EAAE;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BlB;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG5D;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,MAAM,CAAC,CAGlB;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG/D;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAGlF;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGlE"}
|
package/dist/tools/blocks.js
CHANGED
|
@@ -9,6 +9,8 @@ export async function listBlocks(params) {
|
|
|
9
9
|
query.set("search", params.search);
|
|
10
10
|
if (params.status)
|
|
11
11
|
query.set("status", params.status);
|
|
12
|
+
if (params.locale)
|
|
13
|
+
query.set("locale", params.locale);
|
|
12
14
|
let path = "/content/blocks";
|
|
13
15
|
if (params.tags) {
|
|
14
16
|
path = "/content/blocks/by-tags";
|
package/dist/tools/blocks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../src/tools/blocks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAwBpD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../src/tools/blocks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"AAeA,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,QAEnC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,QAExC;AAED,wBAAgB,YAAY,IAAI;IAAE,aAAa,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAI1E;AAcD,wBAAsB,UAAU,CAAC,CAAC,EAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,SAAS,UAAQ,GAChB,OAAO,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"AAeA,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,QAEnC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,QAExC;AAED,wBAAgB,YAAY,IAAI;IAAE,aAAa,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAI1E;AAcD,wBAAsB,UAAU,CAAC,CAAC,EAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,SAAS,UAAQ,GAChB,OAAO,CAAC,CAAC,CAAC,CAgCZ;AAED,wBAAsB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmB5E"}
|
package/dist/utils/api-client.js
CHANGED
|
@@ -43,7 +43,11 @@ export async function cmsRequest(method, path, body, usePublic = false) {
|
|
|
43
43
|
throw new Error(`CMS API ${res.status}: ${res.statusText}${text ? ` — ${text}` : ""}`);
|
|
44
44
|
}
|
|
45
45
|
const json = await res.json();
|
|
46
|
-
return
|
|
46
|
+
// Backend may return wrapped { status, message, data } or unwrapped response directly
|
|
47
|
+
if (json && typeof json === "object" && "data" in json && "status" in json) {
|
|
48
|
+
return json.data;
|
|
49
|
+
}
|
|
50
|
+
return json;
|
|
47
51
|
}
|
|
48
52
|
catch (err) {
|
|
49
53
|
clearTimeout(timeout);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAG,wCAAwC,CAAC;AAa9D,MAAM,IAAI,GAAc,EAAE,CAAC;AAE3B,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,IAAI,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC5D,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACvE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,YAAY,CAAC,SAAkB;IACtC,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;IAC/E,IAAI,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;IACzC,CAAC;SAAM,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACpB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC;IAClD,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzB,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;IACzC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,IAAY,EACZ,IAAc,EACd,SAAS,GAAG,KAAK;IAEjB,MAAM,GAAG,GAAG,GAAG,YAAY,GAAG,IAAI,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM;YACN,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC;YAChC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;YAC7C,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,CAAC;QAEtB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzF,CAAC;QAED,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -4,13 +4,13 @@ import type { ContentBlock } from "@/lib/types";
|
|
|
4
4
|
import type { Metadata } from "next";
|
|
5
5
|
|
|
6
6
|
interface PageProps {
|
|
7
|
-
params: Promise<{ slug: string }>;
|
|
7
|
+
params: Promise<{ locale: string; slug: string }>;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
export async function generateMetadata({ params }: PageProps): Promise<Metadata> {
|
|
11
|
-
const { slug } = await params;
|
|
11
|
+
const { locale, slug } = await params;
|
|
12
12
|
try {
|
|
13
|
-
const data = await getPageBySlug(slug);
|
|
13
|
+
const data = await getPageBySlug(slug, locale);
|
|
14
14
|
return {
|
|
15
15
|
title: data.page.title || slug,
|
|
16
16
|
description: data.page.description || undefined,
|
|
@@ -21,8 +21,8 @@ export async function generateMetadata({ params }: PageProps): Promise<Metadata>
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
export default async function DynamicPage({ params }: PageProps) {
|
|
24
|
-
const { slug } = await params;
|
|
25
|
-
const data = await getPageBySlug(slug);
|
|
24
|
+
const { locale, slug } = await params;
|
|
25
|
+
const data = await getPageBySlug(slug, locale);
|
|
26
26
|
const orderedBlocks = getOrderedBlocks(data.page.blocks, data.blocks);
|
|
27
27
|
|
|
28
28
|
return <SectionRenderer blocks={orderedBlocks} />;
|
|
@@ -5,12 +5,12 @@ import { notFound } from "next/navigation";
|
|
|
5
5
|
import type { Metadata } from "next";
|
|
6
6
|
|
|
7
7
|
interface PageProps {
|
|
8
|
-
params: Promise<{ slug: string }>;
|
|
8
|
+
params: Promise<{ locale: string; slug: string }>;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export async function generateMetadata({ params }: PageProps): Promise<Metadata> {
|
|
12
|
-
const { slug } = await params;
|
|
13
|
-
const blocks = await getBlocksByTags(["blogs"]);
|
|
12
|
+
const { locale, slug } = await params;
|
|
13
|
+
const blocks = await getBlocksByTags(["blogs"], locale);
|
|
14
14
|
const block = findBlockBySlug(blocks, slug);
|
|
15
15
|
if (!block) return { title: "Post Not Found" };
|
|
16
16
|
return {
|
|
@@ -20,8 +20,8 @@ export async function generateMetadata({ params }: PageProps): Promise<Metadata>
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
export default async function BlogDetailPage({ params }: PageProps) {
|
|
23
|
-
const { slug } = await params;
|
|
24
|
-
const blocks = await getBlocksByTags(["blogs"]);
|
|
23
|
+
const { locale, slug } = await params;
|
|
24
|
+
const blocks = await getBlocksByTags(["blogs"], locale);
|
|
25
25
|
const block = findBlockBySlug(blocks, slug);
|
|
26
26
|
|
|
27
27
|
if (!block) notFound();
|
|
@@ -35,7 +35,7 @@ export default async function BlogDetailPage({ params }: PageProps) {
|
|
|
35
35
|
return (
|
|
36
36
|
<article className="py-16 px-6">
|
|
37
37
|
<div className="max-w-3xl mx-auto">
|
|
38
|
-
<a href=
|
|
38
|
+
<a href={`/${locale}/blog`} className="text-sm text-gray-500 hover:underline">← Back to Blog</a>
|
|
39
39
|
<h1 className="text-4xl font-bold mt-4 mb-4">{title}</h1>
|
|
40
40
|
<div className="flex gap-4 text-sm text-gray-500 mb-8">
|
|
41
41
|
{author && <span>By {author}</span>}
|
|
@@ -3,15 +3,20 @@ import { str } from "@/lib/types";
|
|
|
3
3
|
import { formatDate } from "@/lib/content-helpers";
|
|
4
4
|
import type { Metadata } from "next";
|
|
5
5
|
|
|
6
|
+
interface PageProps {
|
|
7
|
+
params: Promise<{ locale: string }>;
|
|
8
|
+
}
|
|
9
|
+
|
|
6
10
|
export const metadata: Metadata = {
|
|
7
11
|
title: "Blog",
|
|
8
12
|
description: "Latest blog posts",
|
|
9
13
|
};
|
|
10
14
|
|
|
11
|
-
export default async function BlogListingPage() {
|
|
15
|
+
export default async function BlogListingPage({ params }: PageProps) {
|
|
16
|
+
const { locale } = await params;
|
|
12
17
|
let blocks: Awaited<ReturnType<typeof getBlocksByTags>> = [];
|
|
13
18
|
try {
|
|
14
|
-
blocks = await getBlocksByTags(["blogs"]);
|
|
19
|
+
blocks = await getBlocksByTags(["blogs"], locale);
|
|
15
20
|
} catch {
|
|
16
21
|
// CMS unavailable
|
|
17
22
|
}
|
|
@@ -48,7 +53,7 @@ export default async function BlogListingPage() {
|
|
|
48
53
|
)}
|
|
49
54
|
<h2 className="text-2xl font-semibold">
|
|
50
55
|
{slug ? (
|
|
51
|
-
<a href={
|
|
56
|
+
<a href={`/${locale}/blog/${slug}`} className="hover:underline">
|
|
52
57
|
{title}
|
|
53
58
|
</a>
|
|
54
59
|
) : (
|
|
@@ -3,7 +3,7 @@ import { SectionRenderer } from "@/components/SectionRenderer";
|
|
|
3
3
|
import type { Metadata } from "next";
|
|
4
4
|
|
|
5
5
|
interface PageProps {
|
|
6
|
-
params: Promise<{ uuid: string }>;
|
|
6
|
+
params: Promise<{ locale: string; uuid: string }>;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
export const metadata: Metadata = {
|
|
@@ -11,8 +11,8 @@ export const metadata: Metadata = {
|
|
|
11
11
|
};
|
|
12
12
|
|
|
13
13
|
export default async function CollectionPage({ params }: PageProps) {
|
|
14
|
-
const { uuid } = await params;
|
|
15
|
-
const blocks = await executeCollection(uuid);
|
|
14
|
+
const { locale, uuid } = await params;
|
|
15
|
+
const blocks = await executeCollection(uuid, locale);
|
|
16
16
|
|
|
17
17
|
return (
|
|
18
18
|
<div className="py-16 px-6">
|
|
@@ -5,12 +5,12 @@ import { notFound } from "next/navigation";
|
|
|
5
5
|
import type { Metadata } from "next";
|
|
6
6
|
|
|
7
7
|
interface PageProps {
|
|
8
|
-
params: Promise<{ slug: string }>;
|
|
8
|
+
params: Promise<{ locale: string; slug: string }>;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export async function generateMetadata({ params }: PageProps): Promise<Metadata> {
|
|
12
|
-
const { slug } = await params;
|
|
13
|
-
const blocks = await getBlocksByTags(["events"]);
|
|
12
|
+
const { locale, slug } = await params;
|
|
13
|
+
const blocks = await getBlocksByTags(["events"], locale);
|
|
14
14
|
const block = findBlockBySlug(blocks, slug);
|
|
15
15
|
if (!block) return { title: "Event Not Found" };
|
|
16
16
|
return {
|
|
@@ -20,8 +20,8 @@ export async function generateMetadata({ params }: PageProps): Promise<Metadata>
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
export default async function EventDetailPage({ params }: PageProps) {
|
|
23
|
-
const { slug } = await params;
|
|
24
|
-
const blocks = await getBlocksByTags(["events"]);
|
|
23
|
+
const { locale, slug } = await params;
|
|
24
|
+
const blocks = await getBlocksByTags(["events"], locale);
|
|
25
25
|
const block = findBlockBySlug(blocks, slug);
|
|
26
26
|
|
|
27
27
|
if (!block) notFound();
|
|
@@ -37,7 +37,7 @@ export default async function EventDetailPage({ params }: PageProps) {
|
|
|
37
37
|
return (
|
|
38
38
|
<article className="py-16 px-6">
|
|
39
39
|
<div className="max-w-3xl mx-auto">
|
|
40
|
-
<a href=
|
|
40
|
+
<a href={`/${locale}/events`} className="text-sm text-gray-500 hover:underline">← Back to Events</a>
|
|
41
41
|
<h1 className="text-4xl font-bold mt-4 mb-4">{title}</h1>
|
|
42
42
|
<div className="flex flex-wrap gap-4 text-sm text-gray-500 mb-8">
|
|
43
43
|
{startDate && (
|
|
@@ -3,15 +3,20 @@ import { str } from "@/lib/types";
|
|
|
3
3
|
import { formatDate } from "@/lib/content-helpers";
|
|
4
4
|
import type { Metadata } from "next";
|
|
5
5
|
|
|
6
|
+
interface PageProps {
|
|
7
|
+
params: Promise<{ locale: string }>;
|
|
8
|
+
}
|
|
9
|
+
|
|
6
10
|
export const metadata: Metadata = {
|
|
7
11
|
title: "Events",
|
|
8
12
|
description: "Upcoming events",
|
|
9
13
|
};
|
|
10
14
|
|
|
11
|
-
export default async function EventsListingPage() {
|
|
15
|
+
export default async function EventsListingPage({ params }: PageProps) {
|
|
16
|
+
const { locale } = await params;
|
|
12
17
|
let blocks: Awaited<ReturnType<typeof getBlocksByTags>> = [];
|
|
13
18
|
try {
|
|
14
|
-
blocks = await getBlocksByTags(["events"]);
|
|
19
|
+
blocks = await getBlocksByTags(["events"], locale);
|
|
15
20
|
} catch {
|
|
16
21
|
// CMS unavailable
|
|
17
22
|
}
|
|
@@ -42,7 +47,7 @@ export default async function EventsListingPage() {
|
|
|
42
47
|
<article key={block.uuid} className="border-b pb-8">
|
|
43
48
|
<h2 className="text-2xl font-semibold">
|
|
44
49
|
{slug ? (
|
|
45
|
-
<a href={
|
|
50
|
+
<a href={`/${locale}/events/${slug}`} className="hover:underline">
|
|
46
51
|
{title}
|
|
47
52
|
</a>
|
|
48
53
|
) : (
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { CMSPreviewListener } from "@/components/cms-preview-listener";
|
|
2
|
+
import { Navigation } from "@/components/Navigation";
|
|
3
|
+
import { Footer } from "@/components/Footer";
|
|
4
|
+
import { getLocaleDir, isValidLocale } from "@/lib/types";
|
|
5
|
+
import { notFound } from "next/navigation";
|
|
6
|
+
|
|
7
|
+
interface LocaleLayoutProps {
|
|
8
|
+
children: React.ReactNode;
|
|
9
|
+
params: Promise<{ locale: string }>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export default async function LocaleLayout({
|
|
13
|
+
children,
|
|
14
|
+
params,
|
|
15
|
+
}: LocaleLayoutProps) {
|
|
16
|
+
const { locale } = await params;
|
|
17
|
+
|
|
18
|
+
if (!isValidLocale(locale)) {
|
|
19
|
+
notFound();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const dir = getLocaleDir(locale);
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<html lang={locale} dir={dir}>
|
|
26
|
+
<body className="antialiased">
|
|
27
|
+
<Navigation locale={locale} />
|
|
28
|
+
<main>{children}</main>
|
|
29
|
+
<Footer />
|
|
30
|
+
<CMSPreviewListener />
|
|
31
|
+
</body>
|
|
32
|
+
</html>
|
|
33
|
+
);
|
|
34
|
+
}
|
|
@@ -5,12 +5,12 @@ import { notFound } from "next/navigation";
|
|
|
5
5
|
import type { Metadata } from "next";
|
|
6
6
|
|
|
7
7
|
interface PageProps {
|
|
8
|
-
params: Promise<{ slug: string }>;
|
|
8
|
+
params: Promise<{ locale: string; slug: string }>;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export async function generateMetadata({ params }: PageProps): Promise<Metadata> {
|
|
12
|
-
const { slug } = await params;
|
|
13
|
-
const blocks = await getBlocksByTags(["news"]);
|
|
12
|
+
const { locale, slug } = await params;
|
|
13
|
+
const blocks = await getBlocksByTags(["news"], locale);
|
|
14
14
|
const block = findBlockBySlug(blocks, slug);
|
|
15
15
|
if (!block) return { title: "Article Not Found" };
|
|
16
16
|
return {
|
|
@@ -20,8 +20,8 @@ export async function generateMetadata({ params }: PageProps): Promise<Metadata>
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
export default async function NewsDetailPage({ params }: PageProps) {
|
|
23
|
-
const { slug } = await params;
|
|
24
|
-
const blocks = await getBlocksByTags(["news"]);
|
|
23
|
+
const { locale, slug } = await params;
|
|
24
|
+
const blocks = await getBlocksByTags(["news"], locale);
|
|
25
25
|
const block = findBlockBySlug(blocks, slug);
|
|
26
26
|
|
|
27
27
|
if (!block) notFound();
|
|
@@ -36,7 +36,7 @@ export default async function NewsDetailPage({ params }: PageProps) {
|
|
|
36
36
|
return (
|
|
37
37
|
<article className="py-16 px-6">
|
|
38
38
|
<div className="max-w-3xl mx-auto">
|
|
39
|
-
<a href=
|
|
39
|
+
<a href={`/${locale}/news`} className="text-sm text-gray-500 hover:underline">← Back to News</a>
|
|
40
40
|
{category && (
|
|
41
41
|
<span className="ml-4 text-xs font-medium uppercase tracking-wide text-blue-600 bg-blue-50 px-2 py-1 rounded">
|
|
42
42
|
{category}
|
|
@@ -3,15 +3,20 @@ import { str } from "@/lib/types";
|
|
|
3
3
|
import { formatDate } from "@/lib/content-helpers";
|
|
4
4
|
import type { Metadata } from "next";
|
|
5
5
|
|
|
6
|
+
interface PageProps {
|
|
7
|
+
params: Promise<{ locale: string }>;
|
|
8
|
+
}
|
|
9
|
+
|
|
6
10
|
export const metadata: Metadata = {
|
|
7
11
|
title: "News",
|
|
8
12
|
description: "Latest news",
|
|
9
13
|
};
|
|
10
14
|
|
|
11
|
-
export default async function NewsListingPage() {
|
|
15
|
+
export default async function NewsListingPage({ params }: PageProps) {
|
|
16
|
+
const { locale } = await params;
|
|
12
17
|
let blocks: Awaited<ReturnType<typeof getBlocksByTags>> = [];
|
|
13
18
|
try {
|
|
14
|
-
blocks = await getBlocksByTags(["news"]);
|
|
19
|
+
blocks = await getBlocksByTags(["news"], locale);
|
|
15
20
|
} catch {
|
|
16
21
|
// CMS unavailable
|
|
17
22
|
}
|
|
@@ -49,7 +54,7 @@ export default async function NewsListingPage() {
|
|
|
49
54
|
</div>
|
|
50
55
|
<h2 className="text-2xl font-semibold">
|
|
51
56
|
{slug ? (
|
|
52
|
-
<a href={
|
|
57
|
+
<a href={`/${locale}/news/${slug}`} className="hover:underline">
|
|
53
58
|
{title}
|
|
54
59
|
</a>
|
|
55
60
|
) : (
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { getPageBySlug } from "@/lib/cms-api";
|
|
2
|
+
import { SectionRenderer } from "@/components/SectionRenderer";
|
|
3
|
+
import type { ContentBlock } from "@/lib/types";
|
|
4
|
+
import type { Metadata } from "next";
|
|
5
|
+
|
|
6
|
+
interface PageProps {
|
|
7
|
+
params: Promise<{ locale: string }>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export async function generateMetadata({ params }: PageProps): Promise<Metadata> {
|
|
11
|
+
const { locale } = await params;
|
|
12
|
+
try {
|
|
13
|
+
const data = await getPageBySlug("index", locale);
|
|
14
|
+
return {
|
|
15
|
+
title: data.page.title || "Home",
|
|
16
|
+
description: data.page.description || undefined,
|
|
17
|
+
};
|
|
18
|
+
} catch {
|
|
19
|
+
return { title: "Home" };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export default async function Home({ params }: PageProps) {
|
|
24
|
+
const { locale } = await params;
|
|
25
|
+
try {
|
|
26
|
+
const data = await getPageBySlug("index", locale);
|
|
27
|
+
const orderedBlocks = getOrderedBlocks(data.page.blocks, data.blocks);
|
|
28
|
+
return <SectionRenderer blocks={orderedBlocks} />;
|
|
29
|
+
} catch {
|
|
30
|
+
return (
|
|
31
|
+
<div className="py-20 px-6 text-center">
|
|
32
|
+
<h1 className="text-4xl font-bold">Welcome</h1>
|
|
33
|
+
<p className="mt-4 text-gray-500">Content is not available yet. Configure your CMS to get started.</p>
|
|
34
|
+
</div>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function getOrderedBlocks(
|
|
40
|
+
blockUuids: string[],
|
|
41
|
+
blocksMap: Record<string, ContentBlock>
|
|
42
|
+
): ContentBlock[] {
|
|
43
|
+
return blockUuids
|
|
44
|
+
.map((uuid) => blocksMap[uuid])
|
|
45
|
+
.filter(Boolean);
|
|
46
|
+
}
|
|
@@ -8,16 +8,18 @@ export const metadata: Metadata = {
|
|
|
8
8
|
};
|
|
9
9
|
|
|
10
10
|
interface SearchPageProps {
|
|
11
|
+
params: Promise<{ locale: string }>;
|
|
11
12
|
searchParams: Promise<{ q?: string; type?: string; page?: string }>;
|
|
12
13
|
}
|
|
13
14
|
|
|
14
|
-
export default async function SearchPage({ searchParams }: SearchPageProps) {
|
|
15
|
+
export default async function SearchPage({ params, searchParams }: SearchPageProps) {
|
|
16
|
+
const { locale } = await params;
|
|
15
17
|
const { q, type, page: pageStr } = await searchParams;
|
|
16
18
|
const query = q || "";
|
|
17
19
|
const currentPage = Math.max(1, parseInt(pageStr || "1", 10));
|
|
18
20
|
|
|
19
21
|
const results = query
|
|
20
|
-
? await searchContent(query, type, currentPage, 20)
|
|
22
|
+
? await searchContent(query, type, currentPage, 20, locale)
|
|
21
23
|
: null;
|
|
22
24
|
|
|
23
25
|
return (
|
|
@@ -25,7 +27,7 @@ export default async function SearchPage({ searchParams }: SearchPageProps) {
|
|
|
25
27
|
<div className="max-w-4xl mx-auto">
|
|
26
28
|
<h1 className="text-4xl font-bold mb-8">Search</h1>
|
|
27
29
|
|
|
28
|
-
<form method="get" action=
|
|
30
|
+
<form method="get" action={`/${locale}/search`} className="flex gap-2 mb-10">
|
|
29
31
|
<input
|
|
30
32
|
type="text"
|
|
31
33
|
name="q"
|
|
@@ -60,7 +62,7 @@ export default async function SearchPage({ searchParams }: SearchPageProps) {
|
|
|
60
62
|
</span>
|
|
61
63
|
<h2 className="text-xl font-semibold mt-1">
|
|
62
64
|
<a
|
|
63
|
-
href={item.page.slug === "index" ?
|
|
65
|
+
href={item.page.slug === "index" ? `/${locale}` : `/${locale}/${item.page.slug}`}
|
|
64
66
|
className="hover:underline"
|
|
65
67
|
>
|
|
66
68
|
{item.page.title}
|
|
@@ -79,9 +81,9 @@ export default async function SearchPage({ searchParams }: SearchPageProps) {
|
|
|
79
81
|
const tag = item.block.tags?.[0] || "";
|
|
80
82
|
let href = "#";
|
|
81
83
|
if (slug) {
|
|
82
|
-
if (tag === "blogs") href =
|
|
83
|
-
else if (tag === "news") href =
|
|
84
|
-
else if (tag === "events") href =
|
|
84
|
+
if (tag === "blogs") href = `/${locale}/blog/${slug}`;
|
|
85
|
+
else if (tag === "news") href = `/${locale}/news/${slug}`;
|
|
86
|
+
else if (tag === "events") href = `/${locale}/events/${slug}`;
|
|
85
87
|
}
|
|
86
88
|
|
|
87
89
|
return (
|
|
@@ -109,7 +111,7 @@ export default async function SearchPage({ searchParams }: SearchPageProps) {
|
|
|
109
111
|
<div className="flex justify-center gap-2 mt-10">
|
|
110
112
|
{currentPage > 1 && (
|
|
111
113
|
<a
|
|
112
|
-
href={
|
|
114
|
+
href={`/${locale}/search?q=${encodeURIComponent(query)}&page=${currentPage - 1}${type ? `&type=${type}` : ""}`}
|
|
113
115
|
className="px-4 py-2 border rounded-lg hover:bg-gray-100"
|
|
114
116
|
>
|
|
115
117
|
Previous
|
|
@@ -120,7 +122,7 @@ export default async function SearchPage({ searchParams }: SearchPageProps) {
|
|
|
120
122
|
</span>
|
|
121
123
|
{currentPage < results.total_pages && (
|
|
122
124
|
<a
|
|
123
|
-
href={
|
|
125
|
+
href={`/${locale}/search?q=${encodeURIComponent(query)}&page=${currentPage + 1}${type ? `&type=${type}` : ""}`}
|
|
124
126
|
className="px-4 py-2 border rounded-lg hover:bg-gray-100"
|
|
125
127
|
>
|
|
126
128
|
Next
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import type { Metadata } from "next";
|
|
2
|
-
import { CMSPreviewListener } from "@/components/cms-preview-listener";
|
|
3
|
-
import { Navigation } from "@/components/Navigation";
|
|
4
|
-
import { Footer } from "@/components/Footer";
|
|
5
1
|
import "@/styles/globals.css";
|
|
2
|
+
import type { Metadata } from "next";
|
|
6
3
|
|
|
7
4
|
export const metadata: Metadata = {
|
|
8
5
|
title: "Website",
|
|
@@ -14,14 +11,5 @@ export default function RootLayout({
|
|
|
14
11
|
}: {
|
|
15
12
|
children: React.ReactNode;
|
|
16
13
|
}) {
|
|
17
|
-
return
|
|
18
|
-
<html lang="en">
|
|
19
|
-
<body className="antialiased">
|
|
20
|
-
<Navigation />
|
|
21
|
-
<main>{children}</main>
|
|
22
|
-
<Footer />
|
|
23
|
-
<CMSPreviewListener />
|
|
24
|
-
</body>
|
|
25
|
-
</html>
|
|
26
|
-
);
|
|
14
|
+
return children;
|
|
27
15
|
}
|
|
@@ -1,40 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { SectionRenderer } from "@/components/SectionRenderer";
|
|
3
|
-
import type { ContentBlock } from "@/lib/types";
|
|
4
|
-
import type { Metadata } from "next";
|
|
1
|
+
import { redirect } from "next/navigation";
|
|
5
2
|
|
|
6
|
-
export
|
|
7
|
-
|
|
8
|
-
const data = await getPageBySlug("index");
|
|
9
|
-
return {
|
|
10
|
-
title: data.page.title || "Home",
|
|
11
|
-
description: data.page.description || undefined,
|
|
12
|
-
};
|
|
13
|
-
} catch {
|
|
14
|
-
return { title: "Home" };
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export default async function Home() {
|
|
19
|
-
try {
|
|
20
|
-
const data = await getPageBySlug("index");
|
|
21
|
-
const orderedBlocks = getOrderedBlocks(data.page.blocks, data.blocks);
|
|
22
|
-
return <SectionRenderer blocks={orderedBlocks} />;
|
|
23
|
-
} catch {
|
|
24
|
-
return (
|
|
25
|
-
<div className="py-20 px-6 text-center">
|
|
26
|
-
<h1 className="text-4xl font-bold">Welcome</h1>
|
|
27
|
-
<p className="mt-4 text-gray-500">Content is not available yet. Configure your CMS to get started.</p>
|
|
28
|
-
</div>
|
|
29
|
-
);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function getOrderedBlocks(
|
|
34
|
-
blockUuids: string[],
|
|
35
|
-
blocksMap: Record<string, ContentBlock>
|
|
36
|
-
): ContentBlock[] {
|
|
37
|
-
return blockUuids
|
|
38
|
-
.map((uuid) => blocksMap[uuid])
|
|
39
|
-
.filter(Boolean);
|
|
3
|
+
export default function RootPage() {
|
|
4
|
+
redirect("/en");
|
|
40
5
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getBlocksByTags, getAllPages } from "@/lib/cms-api";
|
|
2
|
-
import { str } from "@/lib/types";
|
|
2
|
+
import { str, SUPPORTED_LOCALES } from "@/lib/types";
|
|
3
3
|
import type { ListItem } from "@/lib/types";
|
|
4
4
|
|
|
5
5
|
interface NavLink {
|
|
@@ -7,21 +7,28 @@ interface NavLink {
|
|
|
7
7
|
href: string;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
interface NavigationProps {
|
|
11
|
+
locale?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export async function Navigation({ locale = "en" }: NavigationProps) {
|
|
11
15
|
let links: NavLink[] = [];
|
|
12
16
|
|
|
13
17
|
try {
|
|
14
|
-
const navBlocks = await getBlocksByTags(["navigation"]);
|
|
18
|
+
const navBlocks = await getBlocksByTags(["navigation"], locale);
|
|
15
19
|
if (navBlocks.length > 0) {
|
|
16
20
|
const block = navBlocks[0];
|
|
17
21
|
const items = Array.isArray(block.content.items?.fieldValue)
|
|
18
22
|
? (block.content.items.fieldValue as ListItem[])
|
|
19
23
|
: [];
|
|
20
24
|
links = items
|
|
21
|
-
.map((item) =>
|
|
22
|
-
label
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
.map((item) => {
|
|
26
|
+
const label = str(item.label as never);
|
|
27
|
+
const rawHref = str(item.href as never, "/");
|
|
28
|
+
// Prefix hrefs with locale if they start with / and don't already have a locale
|
|
29
|
+
const href = rawHref.startsWith("/") ? `/${locale}${rawHref === "/" ? "" : rawHref}` : rawHref;
|
|
30
|
+
return { label, href };
|
|
31
|
+
})
|
|
25
32
|
.filter((l) => l.label);
|
|
26
33
|
}
|
|
27
34
|
} catch {
|
|
@@ -35,7 +42,10 @@ export async function Navigation() {
|
|
|
35
42
|
.filter((p) => p.is_published)
|
|
36
43
|
.map((p) => ({
|
|
37
44
|
label: p.title || p.slug,
|
|
38
|
-
href:
|
|
45
|
+
href:
|
|
46
|
+
p.slug === "index" || p.slug === ""
|
|
47
|
+
? `/${locale}`
|
|
48
|
+
: `/${locale}/${p.slug}`,
|
|
39
49
|
}));
|
|
40
50
|
} catch {
|
|
41
51
|
// fallback if no pages
|
|
@@ -45,20 +55,37 @@ export async function Navigation() {
|
|
|
45
55
|
return (
|
|
46
56
|
<nav className="border-b">
|
|
47
57
|
<div className="max-w-6xl mx-auto px-6 py-4 flex items-center justify-between">
|
|
48
|
-
<a href=
|
|
58
|
+
<a href={`/${locale}`} className="text-xl font-bold">
|
|
49
59
|
Home
|
|
50
60
|
</a>
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
<
|
|
56
|
-
{link.
|
|
57
|
-
|
|
58
|
-
|
|
61
|
+
<div className="flex items-center gap-6">
|
|
62
|
+
{links.length > 0 && (
|
|
63
|
+
<ul className="flex gap-6 text-sm">
|
|
64
|
+
{links.map((link) => (
|
|
65
|
+
<li key={link.href}>
|
|
66
|
+
<a href={link.href} className="hover:underline text-gray-700">
|
|
67
|
+
{link.label}
|
|
68
|
+
</a>
|
|
69
|
+
</li>
|
|
70
|
+
))}
|
|
71
|
+
</ul>
|
|
72
|
+
)}
|
|
73
|
+
<div className="flex gap-1 text-xs">
|
|
74
|
+
{SUPPORTED_LOCALES.map((l) => (
|
|
75
|
+
<a
|
|
76
|
+
key={l.code}
|
|
77
|
+
href={`/${l.code}`}
|
|
78
|
+
className={`px-2 py-1 rounded ${
|
|
79
|
+
l.code === locale
|
|
80
|
+
? "bg-gray-900 text-white"
|
|
81
|
+
: "text-gray-500 hover:bg-gray-100"
|
|
82
|
+
}`}
|
|
83
|
+
>
|
|
84
|
+
{l.code.toUpperCase()}
|
|
85
|
+
</a>
|
|
59
86
|
))}
|
|
60
|
-
</
|
|
61
|
-
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
62
89
|
</div>
|
|
63
90
|
</nav>
|
|
64
91
|
);
|
|
@@ -40,17 +40,19 @@ async function cmsFetch<T>(path: string, tags?: string[]): Promise<T> {
|
|
|
40
40
|
return json.data;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
export async function getPageBySlug(slug: string): Promise<PageWithBlocksResponse> {
|
|
43
|
+
export async function getPageBySlug(slug: string, locale?: string): Promise<PageWithBlocksResponse> {
|
|
44
|
+
const localeParam = locale ? `?locale=${encodeURIComponent(locale)}` : "";
|
|
44
45
|
return cmsFetch<PageWithBlocksResponse>(
|
|
45
|
-
`/public/content/pages/slug/${encodeURIComponent(slug)}`,
|
|
46
|
+
`/public/content/pages/slug/${encodeURIComponent(slug)}${localeParam}`,
|
|
46
47
|
[`page-${slug}`]
|
|
47
48
|
);
|
|
48
49
|
}
|
|
49
50
|
|
|
50
|
-
export async function getBlocksByTags(tags: string[]): Promise<ContentBlock[]> {
|
|
51
|
+
export async function getBlocksByTags(tags: string[], locale?: string): Promise<ContentBlock[]> {
|
|
51
52
|
const query = tags.map(encodeURIComponent).join(",");
|
|
53
|
+
const localeParam = locale ? `&locale=${encodeURIComponent(locale)}` : "";
|
|
52
54
|
return cmsFetch<ContentBlock[]>(
|
|
53
|
-
`/public/content/blocks/by-tags?tags=${query}`,
|
|
55
|
+
`/public/content/blocks/by-tags?tags=${query}${localeParam}`,
|
|
54
56
|
tags.map((t) => `tag-${t}`)
|
|
55
57
|
);
|
|
56
58
|
}
|
|
@@ -58,10 +60,12 @@ export async function getBlocksByTags(tags: string[]): Promise<ContentBlock[]> {
|
|
|
58
60
|
export async function getBlocksByTagPaginated(
|
|
59
61
|
tag: string,
|
|
60
62
|
page = 1,
|
|
61
|
-
size = 20
|
|
63
|
+
size = 20,
|
|
64
|
+
locale?: string
|
|
62
65
|
): Promise<PaginatedResponse<ContentBlock>> {
|
|
66
|
+
const localeParam = locale ? `&locale=${encodeURIComponent(locale)}` : "";
|
|
63
67
|
return cmsFetch<PaginatedResponse<ContentBlock>>(
|
|
64
|
-
`/public/content/blocks/by-tags?tags=${encodeURIComponent(tag)}&page=${page}&size=${size}`,
|
|
68
|
+
`/public/content/blocks/by-tags?tags=${encodeURIComponent(tag)}&page=${page}&size=${size}${localeParam}`,
|
|
65
69
|
[`tag-${tag}`]
|
|
66
70
|
);
|
|
67
71
|
}
|
|
@@ -77,9 +81,10 @@ export async function getAllPages(): Promise<PageComposition[]> {
|
|
|
77
81
|
return cmsFetch<PageComposition[]>("/public/content/pages", ["all-pages"]);
|
|
78
82
|
}
|
|
79
83
|
|
|
80
|
-
export async function executeCollection(uuid: string): Promise<ContentBlock[]> {
|
|
84
|
+
export async function executeCollection(uuid: string, locale?: string): Promise<ContentBlock[]> {
|
|
85
|
+
const localeParam = locale ? `?locale=${encodeURIComponent(locale)}` : "";
|
|
81
86
|
return cmsFetch<ContentBlock[]>(
|
|
82
|
-
`/public/content/collections/${encodeURIComponent(uuid)}/execute`,
|
|
87
|
+
`/public/content/collections/${encodeURIComponent(uuid)}/execute${localeParam}`,
|
|
83
88
|
[`collection-${uuid}`]
|
|
84
89
|
);
|
|
85
90
|
}
|
|
@@ -92,10 +97,12 @@ export async function searchContent(
|
|
|
92
97
|
query: string,
|
|
93
98
|
type?: string,
|
|
94
99
|
page = 1,
|
|
95
|
-
size = 20
|
|
100
|
+
size = 20,
|
|
101
|
+
locale?: string
|
|
96
102
|
): Promise<PaginatedResponse<SearchResultItem>> {
|
|
97
103
|
const params = new URLSearchParams({ q: query, page: String(page), size: String(size) });
|
|
98
104
|
if (type) params.set("type", type);
|
|
105
|
+
if (locale) params.set("locale", locale);
|
|
99
106
|
return cmsFetch<PaginatedResponse<SearchResultItem>>(
|
|
100
107
|
`/public/content/search?${params.toString()}`,
|
|
101
108
|
["search"]
|
|
@@ -36,6 +36,7 @@ export interface ContentBlock {
|
|
|
36
36
|
type: string;
|
|
37
37
|
name: string;
|
|
38
38
|
tags: string[];
|
|
39
|
+
locale: string;
|
|
39
40
|
content: Record<string, ContentField>;
|
|
40
41
|
metadata: Record<string, unknown>;
|
|
41
42
|
version: number;
|
|
@@ -44,6 +45,32 @@ export interface ContentBlock {
|
|
|
44
45
|
updated_at: string;
|
|
45
46
|
}
|
|
46
47
|
|
|
48
|
+
export const SUPPORTED_LOCALES = [
|
|
49
|
+
{ code: "en", label: "English", dir: "ltr" },
|
|
50
|
+
{ code: "es", label: "Spanish", dir: "ltr" },
|
|
51
|
+
{ code: "fr", label: "French", dir: "ltr" },
|
|
52
|
+
{ code: "de", label: "German", dir: "ltr" },
|
|
53
|
+
{ code: "zh", label: "Chinese", dir: "ltr" },
|
|
54
|
+
{ code: "ja", label: "Japanese", dir: "ltr" },
|
|
55
|
+
{ code: "ko", label: "Korean", dir: "ltr" },
|
|
56
|
+
{ code: "pt", label: "Portuguese", dir: "ltr" },
|
|
57
|
+
{ code: "ar", label: "Arabic", dir: "rtl" },
|
|
58
|
+
{ code: "ku", label: "Kurdish", dir: "rtl" },
|
|
59
|
+
] as const;
|
|
60
|
+
|
|
61
|
+
export type LocaleCode = (typeof SUPPORTED_LOCALES)[number]["code"];
|
|
62
|
+
|
|
63
|
+
export const LOCALE_CODES = SUPPORTED_LOCALES.map((l) => l.code) as string[];
|
|
64
|
+
|
|
65
|
+
export function isValidLocale(s: string): s is LocaleCode {
|
|
66
|
+
return LOCALE_CODES.includes(s);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function getLocaleDir(locale: string): "ltr" | "rtl" {
|
|
70
|
+
const found = SUPPORTED_LOCALES.find((l) => l.code === locale);
|
|
71
|
+
return found?.dir === "rtl" ? "rtl" : "ltr";
|
|
72
|
+
}
|
|
73
|
+
|
|
47
74
|
export interface PageComposition {
|
|
48
75
|
uuid: string;
|
|
49
76
|
tenant_uuid: string;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
2
|
+
|
|
3
|
+
const LOCALE_CODES = [
|
|
4
|
+
"en", "es", "fr", "de", "zh", "ja", "ko", "pt", "ar", "ku",
|
|
5
|
+
];
|
|
6
|
+
const DEFAULT_LOCALE = "en";
|
|
7
|
+
|
|
8
|
+
function getPreferredLocale(acceptLanguage: string | null): string {
|
|
9
|
+
if (!acceptLanguage) return DEFAULT_LOCALE;
|
|
10
|
+
|
|
11
|
+
const parsed = acceptLanguage
|
|
12
|
+
.split(",")
|
|
13
|
+
.map((part) => {
|
|
14
|
+
const [lang, q] = part.trim().split(";q=");
|
|
15
|
+
return { lang: lang.trim().toLowerCase(), q: q ? parseFloat(q) : 1 };
|
|
16
|
+
})
|
|
17
|
+
.sort((a, b) => b.q - a.q);
|
|
18
|
+
|
|
19
|
+
for (const { lang } of parsed) {
|
|
20
|
+
const code = lang.split("-")[0];
|
|
21
|
+
if (LOCALE_CODES.includes(code)) return code;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return DEFAULT_LOCALE;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function middleware(request: NextRequest) {
|
|
28
|
+
const { pathname } = request.nextUrl;
|
|
29
|
+
|
|
30
|
+
// Skip internal paths and static files
|
|
31
|
+
if (
|
|
32
|
+
pathname.startsWith("/_next") ||
|
|
33
|
+
pathname.startsWith("/api") ||
|
|
34
|
+
pathname.includes(".") // static files (images, css, js, etc.)
|
|
35
|
+
) {
|
|
36
|
+
return NextResponse.next();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Check if pathname already has a locale prefix
|
|
40
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
41
|
+
if (segments.length > 0 && LOCALE_CODES.includes(segments[0])) {
|
|
42
|
+
return NextResponse.next();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Detect locale from Accept-Language header
|
|
46
|
+
const acceptLanguage = request.headers.get("accept-language");
|
|
47
|
+
const locale = getPreferredLocale(acceptLanguage);
|
|
48
|
+
|
|
49
|
+
// Redirect to locale-prefixed path
|
|
50
|
+
const url = request.nextUrl.clone();
|
|
51
|
+
url.pathname = `/${locale}${pathname}`;
|
|
52
|
+
return NextResponse.redirect(url);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export const config = {
|
|
56
|
+
matcher: ["/((?!_next|api|favicon\\.ico).*)"],
|
|
57
|
+
};
|