medusa-storefront-data 2.3.0 → 2.4.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/HOMEPAGE_CONFIG.md +99 -0
- package/dist/segment-data/default-page-input.json +191 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/cookies.d.ts.map +1 -0
- package/dist/src/edge.d.ts.map +1 -0
- package/dist/src/middleware.d.ts.map +1 -0
- package/dist/src/server/cart.d.ts.map +1 -0
- package/dist/src/server/categories.d.ts.map +1 -0
- package/dist/src/server/collections.d.ts.map +1 -0
- package/dist/src/server/config-merge.d.ts +3 -0
- package/dist/src/server/config-merge.d.ts.map +1 -0
- package/dist/src/server/config-merge.js +31 -0
- package/dist/src/server/contact.d.ts.map +1 -0
- package/dist/src/server/customer-registration.d.ts.map +1 -0
- package/dist/src/server/customer.d.ts.map +1 -0
- package/dist/src/server/dynamic-config.d.ts +240 -0
- package/dist/src/server/dynamic-config.d.ts.map +1 -0
- package/dist/src/server/dynamic-config.js +703 -0
- package/dist/src/server/fulfillment.d.ts.map +1 -0
- package/dist/src/server/guest.d.ts.map +1 -0
- package/dist/src/server/home-sections/about-brand.d.ts +9 -0
- package/dist/src/server/home-sections/about-brand.d.ts.map +1 -0
- package/dist/src/server/home-sections/about-brand.js +9 -0
- package/dist/src/server/home-sections/baptism-picks.d.ts +10 -0
- package/dist/src/server/home-sections/baptism-picks.d.ts.map +1 -0
- package/dist/src/server/home-sections/baptism-picks.js +27 -0
- package/dist/src/server/home-sections/baptism.d.ts +13 -0
- package/dist/src/server/home-sections/baptism.d.ts.map +1 -0
- package/dist/src/server/home-sections/baptism.js +43 -0
- package/dist/src/server/home-sections/blog-posts.d.ts +9 -0
- package/dist/src/server/home-sections/blog-posts.d.ts.map +1 -0
- package/dist/src/server/home-sections/blog-posts.js +9 -0
- package/dist/src/server/home-sections/brand-marquee.d.ts +8 -0
- package/dist/src/server/home-sections/brand-marquee.d.ts.map +1 -0
- package/dist/src/server/home-sections/brand-marquee.js +7 -0
- package/dist/src/server/home-sections/brand-pillars.d.ts +9 -0
- package/dist/src/server/home-sections/brand-pillars.d.ts.map +1 -0
- package/dist/src/server/home-sections/brand-pillars.js +9 -0
- package/dist/src/server/home-sections/category-pills.d.ts +9 -0
- package/dist/src/server/home-sections/category-pills.d.ts.map +1 -0
- package/dist/src/server/home-sections/category-pills.js +19 -0
- package/dist/src/server/home-sections/celebrity-trust.d.ts +12 -0
- package/dist/src/server/home-sections/celebrity-trust.d.ts.map +1 -0
- package/dist/src/server/home-sections/celebrity-trust.js +27 -0
- package/dist/src/server/home-sections/features.d.ts +9 -0
- package/dist/src/server/home-sections/features.d.ts.map +1 -0
- package/dist/src/server/home-sections/features.js +9 -0
- package/dist/src/server/home-sections/hero.d.ts +9 -0
- package/dist/src/server/home-sections/hero.d.ts.map +1 -0
- package/dist/src/server/home-sections/hero.js +9 -0
- package/dist/src/server/home-sections/instagram-posts.d.ts +9 -0
- package/dist/src/server/home-sections/instagram-posts.d.ts.map +1 -0
- package/dist/src/server/home-sections/instagram-posts.js +9 -0
- package/dist/src/server/home-sections/loved-by-moms.d.ts +12 -0
- package/dist/src/server/home-sections/loved-by-moms.d.ts.map +1 -0
- package/dist/src/server/home-sections/loved-by-moms.js +20 -0
- package/dist/src/server/home-sections/luxe-favourites.d.ts +11 -0
- package/dist/src/server/home-sections/luxe-favourites.d.ts.map +1 -0
- package/dist/src/server/home-sections/luxe-favourites.js +19 -0
- package/dist/src/server/home-sections/new-arrivals-classic.d.ts +8 -0
- package/dist/src/server/home-sections/new-arrivals-classic.d.ts.map +1 -0
- package/dist/src/server/home-sections/new-arrivals-classic.js +10 -0
- package/dist/src/server/home-sections/new-arrivals.d.ts +12 -0
- package/dist/src/server/home-sections/new-arrivals.d.ts.map +1 -0
- package/dist/src/server/home-sections/new-arrivals.js +28 -0
- package/dist/src/server/home-sections/promo-announcements.d.ts +7 -0
- package/dist/src/server/home-sections/promo-announcements.d.ts.map +1 -0
- package/dist/src/server/home-sections/promo-announcements.js +7 -0
- package/dist/src/server/home-sections/promo-countdown.d.ts +6 -0
- package/dist/src/server/home-sections/promo-countdown.d.ts.map +1 -0
- package/dist/src/server/home-sections/promo-countdown.js +5 -0
- package/dist/src/server/home-sections/shared.d.ts +10 -0
- package/dist/src/server/home-sections/shared.d.ts.map +1 -0
- package/dist/src/server/home-sections/shared.js +29 -0
- package/dist/src/server/home-sections/shop-by-age.d.ts +9 -0
- package/dist/src/server/home-sections/shop-by-age.d.ts.map +1 -0
- package/dist/src/server/home-sections/shop-by-age.js +17 -0
- package/dist/src/server/home-sections/shop-by-category.d.ts +10 -0
- package/dist/src/server/home-sections/shop-by-category.d.ts.map +1 -0
- package/dist/src/server/home-sections/shop-by-category.js +17 -0
- package/dist/src/server/home-sections/testimonials.d.ts +9 -0
- package/dist/src/server/home-sections/testimonials.d.ts.map +1 -0
- package/dist/src/server/home-sections/testimonials.js +9 -0
- package/dist/src/server/home-sections/theme-dresses.d.ts +12 -0
- package/dist/src/server/home-sections/theme-dresses.d.ts.map +1 -0
- package/dist/src/server/home-sections/theme-dresses.js +27 -0
- package/dist/src/server/home-sections/video-stories.d.ts +9 -0
- package/dist/src/server/home-sections/video-stories.d.ts.map +1 -0
- package/dist/src/server/home-sections/video-stories.js +9 -0
- package/dist/src/server/home-sections/why-choose-us.d.ts +9 -0
- package/dist/src/server/home-sections/why-choose-us.d.ts.map +1 -0
- package/dist/src/server/home-sections/why-choose-us.js +9 -0
- package/dist/src/server/home.d.ts +62 -0
- package/dist/src/server/home.d.ts.map +1 -0
- package/dist/{server → src/server}/home.js +29 -31
- package/dist/src/server/homepage-config.types.d.ts +274 -0
- package/dist/src/server/homepage-config.types.d.ts.map +1 -0
- package/dist/src/server/homepage-config.types.js +33 -0
- package/dist/{server → src/server}/homepage-section-defaults.d.ts +35 -2
- package/dist/src/server/homepage-section-defaults.d.ts.map +1 -0
- package/dist/{server → src/server}/homepage-section-defaults.js +41 -2
- package/dist/{server → src/server}/index.d.ts +2 -0
- package/dist/src/server/index.d.ts.map +1 -0
- package/dist/{server → src/server}/index.js +2 -0
- package/dist/src/server/locale-actions.d.ts.map +1 -0
- package/dist/src/server/locales.d.ts.map +1 -0
- package/dist/src/server/notifications.d.ts.map +1 -0
- package/dist/src/server/onboarding.d.ts.map +1 -0
- package/dist/src/server/orders.d.ts.map +1 -0
- package/dist/src/server/page-input.d.ts +19 -0
- package/dist/src/server/page-input.d.ts.map +1 -0
- package/dist/src/server/page-input.js +40 -0
- package/dist/src/server/payment-details.d.ts.map +1 -0
- package/dist/src/server/payment.d.ts.map +1 -0
- package/dist/src/server/pincode.d.ts.map +1 -0
- package/dist/src/server/products.d.ts.map +1 -0
- package/dist/src/server/regions.d.ts.map +1 -0
- package/dist/src/server/resolve-home-segment-data.d.ts +25 -0
- package/dist/src/server/resolve-home-segment-data.d.ts.map +1 -0
- package/dist/src/server/resolve-home-segment-data.js +20 -0
- package/dist/src/server/returns.d.ts.map +1 -0
- package/dist/src/server/shoppable-looks.d.ts +17 -0
- package/dist/src/server/shoppable-looks.d.ts.map +1 -0
- package/dist/src/server/shoppable-looks.js +136 -0
- package/dist/src/server/swaps.d.ts.map +1 -0
- package/dist/src/server/variants.d.ts.map +1 -0
- package/dist/src/server/wishlist.d.ts.map +1 -0
- package/dist/src/util/get-locale-header.d.ts.map +1 -0
- package/dist/src/util/medusa-error.d.ts.map +1 -0
- package/dist/src/util/revalidate-cart.d.ts.map +1 -0
- package/dist/src/util/sort-products.d.ts.map +1 -0
- package/dist/src/util/store-client.d.ts.map +1 -0
- package/homepage-config.example.json +209 -0
- package/homepage-sections.example.json +55 -0
- package/package.json +121 -2
- package/segment-data/default-page-input.json +191 -0
- package/src/server/config-merge.ts +31 -0
- package/src/server/dynamic-config.ts +620 -508
- package/src/server/home-sections/about-brand.ts +24 -0
- package/src/server/home-sections/baptism-picks.ts +46 -0
- package/src/server/home-sections/baptism.ts +64 -0
- package/src/server/home-sections/blog-posts.ts +23 -0
- package/src/server/home-sections/brand-marquee.ts +17 -0
- package/src/server/home-sections/brand-pillars.ts +23 -0
- package/src/server/home-sections/category-pills.ts +32 -0
- package/src/server/home-sections/celebrity-trust.ts +42 -0
- package/src/server/home-sections/features.ts +23 -0
- package/src/server/home-sections/hero.ts +24 -0
- package/src/server/home-sections/instagram-posts.ts +23 -0
- package/src/server/home-sections/loved-by-moms.ts +34 -0
- package/src/server/home-sections/luxe-favourites.ts +30 -0
- package/src/server/home-sections/new-arrivals-classic.ts +21 -0
- package/src/server/home-sections/new-arrivals.ts +47 -0
- package/src/server/home-sections/promo-announcements.ts +17 -0
- package/src/server/home-sections/promo-countdown.ts +15 -0
- package/src/server/home-sections/shared.ts +44 -0
- package/src/server/home-sections/shop-by-age.ts +26 -0
- package/src/server/home-sections/shop-by-category.ts +28 -0
- package/src/server/home-sections/testimonials.ts +23 -0
- package/src/server/home-sections/theme-dresses.ts +49 -0
- package/src/server/home-sections/video-stories.ts +23 -0
- package/src/server/home-sections/why-choose-us.ts +23 -0
- package/src/server/home.ts +68 -54
- package/src/server/homepage-config.types.ts +335 -0
- package/src/server/homepage-section-defaults.ts +41 -2
- package/src/server/index.ts +2 -0
- package/src/server/page-input.ts +64 -0
- package/src/server/resolve-home-segment-data.ts +63 -0
- package/src/server/shoppable-looks.ts +178 -0
- package/dist/config.d.ts.map +0 -1
- package/dist/cookies.d.ts.map +0 -1
- package/dist/edge.d.ts.map +0 -1
- package/dist/middleware.d.ts.map +0 -1
- package/dist/server/cart.d.ts.map +0 -1
- package/dist/server/categories.d.ts.map +0 -1
- package/dist/server/collections.d.ts.map +0 -1
- package/dist/server/contact.d.ts.map +0 -1
- package/dist/server/customer-registration.d.ts.map +0 -1
- package/dist/server/customer.d.ts.map +0 -1
- package/dist/server/dynamic-config.d.ts +0 -202
- package/dist/server/dynamic-config.d.ts.map +0 -1
- package/dist/server/dynamic-config.js +0 -675
- package/dist/server/fulfillment.d.ts.map +0 -1
- package/dist/server/guest.d.ts.map +0 -1
- package/dist/server/home.d.ts +0 -42
- package/dist/server/home.d.ts.map +0 -1
- package/dist/server/homepage-section-defaults.d.ts.map +0 -1
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/locale-actions.d.ts.map +0 -1
- package/dist/server/locales.d.ts.map +0 -1
- package/dist/server/notifications.d.ts.map +0 -1
- package/dist/server/onboarding.d.ts.map +0 -1
- package/dist/server/orders.d.ts.map +0 -1
- package/dist/server/payment-details.d.ts.map +0 -1
- package/dist/server/payment.d.ts.map +0 -1
- package/dist/server/pincode.d.ts.map +0 -1
- package/dist/server/products.d.ts.map +0 -1
- package/dist/server/regions.d.ts.map +0 -1
- package/dist/server/returns.d.ts.map +0 -1
- package/dist/server/swaps.d.ts.map +0 -1
- package/dist/server/variants.d.ts.map +0 -1
- package/dist/server/wishlist.d.ts.map +0 -1
- package/dist/util/get-locale-header.d.ts.map +0 -1
- package/dist/util/medusa-error.d.ts.map +0 -1
- package/dist/util/revalidate-cart.d.ts.map +0 -1
- package/dist/util/sort-products.d.ts.map +0 -1
- package/dist/util/store-client.d.ts.map +0 -1
- /package/dist/{config.d.ts → src/config.d.ts} +0 -0
- /package/dist/{config.js → src/config.js} +0 -0
- /package/dist/{cookies.d.ts → src/cookies.d.ts} +0 -0
- /package/dist/{cookies.js → src/cookies.js} +0 -0
- /package/dist/{edge.d.ts → src/edge.d.ts} +0 -0
- /package/dist/{edge.js → src/edge.js} +0 -0
- /package/dist/{middleware.d.ts → src/middleware.d.ts} +0 -0
- /package/dist/{middleware.js → src/middleware.js} +0 -0
- /package/dist/{server → src/server}/cart.d.ts +0 -0
- /package/dist/{server → src/server}/cart.js +0 -0
- /package/dist/{server → src/server}/categories.d.ts +0 -0
- /package/dist/{server → src/server}/categories.js +0 -0
- /package/dist/{server → src/server}/collections.d.ts +0 -0
- /package/dist/{server → src/server}/collections.js +0 -0
- /package/dist/{server → src/server}/contact.d.ts +0 -0
- /package/dist/{server → src/server}/contact.js +0 -0
- /package/dist/{server → src/server}/customer-registration.d.ts +0 -0
- /package/dist/{server → src/server}/customer-registration.js +0 -0
- /package/dist/{server → src/server}/customer.d.ts +0 -0
- /package/dist/{server → src/server}/customer.js +0 -0
- /package/dist/{server → src/server}/fulfillment.d.ts +0 -0
- /package/dist/{server → src/server}/fulfillment.js +0 -0
- /package/dist/{server → src/server}/guest.d.ts +0 -0
- /package/dist/{server → src/server}/guest.js +0 -0
- /package/dist/{server → src/server}/locale-actions.d.ts +0 -0
- /package/dist/{server → src/server}/locale-actions.js +0 -0
- /package/dist/{server → src/server}/locales.d.ts +0 -0
- /package/dist/{server → src/server}/locales.js +0 -0
- /package/dist/{server → src/server}/notifications.d.ts +0 -0
- /package/dist/{server → src/server}/notifications.js +0 -0
- /package/dist/{server → src/server}/onboarding.d.ts +0 -0
- /package/dist/{server → src/server}/onboarding.js +0 -0
- /package/dist/{server → src/server}/orders.d.ts +0 -0
- /package/dist/{server → src/server}/orders.js +0 -0
- /package/dist/{server → src/server}/payment-details.d.ts +0 -0
- /package/dist/{server → src/server}/payment-details.js +0 -0
- /package/dist/{server → src/server}/payment.d.ts +0 -0
- /package/dist/{server → src/server}/payment.js +0 -0
- /package/dist/{server → src/server}/pincode.d.ts +0 -0
- /package/dist/{server → src/server}/pincode.js +0 -0
- /package/dist/{server → src/server}/products.d.ts +0 -0
- /package/dist/{server → src/server}/products.js +0 -0
- /package/dist/{server → src/server}/regions.d.ts +0 -0
- /package/dist/{server → src/server}/regions.js +0 -0
- /package/dist/{server → src/server}/returns.d.ts +0 -0
- /package/dist/{server → src/server}/returns.js +0 -0
- /package/dist/{server → src/server}/swaps.d.ts +0 -0
- /package/dist/{server → src/server}/swaps.js +0 -0
- /package/dist/{server → src/server}/variants.d.ts +0 -0
- /package/dist/{server → src/server}/variants.js +0 -0
- /package/dist/{server → src/server}/wishlist.d.ts +0 -0
- /package/dist/{server → src/server}/wishlist.js +0 -0
- /package/dist/{util → src/util}/get-locale-header.d.ts +0 -0
- /package/dist/{util → src/util}/get-locale-header.js +0 -0
- /package/dist/{util → src/util}/medusa-error.d.ts +0 -0
- /package/dist/{util → src/util}/medusa-error.js +0 -0
- /package/dist/{util → src/util}/revalidate-cart.d.ts +0 -0
- /package/dist/{util → src/util}/revalidate-cart.js +0 -0
- /package/dist/{util → src/util}/sort-products.d.ts +0 -0
- /package/dist/{util → src/util}/sort-products.js +0 -0
- /package/dist/{util → src/util}/store-client.d.ts +0 -0
- /package/dist/{util → src/util}/store-client.js +0 -0
|
@@ -1,675 +0,0 @@
|
|
|
1
|
-
"use server";
|
|
2
|
-
import { cache } from "react";
|
|
3
|
-
import { getAuthHeaders } from "../cookies";
|
|
4
|
-
import { DEFAULT_HOMEPAGE_SECTIONS, HOME_SECTION_COPY_ID_LIST, } from "./homepage-section-defaults";
|
|
5
|
-
export const getDynamicConfig = cache(async () => {
|
|
6
|
-
try {
|
|
7
|
-
const publishableKey = process.env.NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY;
|
|
8
|
-
const baseUrl = process.env.MEDUSA_BACKEND_URL || "http://localhost:9000";
|
|
9
|
-
if (!publishableKey) {
|
|
10
|
-
return null;
|
|
11
|
-
}
|
|
12
|
-
const authHeaders = await getAuthHeaders();
|
|
13
|
-
const headers = {
|
|
14
|
-
"Content-Type": "application/json",
|
|
15
|
-
"Accept": "application/json",
|
|
16
|
-
"x-publishable-api-key": publishableKey,
|
|
17
|
-
};
|
|
18
|
-
if (authHeaders && "authorization" in authHeaders) {
|
|
19
|
-
headers["authorization"] = authHeaders.authorization;
|
|
20
|
-
}
|
|
21
|
-
const fetchStart = Date.now();
|
|
22
|
-
const response = await fetch(`${baseUrl}/store/dynamic-config`, {
|
|
23
|
-
method: "GET",
|
|
24
|
-
headers,
|
|
25
|
-
cache: "no-store",
|
|
26
|
-
});
|
|
27
|
-
const duration = Date.now() - fetchStart;
|
|
28
|
-
if (!response.ok) {
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
const data = await response.json();
|
|
32
|
-
return data;
|
|
33
|
-
}
|
|
34
|
-
catch (error) {
|
|
35
|
-
return null;
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
export const getLogoFromConfig = async () => {
|
|
39
|
-
try {
|
|
40
|
-
const config = await getDynamicConfig();
|
|
41
|
-
const logo = config?.["homepage-config"]?.logo;
|
|
42
|
-
return logo || null;
|
|
43
|
-
}
|
|
44
|
-
catch (error) {
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
export const getBannerImageFromConfig = async () => {
|
|
49
|
-
try {
|
|
50
|
-
const config = await getDynamicConfig();
|
|
51
|
-
const bannerArray = config?.["homepage-config"]?.["homepage-banner-array"];
|
|
52
|
-
if (bannerArray && bannerArray.length > 0) {
|
|
53
|
-
const firstBanner = bannerArray[0];
|
|
54
|
-
const image = firstBanner?.["homepage-banner"]?.["homepage-banner-image"];
|
|
55
|
-
return image || null;
|
|
56
|
-
}
|
|
57
|
-
return null;
|
|
58
|
-
}
|
|
59
|
-
catch (error) {
|
|
60
|
-
return null;
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
export const getMobileBannerFromConfig = async () => {
|
|
64
|
-
try {
|
|
65
|
-
const config = await getDynamicConfig();
|
|
66
|
-
const bannerArray = config?.["homepage-config"]?.["app-banner-array"];
|
|
67
|
-
if (bannerArray && bannerArray.length > 0) {
|
|
68
|
-
const firstBanner = bannerArray[0];
|
|
69
|
-
const image = firstBanner?.["app-banner"]?.["app-banner-image"] || null;
|
|
70
|
-
const link = firstBanner?.["app-banner"]?.["app-banner-button-link"] || firstBanner?.["app-banner"]?.["app-banner-link"] || null;
|
|
71
|
-
return { image, link };
|
|
72
|
-
}
|
|
73
|
-
return { image: null, link: null };
|
|
74
|
-
}
|
|
75
|
-
catch (error) {
|
|
76
|
-
return { image: null, link: null };
|
|
77
|
-
}
|
|
78
|
-
};
|
|
79
|
-
export const getHomeBannersFromConfig = async () => {
|
|
80
|
-
try {
|
|
81
|
-
const config = await getDynamicConfig();
|
|
82
|
-
const bannerArray = config?.["homepage-config"]?.["homepage-banner-array"];
|
|
83
|
-
if (bannerArray && bannerArray.length > 0) {
|
|
84
|
-
return bannerArray.map(item => {
|
|
85
|
-
const banner = item["homepage-banner"];
|
|
86
|
-
return {
|
|
87
|
-
image: banner?.["homepage-banner-image"],
|
|
88
|
-
title: normalizeCmsText(banner?.["homepage-banner-title"]),
|
|
89
|
-
subtitle: normalizeCmsText(banner?.["homepage-banner-subtitle"]),
|
|
90
|
-
description: normalizeCmsText(banner?.["homepage-banner-description"]),
|
|
91
|
-
buttonName: normalizeBannerButtonName(banner?.["homepage-banner-button-name"]),
|
|
92
|
-
buttonLink: banner?.["homepage-banner-button-link"],
|
|
93
|
-
};
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
return null;
|
|
97
|
-
}
|
|
98
|
-
catch (error) {
|
|
99
|
-
return null;
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
export const getAppBannersFromConfig = async () => {
|
|
103
|
-
try {
|
|
104
|
-
const config = await getDynamicConfig();
|
|
105
|
-
const bannerArray = config?.["homepage-config"]?.["app-banner-array"];
|
|
106
|
-
if (bannerArray && bannerArray.length > 0) {
|
|
107
|
-
return bannerArray.map(item => {
|
|
108
|
-
const banner = item["app-banner"];
|
|
109
|
-
return {
|
|
110
|
-
image: banner?.["app-banner-image"],
|
|
111
|
-
title: normalizeCmsText(banner?.["app-banner-title"]),
|
|
112
|
-
subtitle: normalizeCmsText(banner?.["app-banner-subtitle"]),
|
|
113
|
-
description: normalizeCmsText(banner?.["app-banner-description"]),
|
|
114
|
-
buttonName: normalizeBannerButtonName(banner?.["app-banner-button-name"]),
|
|
115
|
-
buttonLink: banner?.["app-banner-button-link"],
|
|
116
|
-
};
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
return null;
|
|
120
|
-
}
|
|
121
|
-
catch (error) {
|
|
122
|
-
return null;
|
|
123
|
-
}
|
|
124
|
-
};
|
|
125
|
-
// Legacy function for backward compatibility
|
|
126
|
-
export const getMobileBannerImageFromConfig = async () => {
|
|
127
|
-
const { image } = await getMobileBannerFromConfig();
|
|
128
|
-
return image;
|
|
129
|
-
};
|
|
130
|
-
export const getWebsiteDescriptionFromConfig = async () => {
|
|
131
|
-
try {
|
|
132
|
-
const config = await getDynamicConfig();
|
|
133
|
-
const homepageConfig = config?.["homepage-config"];
|
|
134
|
-
const desc = homepageConfig?.["website-description"] || homepageConfig?.["website_description"];
|
|
135
|
-
return desc || null;
|
|
136
|
-
}
|
|
137
|
-
catch (error) {
|
|
138
|
-
return null;
|
|
139
|
-
}
|
|
140
|
-
};
|
|
141
|
-
/** Why choose us — defaults + `sections.whyChooseUs` override. */
|
|
142
|
-
export const getFeaturesFromConfig = async () => {
|
|
143
|
-
try {
|
|
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);
|
|
149
|
-
return { title, features };
|
|
150
|
-
}
|
|
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
|
-
};
|
|
158
|
-
}
|
|
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
|
-
}
|
|
175
|
-
const EMAIL_PATTERN = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
|
|
176
|
-
/** Fix common UTF-8 mojibake from CMS copy-paste (e.g. em dash, apostrophe). */
|
|
177
|
-
function normalizeCmsText(value) {
|
|
178
|
-
if (typeof value !== "string" || !value.trim())
|
|
179
|
-
return undefined;
|
|
180
|
-
return value
|
|
181
|
-
.trim()
|
|
182
|
-
.replace(/ΓÇö/g, "—")
|
|
183
|
-
.replace(/ΓÇÖ/g, "'")
|
|
184
|
-
.replace(/ΓÇ£|ΓÇ¥/g, '"')
|
|
185
|
-
.replace(/≡ƒÿÄ≡ƒæòΓ£¿/g, " 👕✨");
|
|
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
|
-
};
|
|
341
|
-
function normalizeBannerButtonName(value) {
|
|
342
|
-
const text = normalizeCmsText(value);
|
|
343
|
-
if (!text)
|
|
344
|
-
return undefined;
|
|
345
|
-
if (/^shop\s+now\s*1$/i.test(text))
|
|
346
|
-
return "Shop Now";
|
|
347
|
-
return text;
|
|
348
|
-
}
|
|
349
|
-
function normalizeConfigEmail(value) {
|
|
350
|
-
if (typeof value !== "string")
|
|
351
|
-
return undefined;
|
|
352
|
-
const trimmed = value.trim();
|
|
353
|
-
return EMAIL_PATTERN.test(trimmed) ? trimmed : undefined;
|
|
354
|
-
}
|
|
355
|
-
export const getContactInfoFromConfig = async () => {
|
|
356
|
-
try {
|
|
357
|
-
const config = await getDynamicConfig();
|
|
358
|
-
const contactConfig = config?.["homepage-config"]?.["contact-us"];
|
|
359
|
-
if (!contactConfig) {
|
|
360
|
-
return null;
|
|
361
|
-
}
|
|
362
|
-
return {
|
|
363
|
-
phone: contactConfig["contact-phone"],
|
|
364
|
-
email: normalizeConfigEmail(contactConfig["contact-email"]),
|
|
365
|
-
address: contactConfig["contact-address"],
|
|
366
|
-
};
|
|
367
|
-
}
|
|
368
|
-
catch (error) {
|
|
369
|
-
return null;
|
|
370
|
-
}
|
|
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
|
-
};
|
|
423
|
-
export const getTestimonialsFromConfig = async () => {
|
|
424
|
-
try {
|
|
425
|
-
const config = await getDynamicConfig();
|
|
426
|
-
const homepageConfig = config?.["homepage-config"];
|
|
427
|
-
if (!homepageConfig)
|
|
428
|
-
return null;
|
|
429
|
-
const block = await getMergedSectionBlock("testimonials");
|
|
430
|
-
const copy = parseSectionCopy(block);
|
|
431
|
-
const title = copy.title ?? copy.name ?? "";
|
|
432
|
-
const ratings = homepageConfig["ratings"] || [];
|
|
433
|
-
let testimonials = (Array.isArray(ratings) ? ratings : []).map((item, index) => {
|
|
434
|
-
const row = item;
|
|
435
|
-
const review = (row?.review ?? row);
|
|
436
|
-
return {
|
|
437
|
-
id: `review-${index}`,
|
|
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"],
|
|
442
|
-
};
|
|
443
|
-
}).filter((t) => t.text && t.name);
|
|
444
|
-
return { title, testimonials };
|
|
445
|
-
}
|
|
446
|
-
catch {
|
|
447
|
-
const block = DEFAULT_HOMEPAGE_SECTIONS.testimonials;
|
|
448
|
-
const copy = parseSectionCopy(block);
|
|
449
|
-
return { title: copy.title ?? copy.name ?? "", testimonials: [] };
|
|
450
|
-
}
|
|
451
|
-
};
|
|
452
|
-
export const getSocialLinksFromConfig = async () => {
|
|
453
|
-
try {
|
|
454
|
-
const config = await getDynamicConfig();
|
|
455
|
-
const socialLinksRaw = config?.["homepage-config"]?.["social-links"] || [];
|
|
456
|
-
const socialLinks = socialLinksRaw.map((item) => {
|
|
457
|
-
const link = item?.["social-link"] || item;
|
|
458
|
-
return {
|
|
459
|
-
name: link?.["social-platform-name"] || "",
|
|
460
|
-
url: link?.["social-platform-url"] || "",
|
|
461
|
-
icon: link?.["social-platform-icon"] || undefined,
|
|
462
|
-
};
|
|
463
|
-
}).filter((l) => l.name && l.url);
|
|
464
|
-
return socialLinks.length > 0 ? socialLinks : null;
|
|
465
|
-
}
|
|
466
|
-
catch (error) {
|
|
467
|
-
return null;
|
|
468
|
-
}
|
|
469
|
-
};
|
|
470
|
-
export const getFaqsFromConfig = async () => {
|
|
471
|
-
try {
|
|
472
|
-
const config = await getDynamicConfig();
|
|
473
|
-
const faqsRaw = config?.["homepage-config"]?.["faq-array"] || [];
|
|
474
|
-
if (!Array.isArray(faqsRaw) || faqsRaw.length === 0)
|
|
475
|
-
return null;
|
|
476
|
-
const categoriesMap = {};
|
|
477
|
-
faqsRaw.forEach((item) => {
|
|
478
|
-
const faq = item?.["faq"] || item;
|
|
479
|
-
const displayCategory = (faq?.["faq-category"] || "General Questions").trim();
|
|
480
|
-
const categoryKey = displayCategory.toLowerCase();
|
|
481
|
-
const q = (faq?.["faq-question"] || "").trim();
|
|
482
|
-
const a = (faq?.["faq-answer"] || "").trim();
|
|
483
|
-
if (q && a) {
|
|
484
|
-
if (!categoriesMap[categoryKey])
|
|
485
|
-
categoriesMap[categoryKey] = { displayCategory, items: [] };
|
|
486
|
-
categoriesMap[categoryKey].items.push({ q, a });
|
|
487
|
-
}
|
|
488
|
-
});
|
|
489
|
-
const faqs = Object.values(categoriesMap).map(catData => ({
|
|
490
|
-
category: catData.displayCategory,
|
|
491
|
-
items: catData.items
|
|
492
|
-
}));
|
|
493
|
-
return faqs.length > 0 ? faqs : null;
|
|
494
|
-
}
|
|
495
|
-
catch (error) {
|
|
496
|
-
return null;
|
|
497
|
-
}
|
|
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";
|
|
661
|
-
export const getPromoBarConfig = async () => {
|
|
662
|
-
try {
|
|
663
|
-
const config = await getDynamicConfig();
|
|
664
|
-
const promoConfig = config?.["homepage-config"]?.["promo-bar"];
|
|
665
|
-
return {
|
|
666
|
-
text: normalizeCmsText(promoConfig?.["promo-text"]) || null,
|
|
667
|
-
code: promoConfig?.["promo-code"] || null,
|
|
668
|
-
value: promoConfig?.["promo-value"] || null,
|
|
669
|
-
active: promoConfig?.["promo-active"] ?? false,
|
|
670
|
-
};
|
|
671
|
-
}
|
|
672
|
-
catch (error) {
|
|
673
|
-
return { text: null, code: null, value: null, active: false };
|
|
674
|
-
}
|
|
675
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fulfillment.d.ts","sourceRoot":"","sources":["../../src/server/fulfillment.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAQ3C,eAAO,MAAM,uBAAuB,GAAU,QAAQ,MAAM,uEA0B3D,CAAA;AAED,eAAO,MAAM,+BAA+B,GAC1C,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,OAAO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,sDAc/B,CAAA;AAED,eAAO,MAAM,2BAA2B,GAAU,SAAS,MAAM,EAAE,YAAY,MAAM,EAAE,MAAK,MAAU,yFAWrG,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"guest.d.ts","sourceRoot":"","sources":["../../src/server/guest.ts"],"names":[],"mappings":"AAEA,OAAO,EAOL,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAA;AAsB9B;;GAEG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAA6B,6DAO/E;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,6DAExE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM;;aAOH,MAAM;;;GAUrD;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,6DAGlD;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,6DAe9D;AAED,wBAAsB,WAAW;;GAOhC;AAED,wBAAsB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM;;;;;;;;GAclD;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;;;;;;;;GAkB7D;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;;;;;;GAcrE;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;;;;;;;;;;;;;GAczE;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;;;;;;;;GAqBjE;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,eAAe,EAAE,EACxB,SAAS,CAAC,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM;;;;;;;;GAef"}
|