medusa-storefront-data 2.1.0 → 2.3.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/server/dynamic-config.d.ts +78 -1
- package/dist/server/dynamic-config.d.ts.map +1 -1
- package/dist/server/dynamic-config.js +410 -24
- package/dist/server/home.d.ts +31 -4
- package/dist/server/home.d.ts.map +1 -1
- package/dist/server/home.js +89 -10
- package/dist/server/homepage-section-defaults.d.ts +155 -0
- package/dist/server/homepage-section-defaults.d.ts.map +1 -0
- package/dist/server/homepage-section-defaults.js +149 -0
- package/package.json +1 -1
- package/src/server/dynamic-config.ts +513 -35
- package/src/server/home.ts +155 -12
- package/src/server/homepage-section-defaults.ts +160 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type DefaultHomeSectionId } from "./homepage-section-defaults";
|
|
1
2
|
export interface DynamicConfig {
|
|
2
3
|
"homepage-config"?: {
|
|
3
4
|
logo?: string;
|
|
@@ -54,6 +55,8 @@ export interface DynamicConfig {
|
|
|
54
55
|
"promo-value"?: string;
|
|
55
56
|
"promo-active"?: boolean;
|
|
56
57
|
};
|
|
58
|
+
/** Central homepage section copy (Option 1). Keys: camelCase or kebab-case section ids. */
|
|
59
|
+
sections?: Record<string, unknown>;
|
|
57
60
|
[key: string]: any;
|
|
58
61
|
};
|
|
59
62
|
}
|
|
@@ -82,18 +85,54 @@ export declare const getAppBannersFromConfig: () => Promise<Array<{
|
|
|
82
85
|
}> | null>;
|
|
83
86
|
export declare const getMobileBannerImageFromConfig: () => Promise<string | null>;
|
|
84
87
|
export declare const getWebsiteDescriptionFromConfig: () => Promise<string | null>;
|
|
88
|
+
/** Why choose us — defaults + `sections.whyChooseUs` override. */
|
|
85
89
|
export declare const getFeaturesFromConfig: () => Promise<{
|
|
86
90
|
title: string;
|
|
87
91
|
features: Array<{
|
|
88
92
|
name: string;
|
|
89
93
|
icon: string;
|
|
90
94
|
}>;
|
|
91
|
-
}
|
|
95
|
+
}>;
|
|
96
|
+
/** CMS copy for a homepage section (title, name, text, description, etc.). */
|
|
97
|
+
export type SectionCopy = {
|
|
98
|
+
title: string | null;
|
|
99
|
+
name: string | null;
|
|
100
|
+
text: string | null;
|
|
101
|
+
description: string | null;
|
|
102
|
+
subtitle: string | null;
|
|
103
|
+
eyebrow: string | null;
|
|
104
|
+
};
|
|
105
|
+
export declare function parseSectionCopy(block: unknown): SectionCopy;
|
|
106
|
+
export type HomeSectionCopyId = DefaultHomeSectionId;
|
|
107
|
+
export type HomeSectionsCopy = Record<HomeSectionCopyId, SectionCopy>;
|
|
108
|
+
/** Merge CMS section block onto package defaults (override wins when set). */
|
|
109
|
+
export declare function mergeSectionBlock(defaults: Record<string, unknown>, override: Record<string, unknown> | null): Record<string, unknown>;
|
|
110
|
+
/**
|
|
111
|
+
* Merged section copy: package defaults + `homepage-config.sections` overrides.
|
|
112
|
+
*/
|
|
113
|
+
export declare const getHomeSectionsCopyFromConfig: () => Promise<HomeSectionsCopy>;
|
|
114
|
+
export type TrustFeaturesConfig = {
|
|
115
|
+
title: string | null;
|
|
116
|
+
description: string | null;
|
|
117
|
+
features: Array<{
|
|
118
|
+
name: string;
|
|
119
|
+
icon: string;
|
|
120
|
+
}>;
|
|
121
|
+
};
|
|
122
|
+
/** Trust badge row — defaults + `sections.features` override. */
|
|
123
|
+
export declare const getTrustFeaturesFromConfig: () => Promise<TrustFeaturesConfig>;
|
|
92
124
|
export declare const getContactInfoFromConfig: () => Promise<{
|
|
93
125
|
phone?: string;
|
|
94
126
|
email?: string;
|
|
95
127
|
address?: string;
|
|
96
128
|
} | null>;
|
|
129
|
+
/**
|
|
130
|
+
* Homepage video stories/reviews carousel (`homepage-config.video-stories`).
|
|
131
|
+
*/
|
|
132
|
+
export declare const getVideoStoriesFromConfig: () => Promise<{
|
|
133
|
+
title: string;
|
|
134
|
+
videoUrls: string[];
|
|
135
|
+
} | null>;
|
|
97
136
|
export declare const getTestimonialsFromConfig: () => Promise<{
|
|
98
137
|
title: string;
|
|
99
138
|
testimonials: Array<{
|
|
@@ -116,6 +155,44 @@ export declare const getFaqsFromConfig: () => Promise<Array<{
|
|
|
116
155
|
a: string;
|
|
117
156
|
}>;
|
|
118
157
|
}> | null>;
|
|
158
|
+
export declare const getAnnouncementMessagesFromConfig: () => Promise<string[]>;
|
|
159
|
+
export type AboutBrandConfig = {
|
|
160
|
+
eyebrow: string;
|
|
161
|
+
title: string;
|
|
162
|
+
description: string;
|
|
163
|
+
readMoreHref: string;
|
|
164
|
+
stats: Array<{
|
|
165
|
+
label: string;
|
|
166
|
+
value: string;
|
|
167
|
+
}>;
|
|
168
|
+
};
|
|
169
|
+
export declare const getAboutBrandFromConfig: () => Promise<AboutBrandConfig>;
|
|
170
|
+
export type BrandPillarConfig = {
|
|
171
|
+
title: string;
|
|
172
|
+
description: string;
|
|
173
|
+
image?: string;
|
|
174
|
+
};
|
|
175
|
+
export declare const getBrandPillarsFromConfig: () => Promise<{
|
|
176
|
+
sectionTitle: string;
|
|
177
|
+
pillars: BrandPillarConfig[];
|
|
178
|
+
}>;
|
|
179
|
+
export type BlogPostConfig = {
|
|
180
|
+
title: string;
|
|
181
|
+
excerpt?: string;
|
|
182
|
+
category?: string;
|
|
183
|
+
date?: string;
|
|
184
|
+
href: string;
|
|
185
|
+
image?: string;
|
|
186
|
+
};
|
|
187
|
+
export declare const getBlogPostsFromConfig: () => Promise<BlogPostConfig[]>;
|
|
188
|
+
/** Promo countdown — defaults + `sections.promoCountdown` override. */
|
|
189
|
+
export declare const getPromoCountdownFromConfig: () => Promise<{
|
|
190
|
+
code: string | null;
|
|
191
|
+
message: string | null;
|
|
192
|
+
endAt: string | null;
|
|
193
|
+
active: boolean;
|
|
194
|
+
}>;
|
|
195
|
+
export { DEFAULT_HOMEPAGE_SECTIONS } from "./homepage-section-defaults";
|
|
119
196
|
export declare const getPromoBarConfig: () => Promise<{
|
|
120
197
|
text: string | null;
|
|
121
198
|
code: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-config.d.ts","sourceRoot":"","sources":["../../src/server/dynamic-config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dynamic-config.d.ts","sourceRoot":"","sources":["../../src/server/dynamic-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use server";
|
|
2
2
|
import { cache } from "react";
|
|
3
3
|
import { getAuthHeaders } from "../cookies";
|
|
4
|
+
import { DEFAULT_HOMEPAGE_SECTIONS, HOME_SECTION_COPY_ID_LIST, } from "./homepage-section-defaults";
|
|
4
5
|
export const getDynamicConfig = cache(async () => {
|
|
5
6
|
try {
|
|
6
7
|
const publishableKey = process.env.NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY;
|
|
@@ -137,27 +138,40 @@ export const getWebsiteDescriptionFromConfig = async () => {
|
|
|
137
138
|
return null;
|
|
138
139
|
}
|
|
139
140
|
};
|
|
141
|
+
/** Why choose us — defaults + `sections.whyChooseUs` override. */
|
|
140
142
|
export const getFeaturesFromConfig = async () => {
|
|
141
143
|
try {
|
|
142
|
-
const
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
const
|
|
147
|
-
const featuresRaw = homepageConfig["why-choose-us-features"] || [];
|
|
148
|
-
const features = featuresRaw.map((item) => {
|
|
149
|
-
const feature = item?.feature || item;
|
|
150
|
-
return {
|
|
151
|
-
name: feature?.["feature-name"] || "",
|
|
152
|
-
icon: feature?.["feature-icon"] || "",
|
|
153
|
-
};
|
|
154
|
-
}).filter((f) => f.name && f.icon);
|
|
144
|
+
const block = await getMergedSectionBlock("whyChooseUs");
|
|
145
|
+
const copy = parseSectionCopy(block);
|
|
146
|
+
const title = copy.title ?? copy.name ?? "";
|
|
147
|
+
const featuresRaw = block.features ?? block.items ?? [];
|
|
148
|
+
const features = parseFeatureIconList(featuresRaw);
|
|
155
149
|
return { title, features };
|
|
156
150
|
}
|
|
157
|
-
catch
|
|
158
|
-
|
|
151
|
+
catch {
|
|
152
|
+
const block = DEFAULT_HOMEPAGE_SECTIONS.whyChooseUs;
|
|
153
|
+
const copy = parseSectionCopy(block);
|
|
154
|
+
return {
|
|
155
|
+
title: copy.title ?? copy.name ?? "",
|
|
156
|
+
features: parseFeatureIconList(block.features ?? []),
|
|
157
|
+
};
|
|
159
158
|
}
|
|
160
159
|
};
|
|
160
|
+
function parseFeatureIconList(raw) {
|
|
161
|
+
if (!Array.isArray(raw))
|
|
162
|
+
return [];
|
|
163
|
+
return raw
|
|
164
|
+
.map((item) => {
|
|
165
|
+
if (!item || typeof item !== "object")
|
|
166
|
+
return null;
|
|
167
|
+
const feature = item.feature ?? item;
|
|
168
|
+
const row = feature;
|
|
169
|
+
const name = normalizeCmsText(row["feature-name"] ?? row.name) ?? "";
|
|
170
|
+
const icon = normalizeCmsText(row["feature-icon"] ?? row.icon) ?? "";
|
|
171
|
+
return name && icon ? { name, icon } : null;
|
|
172
|
+
})
|
|
173
|
+
.filter(Boolean);
|
|
174
|
+
}
|
|
161
175
|
const EMAIL_PATTERN = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
|
|
162
176
|
/** Fix common UTF-8 mojibake from CMS copy-paste (e.g. em dash, apostrophe). */
|
|
163
177
|
function normalizeCmsText(value) {
|
|
@@ -170,6 +184,160 @@ function normalizeCmsText(value) {
|
|
|
170
184
|
.replace(/ΓÇ£|ΓÇ¥/g, '"')
|
|
171
185
|
.replace(/≡ƒÿÄ≡ƒæòΓ£¿/g, " 👕✨");
|
|
172
186
|
}
|
|
187
|
+
const EMPTY_SECTION_COPY = {
|
|
188
|
+
title: null,
|
|
189
|
+
name: null,
|
|
190
|
+
text: null,
|
|
191
|
+
description: null,
|
|
192
|
+
subtitle: null,
|
|
193
|
+
eyebrow: null,
|
|
194
|
+
};
|
|
195
|
+
export function parseSectionCopy(block) {
|
|
196
|
+
if (!block || typeof block !== "object")
|
|
197
|
+
return { ...EMPTY_SECTION_COPY };
|
|
198
|
+
const row = block;
|
|
199
|
+
return {
|
|
200
|
+
title: normalizeCmsText(row.title) ?? null,
|
|
201
|
+
name: normalizeCmsText(row.name) ?? null,
|
|
202
|
+
text: normalizeCmsText(row.text) ?? null,
|
|
203
|
+
description: normalizeCmsText(row.description) ?? null,
|
|
204
|
+
subtitle: normalizeCmsText(row.subtitle) ?? null,
|
|
205
|
+
eyebrow: normalizeCmsText(row.eyebrow) ?? null,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
const HOME_SECTION_COPY_IDS = new Set(HOME_SECTION_COPY_ID_LIST);
|
|
209
|
+
function sectionIdFromConfigKey(key) {
|
|
210
|
+
const id = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
211
|
+
return HOME_SECTION_COPY_IDS.has(id) ? id : null;
|
|
212
|
+
}
|
|
213
|
+
async function getHomepageSectionsRoot() {
|
|
214
|
+
const config = await getDynamicConfig();
|
|
215
|
+
const root = config?.["homepage-config"]?.sections;
|
|
216
|
+
return root && typeof root === "object"
|
|
217
|
+
? root
|
|
218
|
+
: {};
|
|
219
|
+
}
|
|
220
|
+
function findSectionBlock(root, id) {
|
|
221
|
+
for (const [key, value] of Object.entries(root)) {
|
|
222
|
+
if (sectionIdFromConfigKey(key) !== id)
|
|
223
|
+
continue;
|
|
224
|
+
if (value && typeof value === "object") {
|
|
225
|
+
return value;
|
|
226
|
+
}
|
|
227
|
+
if (typeof value === "string") {
|
|
228
|
+
return { text: value };
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
/** Merge CMS section block onto package defaults (override wins when set). */
|
|
234
|
+
export function mergeSectionBlock(defaults, override) {
|
|
235
|
+
if (!override)
|
|
236
|
+
return { ...defaults };
|
|
237
|
+
const merged = { ...defaults };
|
|
238
|
+
for (const [key, value] of Object.entries(override)) {
|
|
239
|
+
if (value === undefined || value === null)
|
|
240
|
+
continue;
|
|
241
|
+
if (Array.isArray(value)) {
|
|
242
|
+
if (value.length > 0)
|
|
243
|
+
merged[key] = value;
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
if (typeof value === "string") {
|
|
247
|
+
if (value.trim())
|
|
248
|
+
merged[key] = value.trim();
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
if (typeof value === "boolean" || typeof value === "number") {
|
|
252
|
+
merged[key] = value;
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
if (typeof value === "object") {
|
|
256
|
+
const base = merged[key] && typeof merged[key] === "object" && !Array.isArray(merged[key])
|
|
257
|
+
? merged[key]
|
|
258
|
+
: {};
|
|
259
|
+
merged[key] = mergeSectionBlock(base, value);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return merged;
|
|
263
|
+
}
|
|
264
|
+
async function getMergedSectionBlock(id) {
|
|
265
|
+
const root = await getHomepageSectionsRoot();
|
|
266
|
+
const defaults = DEFAULT_HOMEPAGE_SECTIONS[id] ?? {};
|
|
267
|
+
const override = findSectionBlock(root, id);
|
|
268
|
+
return mergeSectionBlock({ ...defaults }, override);
|
|
269
|
+
}
|
|
270
|
+
function mergeSectionCopy(base, patch) {
|
|
271
|
+
const pick = (override, fallback) => override ?? fallback;
|
|
272
|
+
return {
|
|
273
|
+
title: pick(patch.title ?? patch.name, base.title ?? base.name),
|
|
274
|
+
name: pick(patch.name, base.name),
|
|
275
|
+
text: pick(patch.text, base.text),
|
|
276
|
+
description: pick(patch.description, base.description),
|
|
277
|
+
subtitle: pick(patch.subtitle, base.subtitle),
|
|
278
|
+
eyebrow: pick(patch.eyebrow, base.eyebrow),
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
function parseAnnouncementMessages(block) {
|
|
282
|
+
if (!block)
|
|
283
|
+
return [];
|
|
284
|
+
const raw = block.messages ?? block.items ?? block["announcement-messages"];
|
|
285
|
+
if (!Array.isArray(raw))
|
|
286
|
+
return [];
|
|
287
|
+
return raw
|
|
288
|
+
.map((item) => {
|
|
289
|
+
if (typeof item === "string")
|
|
290
|
+
return item.trim();
|
|
291
|
+
if (item && typeof item === "object") {
|
|
292
|
+
const row = item;
|
|
293
|
+
const nested = (row.message ?? row.text);
|
|
294
|
+
return typeof nested === "string" ? nested.trim() : "";
|
|
295
|
+
}
|
|
296
|
+
return "";
|
|
297
|
+
})
|
|
298
|
+
.filter(Boolean);
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Merged section copy: package defaults + `homepage-config.sections` overrides.
|
|
302
|
+
*/
|
|
303
|
+
export const getHomeSectionsCopyFromConfig = async () => {
|
|
304
|
+
try {
|
|
305
|
+
const copy = {};
|
|
306
|
+
for (const id of HOME_SECTION_COPY_ID_LIST) {
|
|
307
|
+
const block = await getMergedSectionBlock(id);
|
|
308
|
+
copy[id] = parseSectionCopy(block);
|
|
309
|
+
}
|
|
310
|
+
return copy;
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
const fallback = {};
|
|
314
|
+
for (const id of HOME_SECTION_COPY_ID_LIST) {
|
|
315
|
+
fallback[id] = parseSectionCopy(DEFAULT_HOMEPAGE_SECTIONS[id]);
|
|
316
|
+
}
|
|
317
|
+
return fallback;
|
|
318
|
+
}
|
|
319
|
+
};
|
|
320
|
+
/** Trust badge row — defaults + `sections.features` override. */
|
|
321
|
+
export const getTrustFeaturesFromConfig = async () => {
|
|
322
|
+
try {
|
|
323
|
+
const block = await getMergedSectionBlock("features");
|
|
324
|
+
const copy = parseSectionCopy(block);
|
|
325
|
+
const title = copy.title ?? copy.name;
|
|
326
|
+
const description = copy.description ?? copy.text;
|
|
327
|
+
const rawList = block.features ?? block.items ?? [];
|
|
328
|
+
const features = parseFeatureIconList(rawList);
|
|
329
|
+
return { title: title ?? null, description: description ?? null, features };
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
const block = DEFAULT_HOMEPAGE_SECTIONS.features;
|
|
333
|
+
const copy = parseSectionCopy(block);
|
|
334
|
+
return {
|
|
335
|
+
title: copy.title,
|
|
336
|
+
description: copy.description,
|
|
337
|
+
features: parseFeatureIconList(block.features ?? []),
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
};
|
|
173
341
|
function normalizeBannerButtonName(value) {
|
|
174
342
|
const text = normalizeCmsText(value);
|
|
175
343
|
if (!text)
|
|
@@ -201,28 +369,84 @@ export const getContactInfoFromConfig = async () => {
|
|
|
201
369
|
return null;
|
|
202
370
|
}
|
|
203
371
|
};
|
|
372
|
+
function normalizeVideoStoryUrl(entry) {
|
|
373
|
+
if (typeof entry === "string" && entry.trim())
|
|
374
|
+
return entry.trim();
|
|
375
|
+
if (!entry || typeof entry !== "object")
|
|
376
|
+
return null;
|
|
377
|
+
const row = entry;
|
|
378
|
+
const nested = row["video-story"] ??
|
|
379
|
+
row["video_stories"] ??
|
|
380
|
+
row;
|
|
381
|
+
const url = nested["video-url"] ??
|
|
382
|
+
nested["video_url"] ??
|
|
383
|
+
nested.url ??
|
|
384
|
+
nested.src ??
|
|
385
|
+
nested.video;
|
|
386
|
+
return typeof url === "string" && url.trim() ? url.trim() : null;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Homepage video stories/reviews carousel (`homepage-config.video-stories`).
|
|
390
|
+
*/
|
|
391
|
+
export const getVideoStoriesFromConfig = async () => {
|
|
392
|
+
try {
|
|
393
|
+
const config = await getDynamicConfig();
|
|
394
|
+
const homepageConfig = config?.["homepage-config"];
|
|
395
|
+
if (!homepageConfig)
|
|
396
|
+
return null;
|
|
397
|
+
const block = await getMergedSectionBlock("videoStories");
|
|
398
|
+
const copy = parseSectionCopy(block);
|
|
399
|
+
const title = copy.title ?? copy.name ?? "";
|
|
400
|
+
const raw = block["video-urls"] ??
|
|
401
|
+
block.videoUrls ??
|
|
402
|
+
block.videos ??
|
|
403
|
+
block["video-stories"] ??
|
|
404
|
+
homepageConfig["video-stories"] ??
|
|
405
|
+
homepageConfig["video-stories-array"] ??
|
|
406
|
+
homepageConfig["video_stories"] ??
|
|
407
|
+
[];
|
|
408
|
+
const list = Array.isArray(raw) ? raw : [raw];
|
|
409
|
+
const videoUrls = list
|
|
410
|
+
.map(normalizeVideoStoryUrl)
|
|
411
|
+
.filter((url) => Boolean(url));
|
|
412
|
+
return { title, videoUrls };
|
|
413
|
+
}
|
|
414
|
+
catch {
|
|
415
|
+
const block = DEFAULT_HOMEPAGE_SECTIONS.videoStories;
|
|
416
|
+
const copy = parseSectionCopy(block);
|
|
417
|
+
return {
|
|
418
|
+
title: copy.title ?? copy.name ?? "",
|
|
419
|
+
videoUrls: [],
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
};
|
|
204
423
|
export const getTestimonialsFromConfig = async () => {
|
|
205
424
|
try {
|
|
206
425
|
const config = await getDynamicConfig();
|
|
207
426
|
const homepageConfig = config?.["homepage-config"];
|
|
208
427
|
if (!homepageConfig)
|
|
209
428
|
return null;
|
|
210
|
-
const
|
|
429
|
+
const block = await getMergedSectionBlock("testimonials");
|
|
430
|
+
const copy = parseSectionCopy(block);
|
|
431
|
+
const title = copy.title ?? copy.name ?? "";
|
|
211
432
|
const ratings = homepageConfig["ratings"] || [];
|
|
212
|
-
|
|
213
|
-
const
|
|
433
|
+
let testimonials = (Array.isArray(ratings) ? ratings : []).map((item, index) => {
|
|
434
|
+
const row = item;
|
|
435
|
+
const review = (row?.review ?? row);
|
|
214
436
|
return {
|
|
215
437
|
id: `review-${index}`,
|
|
216
|
-
text: review?.["review-description"]
|
|
217
|
-
name: review?.["review-user-name"]
|
|
218
|
-
rating: parseFloat(review?.["review-rating"]
|
|
219
|
-
avatar: review?.["review-profile-image"]
|
|
438
|
+
text: String(review?.["review-description"] ?? "").trim(),
|
|
439
|
+
name: String(review?.["review-user-name"] ?? "").trim(),
|
|
440
|
+
rating: parseFloat(String(review?.["review-rating"] ?? "5")),
|
|
441
|
+
avatar: review?.["review-profile-image"],
|
|
220
442
|
};
|
|
221
443
|
}).filter((t) => t.text && t.name);
|
|
222
444
|
return { title, testimonials };
|
|
223
445
|
}
|
|
224
|
-
catch
|
|
225
|
-
|
|
446
|
+
catch {
|
|
447
|
+
const block = DEFAULT_HOMEPAGE_SECTIONS.testimonials;
|
|
448
|
+
const copy = parseSectionCopy(block);
|
|
449
|
+
return { title: copy.title ?? copy.name ?? "", testimonials: [] };
|
|
226
450
|
}
|
|
227
451
|
};
|
|
228
452
|
export const getSocialLinksFromConfig = async () => {
|
|
@@ -272,6 +496,168 @@ export const getFaqsFromConfig = async () => {
|
|
|
272
496
|
return null;
|
|
273
497
|
}
|
|
274
498
|
};
|
|
499
|
+
export const getAnnouncementMessagesFromConfig = async () => {
|
|
500
|
+
try {
|
|
501
|
+
const block = await getMergedSectionBlock("promoAnnouncements");
|
|
502
|
+
return parseAnnouncementMessages(block);
|
|
503
|
+
}
|
|
504
|
+
catch {
|
|
505
|
+
return parseAnnouncementMessages(DEFAULT_HOMEPAGE_SECTIONS.promoAnnouncements);
|
|
506
|
+
}
|
|
507
|
+
};
|
|
508
|
+
export const getAboutBrandFromConfig = async () => {
|
|
509
|
+
try {
|
|
510
|
+
const config = await getDynamicConfig();
|
|
511
|
+
const merged = await getMergedSectionBlock("aboutBrand");
|
|
512
|
+
const legacy = config?.["homepage-config"]?.["about-brand"] ??
|
|
513
|
+
config?.["homepage-config"]?.["who-we-are"];
|
|
514
|
+
const b = mergeSectionBlock(merged, legacy && typeof legacy === "object"
|
|
515
|
+
? legacy
|
|
516
|
+
: null);
|
|
517
|
+
const statsRaw = (b.stats ?? b["about-stats"] ?? []);
|
|
518
|
+
const stats = Array.isArray(statsRaw)
|
|
519
|
+
? statsRaw
|
|
520
|
+
.map((s) => {
|
|
521
|
+
if (!s || typeof s !== "object")
|
|
522
|
+
return null;
|
|
523
|
+
const row = s;
|
|
524
|
+
const label = String(row.label ?? row.name ?? "").trim();
|
|
525
|
+
const value = String(row.value ?? "").trim();
|
|
526
|
+
return label && value ? { label, value } : null;
|
|
527
|
+
})
|
|
528
|
+
.filter(Boolean)
|
|
529
|
+
: [];
|
|
530
|
+
const copy = parseSectionCopy(b);
|
|
531
|
+
return {
|
|
532
|
+
eyebrow: copy.eyebrow ?? "",
|
|
533
|
+
title: copy.title ?? copy.name ?? "",
|
|
534
|
+
description: copy.description ?? copy.text ?? "",
|
|
535
|
+
readMoreHref: String(b.readMoreHref ?? b["read-more-link"] ?? "/about"),
|
|
536
|
+
stats,
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
catch {
|
|
540
|
+
const b = DEFAULT_HOMEPAGE_SECTIONS.aboutBrand;
|
|
541
|
+
const copy = parseSectionCopy(b);
|
|
542
|
+
return {
|
|
543
|
+
eyebrow: copy.eyebrow ?? "",
|
|
544
|
+
title: copy.title ?? copy.name ?? "",
|
|
545
|
+
description: copy.description ?? copy.text ?? "",
|
|
546
|
+
readMoreHref: String(b.readMoreHref ?? "/about"),
|
|
547
|
+
stats: (b.stats ?? []),
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
};
|
|
551
|
+
export const getBrandPillarsFromConfig = async () => {
|
|
552
|
+
try {
|
|
553
|
+
const block = await getMergedSectionBlock("brandPillars");
|
|
554
|
+
const copy = parseSectionCopy(block);
|
|
555
|
+
const sectionTitle = copy.title ?? copy.name ?? "";
|
|
556
|
+
const raw = block.pillars ?? block["brand-pillars"] ?? [];
|
|
557
|
+
const pillars = (Array.isArray(raw) ? raw : [])
|
|
558
|
+
.map((item) => {
|
|
559
|
+
if (!item || typeof item !== "object")
|
|
560
|
+
return null;
|
|
561
|
+
const row = item["pillar"] ?? item;
|
|
562
|
+
const p = row;
|
|
563
|
+
const title = String(p.title ?? p.name ?? "").trim();
|
|
564
|
+
const description = String(p.description ?? p.text ?? "").trim();
|
|
565
|
+
const image = (p.image ?? p.icon);
|
|
566
|
+
return title && description ? { title, description, image } : null;
|
|
567
|
+
})
|
|
568
|
+
.filter(Boolean);
|
|
569
|
+
return { sectionTitle, pillars };
|
|
570
|
+
}
|
|
571
|
+
catch {
|
|
572
|
+
const block = DEFAULT_HOMEPAGE_SECTIONS.brandPillars;
|
|
573
|
+
const copy = parseSectionCopy(block);
|
|
574
|
+
const raw = block.pillars ?? [];
|
|
575
|
+
return {
|
|
576
|
+
sectionTitle: copy.title ?? copy.name ?? "",
|
|
577
|
+
pillars: [...(Array.isArray(raw) ? raw : [])],
|
|
578
|
+
};
|
|
579
|
+
}
|
|
580
|
+
};
|
|
581
|
+
export const getBlogPostsFromConfig = async () => {
|
|
582
|
+
try {
|
|
583
|
+
const block = await getMergedSectionBlock("blogPosts");
|
|
584
|
+
const raw = block.posts ?? block["blog-posts"] ?? block["blog-array"] ?? [];
|
|
585
|
+
const posts = (Array.isArray(raw) ? raw : [])
|
|
586
|
+
.map((item) => {
|
|
587
|
+
if (!item || typeof item !== "object")
|
|
588
|
+
return null;
|
|
589
|
+
const row = item["blog"] ?? item;
|
|
590
|
+
const b = row;
|
|
591
|
+
const title = String(b.title ?? "").trim();
|
|
592
|
+
const href = String(b.href ?? b.link ?? b.url ?? "").trim();
|
|
593
|
+
if (!title || !href)
|
|
594
|
+
return null;
|
|
595
|
+
return {
|
|
596
|
+
title,
|
|
597
|
+
href,
|
|
598
|
+
excerpt: String(b.excerpt ?? b.description ?? "").trim() || undefined,
|
|
599
|
+
category: String(b.category ?? b.tag ?? "").trim() || undefined,
|
|
600
|
+
date: String(b.date ?? "").trim() || undefined,
|
|
601
|
+
image: (b.image ?? b.thumbnail),
|
|
602
|
+
};
|
|
603
|
+
})
|
|
604
|
+
.filter(Boolean);
|
|
605
|
+
return posts;
|
|
606
|
+
}
|
|
607
|
+
catch {
|
|
608
|
+
const block = DEFAULT_HOMEPAGE_SECTIONS.blogPosts;
|
|
609
|
+
const raw = block.posts ?? [];
|
|
610
|
+
return (Array.isArray(raw) ? raw : [])
|
|
611
|
+
.map((item) => {
|
|
612
|
+
if (!item || typeof item !== "object")
|
|
613
|
+
return null;
|
|
614
|
+
const b = item;
|
|
615
|
+
const title = String(b.title ?? "").trim();
|
|
616
|
+
const href = String(b.href ?? b.link ?? "").trim();
|
|
617
|
+
if (!title || !href)
|
|
618
|
+
return null;
|
|
619
|
+
return { title, href };
|
|
620
|
+
})
|
|
621
|
+
.filter(Boolean);
|
|
622
|
+
}
|
|
623
|
+
};
|
|
624
|
+
function readPromoCountdownBlock(block) {
|
|
625
|
+
if (!block || typeof block !== "object") {
|
|
626
|
+
return { code: null, message: null, endAt: null, active: undefined };
|
|
627
|
+
}
|
|
628
|
+
const row = block;
|
|
629
|
+
const code = normalizeCmsText(row["promo-code"] ?? row.code ?? row["coupon-code"]) ?? null;
|
|
630
|
+
const message = normalizeCmsText(row["promo-text"] ?? row.message ?? row.text) ?? null;
|
|
631
|
+
const endAtRaw = row["end-at"] ?? row.endAt ?? row["ends-at"];
|
|
632
|
+
const endAt = typeof endAtRaw === "string" && endAtRaw.trim() ? endAtRaw.trim() : null;
|
|
633
|
+
const activeRaw = row["promo-active"] ?? row.active;
|
|
634
|
+
const active = typeof activeRaw === "boolean" ? activeRaw : undefined;
|
|
635
|
+
return { code, message, endAt, active };
|
|
636
|
+
}
|
|
637
|
+
/** Promo countdown — defaults + `sections.promoCountdown` override. */
|
|
638
|
+
export const getPromoCountdownFromConfig = async () => {
|
|
639
|
+
try {
|
|
640
|
+
const block = await getMergedSectionBlock("promoCountdown");
|
|
641
|
+
const fromBlock = readPromoCountdownBlock(block);
|
|
642
|
+
const defaults = readPromoCountdownBlock(DEFAULT_HOMEPAGE_SECTIONS.promoCountdown);
|
|
643
|
+
return {
|
|
644
|
+
code: fromBlock.code ?? defaults.code,
|
|
645
|
+
message: fromBlock.message ?? defaults.message,
|
|
646
|
+
endAt: fromBlock.endAt ?? defaults.endAt,
|
|
647
|
+
active: fromBlock.active ?? defaults.active ?? false,
|
|
648
|
+
};
|
|
649
|
+
}
|
|
650
|
+
catch {
|
|
651
|
+
const defaults = readPromoCountdownBlock(DEFAULT_HOMEPAGE_SECTIONS.promoCountdown);
|
|
652
|
+
return {
|
|
653
|
+
code: defaults.code,
|
|
654
|
+
message: defaults.message,
|
|
655
|
+
endAt: defaults.endAt,
|
|
656
|
+
active: defaults.active ?? false,
|
|
657
|
+
};
|
|
658
|
+
}
|
|
659
|
+
};
|
|
660
|
+
export { DEFAULT_HOMEPAGE_SECTIONS } from "./homepage-section-defaults";
|
|
275
661
|
export const getPromoBarConfig = async () => {
|
|
276
662
|
try {
|
|
277
663
|
const config = await getDynamicConfig();
|
package/dist/server/home.d.ts
CHANGED
|
@@ -1,15 +1,42 @@
|
|
|
1
|
+
import { HttpTypes } from "@medusajs/types";
|
|
1
2
|
import { getRegion } from "./regions";
|
|
3
|
+
import { type AboutBrandConfig, type BrandPillarConfig, type BlogPostConfig, type HomeSectionsCopy, type TrustFeaturesConfig } from "./dynamic-config";
|
|
2
4
|
export type HomePageData = {
|
|
3
5
|
region: Awaited<ReturnType<typeof getRegion>>;
|
|
4
6
|
collections: Array<Record<string, unknown>>;
|
|
5
|
-
categories:
|
|
6
|
-
newArrivals:
|
|
7
|
-
bestsellers:
|
|
7
|
+
categories: HttpTypes.StoreProductCategory[];
|
|
8
|
+
newArrivals: HttpTypes.StoreProduct[];
|
|
9
|
+
bestsellers: HttpTypes.StoreProduct[];
|
|
8
10
|
testimonials: unknown | null;
|
|
9
11
|
ratings: unknown[];
|
|
12
|
+
videoStories: {
|
|
13
|
+
title: string;
|
|
14
|
+
videoUrls: string[];
|
|
15
|
+
} | null;
|
|
16
|
+
announcementMessages: string[];
|
|
17
|
+
promoCountdown: {
|
|
18
|
+
code: string | null;
|
|
19
|
+
message: string | null;
|
|
20
|
+
endAt: string | null;
|
|
21
|
+
active: boolean;
|
|
22
|
+
};
|
|
23
|
+
luxeFavourites: HttpTypes.StoreProduct[];
|
|
24
|
+
celebrityProduct: HttpTypes.StoreProduct | null;
|
|
25
|
+
baptismGirl: HttpTypes.StoreProduct[];
|
|
26
|
+
baptismBoy: HttpTypes.StoreProduct[];
|
|
27
|
+
baptismPicks: HttpTypes.StoreProduct[];
|
|
28
|
+
themeProducts: HttpTypes.StoreProduct[];
|
|
29
|
+
aboutBrand: AboutBrandConfig;
|
|
30
|
+
brandPillars: {
|
|
31
|
+
sectionTitle: string;
|
|
32
|
+
pillars: BrandPillarConfig[];
|
|
33
|
+
};
|
|
34
|
+
blogPosts: BlogPostConfig[];
|
|
35
|
+
sectionsCopy: HomeSectionsCopy;
|
|
36
|
+
trustFeatures: TrustFeaturesConfig;
|
|
10
37
|
};
|
|
11
38
|
/**
|
|
12
|
-
* Parallel home page data loader
|
|
39
|
+
* Parallel home page data loader for full storefront homepage sections.
|
|
13
40
|
*/
|
|
14
41
|
export declare function loadHomePageData(countryCode: string): Promise<HomePageData | null>;
|
|
15
42
|
//# sourceMappingURL=home.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../src/server/home.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../src/server/home.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAUL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACzB,MAAM,kBAAkB,CAAC;AAiC1B,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC;IAC9C,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5C,UAAU,EAAE,SAAS,CAAC,oBAAoB,EAAE,CAAC;IAC7C,WAAW,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;IACtC,WAAW,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;IACtC,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5D,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,cAAc,EAAE;QACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;IACF,cAAc,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;IACzC,gBAAgB,EAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC;IAChD,WAAW,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;IACtC,UAAU,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;IACrC,YAAY,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;IACvC,aAAa,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;IACxC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,YAAY,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,iBAAiB,EAAE,CAAA;KAAE,CAAC;IACrE,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,YAAY,EAAE,gBAAgB,CAAC;IAC/B,aAAa,EAAE,mBAAmB,CAAC;CACpC,CAAC;AAEF;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA2HxF"}
|