medusa-storefront-data 2.5.8 → 2.5.10
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/segment-data/default-page-input.json +191 -0
- package/dist/src/config.d.ts +3 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +31 -0
- package/dist/src/cookies.d.ts +23 -0
- package/dist/src/cookies.d.ts.map +1 -0
- package/dist/src/cookies.js +140 -0
- package/dist/src/edge.d.ts +3 -0
- package/dist/src/edge.d.ts.map +1 -0
- package/dist/src/edge.js +1 -0
- package/dist/src/middleware.d.ts +3 -0
- package/dist/src/middleware.d.ts.map +1 -0
- package/dist/src/middleware.js +1 -0
- package/dist/src/server/brand-pillars-from-categories.d.ts +8 -0
- package/dist/src/server/brand-pillars-from-categories.d.ts.map +1 -0
- package/dist/src/server/brand-pillars-from-categories.js +92 -0
- package/dist/src/server/cart.d.ts +96 -0
- package/dist/src/server/cart.d.ts.map +1 -0
- package/dist/src/server/cart.js +797 -0
- package/dist/src/server/categories.d.ts +4 -0
- package/dist/src/server/categories.d.ts.map +1 -0
- package/dist/src/server/categories.js +34 -0
- package/dist/src/server/collections.d.ts +8 -0
- package/dist/src/server/collections.d.ts.map +1 -0
- package/dist/src/server/collections.js +39 -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 +34 -0
- package/dist/src/server/contact.d.ts.map +1 -0
- package/dist/src/server/contact.js +57 -0
- package/dist/src/server/customer-registration.d.ts +142 -0
- package/dist/src/server/customer-registration.d.ts.map +1 -0
- package/dist/src/server/customer-registration.js +295 -0
- package/dist/src/server/customer.d.ts +48 -0
- package/dist/src/server/customer.d.ts.map +1 -0
- package/dist/src/server/customer.js +413 -0
- package/dist/src/server/dynamic-config.d.ts +200 -0
- package/dist/src/server/dynamic-config.d.ts.map +1 -0
- package/dist/src/server/dynamic-config.js +788 -0
- package/dist/src/server/fulfillment.d.ts +5 -0
- package/dist/src/server/fulfillment.d.ts.map +1 -0
- package/dist/src/server/fulfillment.js +47 -0
- package/dist/src/server/guest.d.ts +81 -0
- package/dist/src/server/guest.d.ts.map +1 -0
- package/dist/src/server/guest.js +183 -0
- package/dist/src/server/help-faq-section-defaults.json +92 -0
- package/dist/src/server/help-sections/help-faq.d.ts +11 -0
- package/dist/src/server/help-sections/help-faq.d.ts.map +1 -0
- package/dist/src/server/help-sections/help-faq.js +6 -0
- package/dist/src/server/help-sections/index.d.ts +2 -0
- package/dist/src/server/help-sections/index.d.ts.map +1 -0
- package/dist/src/server/help-sections/index.js +1 -0
- package/dist/src/server/hero-banner-priority.d.ts +31 -0
- package/dist/src/server/hero-banner-priority.d.ts.map +1 -0
- package/dist/src/server/hero-banner-priority.js +26 -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/customer-stories.d.ts +9 -0
- package/dist/src/server/home-sections/customer-stories.d.ts.map +1 -0
- package/dist/src/server/home-sections/customer-stories.js +9 -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 +11 -0
- package/dist/src/server/home-sections/promo-announcements.d.ts.map +1 -0
- package/dist/src/server/home-sections/promo-announcements.js +5 -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 +54 -0
- package/dist/src/server/home.d.ts.map +1 -0
- package/dist/src/server/home.js +1 -0
- package/dist/src/server/homepage-config.types.d.ts +405 -0
- package/dist/src/server/homepage-config.types.d.ts.map +1 -0
- package/dist/src/server/homepage-config.types.js +35 -0
- package/dist/src/server/homepage-section-defaults.d.ts +201 -0
- package/dist/src/server/homepage-section-defaults.d.ts.map +1 -0
- package/dist/src/server/homepage-section-defaults.js +192 -0
- package/dist/src/server/index.d.ts +26 -0
- package/dist/src/server/index.d.ts.map +1 -0
- package/dist/src/server/index.js +25 -0
- package/dist/src/server/locale-actions.d.ts +14 -0
- package/dist/src/server/locale-actions.d.ts.map +1 -0
- package/dist/src/server/locale-actions.js +58 -0
- package/dist/src/server/locales.d.ts +8 -0
- package/dist/src/server/locales.d.ts.map +1 -0
- package/dist/src/server/locales.js +12 -0
- package/dist/src/server/normalize-homepage-config.d.ts +7 -0
- package/dist/src/server/normalize-homepage-config.d.ts.map +1 -0
- package/dist/src/server/normalize-homepage-config.js +281 -0
- package/dist/src/server/notifications.d.ts +2 -0
- package/dist/src/server/notifications.d.ts.map +1 -0
- package/dist/src/server/notifications.js +20 -0
- package/dist/src/server/onboarding.d.ts +2 -0
- package/dist/src/server/onboarding.d.ts.map +1 -0
- package/dist/src/server/onboarding.js +8 -0
- package/dist/src/server/orders.d.ts +63 -0
- package/dist/src/server/orders.d.ts.map +1 -0
- package/dist/src/server/orders.js +230 -0
- package/dist/src/server/page-input.d.ts +25 -0
- package/dist/src/server/page-input.d.ts.map +1 -0
- package/dist/src/server/page-input.js +172 -0
- package/dist/src/server/payment-details.d.ts +5 -0
- package/dist/src/server/payment-details.d.ts.map +1 -0
- package/dist/src/server/payment-details.js +28 -0
- package/dist/src/server/payment.d.ts +3 -0
- package/dist/src/server/payment.d.ts.map +1 -0
- package/dist/src/server/payment.js +13 -0
- package/dist/src/server/pincode.d.ts +7 -0
- package/dist/src/server/pincode.d.ts.map +1 -0
- package/dist/src/server/pincode.js +30 -0
- package/dist/src/server/products.d.ts +54 -0
- package/dist/src/server/products.d.ts.map +1 -0
- package/dist/src/server/products.js +154 -0
- package/dist/src/server/regions.d.ts +5 -0
- package/dist/src/server/regions.d.ts.map +1 -0
- package/dist/src/server/regions.js +57 -0
- package/dist/src/server/returns.d.ts +29 -0
- package/dist/src/server/returns.d.ts.map +1 -0
- package/dist/src/server/returns.js +132 -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/storefront-cms.d.ts +11 -0
- package/dist/src/server/storefront-cms.d.ts.map +1 -0
- package/dist/src/server/storefront-cms.js +24 -0
- package/dist/src/server/swaps.d.ts +15 -0
- package/dist/src/server/swaps.d.ts.map +1 -0
- package/dist/src/server/swaps.js +89 -0
- package/dist/src/server/variants.d.ts +3 -0
- package/dist/src/server/variants.d.ts.map +1 -0
- package/dist/src/server/variants.js +15 -0
- package/dist/src/server/wishlist.d.ts +11 -0
- package/dist/src/server/wishlist.d.ts.map +1 -0
- package/dist/src/server/wishlist.js +49 -0
- package/dist/src/util/get-locale-header.d.ts +4 -0
- package/dist/src/util/get-locale-header.d.ts.map +1 -0
- package/dist/src/util/get-locale-header.js +7 -0
- package/dist/src/util/medusa-error.d.ts +2 -0
- package/dist/src/util/medusa-error.d.ts.map +1 -0
- package/dist/src/util/medusa-error.js +18 -0
- package/dist/src/util/revalidate-cart.d.ts +2 -0
- package/dist/src/util/revalidate-cart.d.ts.map +1 -0
- package/dist/src/util/revalidate-cart.js +8 -0
- package/dist/src/util/sort-products.d.ts +3 -0
- package/dist/src/util/sort-products.d.ts.map +1 -0
- package/dist/src/util/sort-products.js +1 -0
- package/dist/src/util/store-client.d.ts +11 -0
- package/dist/src/util/store-client.d.ts.map +1 -0
- package/dist/src/util/store-client.js +75 -0
- package/package.json +32 -20
- package/src/server/dynamic-config.ts +136 -0
- package/src/server/hero-banner-priority.ts +63 -0
- package/src/server/home-sections/customer-stories.ts +23 -0
- package/src/server/homepage-config.types.ts +18 -0
- package/src/server/homepage-section-defaults.ts +2 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { HttpTypes } from "@medusajs/types";
|
|
2
|
+
export declare const retrieveCustomer: () => Promise<HttpTypes.StoreCustomer | null>;
|
|
3
|
+
export declare const updateCustomer: (body: HttpTypes.StoreUpdateCustomer) => Promise<HttpTypes.StoreCustomer>;
|
|
4
|
+
export declare function signup(_currentState: unknown, formData: FormData): Promise<any>;
|
|
5
|
+
export declare function login(_currentState: string | null, formData: FormData): Promise<string | null>;
|
|
6
|
+
export declare function signout(countryCode: string): Promise<void>;
|
|
7
|
+
export declare function transferCart(token?: string): Promise<void>;
|
|
8
|
+
export declare const addCustomerAddress: (currentState: Record<string, unknown>, formData: FormData) => Promise<any>;
|
|
9
|
+
export declare const deleteCustomerAddress: (addressId: string) => Promise<void>;
|
|
10
|
+
export declare const updateCustomerAddress: (currentState: Record<string, unknown>, formData: FormData) => Promise<any>;
|
|
11
|
+
export declare const setDefaultAddress: (addressId: string) => Promise<{
|
|
12
|
+
success: boolean;
|
|
13
|
+
error: null;
|
|
14
|
+
} | {
|
|
15
|
+
success: boolean;
|
|
16
|
+
error: string;
|
|
17
|
+
}>;
|
|
18
|
+
export declare function initiateGoogleAuth(): Promise<{
|
|
19
|
+
redirectUrl: any;
|
|
20
|
+
error?: undefined;
|
|
21
|
+
} | {
|
|
22
|
+
error: any;
|
|
23
|
+
redirectUrl?: undefined;
|
|
24
|
+
}>;
|
|
25
|
+
export declare function handleGoogleAuthCallback(params: Record<string, string>): Promise<{
|
|
26
|
+
token: string;
|
|
27
|
+
error?: undefined;
|
|
28
|
+
} | {
|
|
29
|
+
error: any;
|
|
30
|
+
token?: undefined;
|
|
31
|
+
}>;
|
|
32
|
+
export declare function handleGoogleCallback(token: string, email?: string, first_name?: string, last_name?: string): Promise<{
|
|
33
|
+
success: boolean;
|
|
34
|
+
error?: undefined;
|
|
35
|
+
} | {
|
|
36
|
+
error: any;
|
|
37
|
+
success?: undefined;
|
|
38
|
+
}>;
|
|
39
|
+
export declare function uploadProfileImage(formData: FormData): Promise<{
|
|
40
|
+
success: boolean;
|
|
41
|
+
imageUrl: string;
|
|
42
|
+
error?: undefined;
|
|
43
|
+
} | {
|
|
44
|
+
error: any;
|
|
45
|
+
success?: undefined;
|
|
46
|
+
imageUrl?: undefined;
|
|
47
|
+
}>;
|
|
48
|
+
//# sourceMappingURL=customer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customer.d.ts","sourceRoot":"","sources":["../../../src/server/customer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AA4C3C,eAAO,MAAM,gBAAgB,QACjB,OAAO,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAkBjD,CAAA;AAED,eAAO,MAAM,cAAc,GAAU,MAAM,SAAS,CAAC,mBAAmB,qCAYvE,CAAA;AAED,wBAAsB,MAAM,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,gBAqCtE;AAED,wBAAsB,KAAK,CACzB,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsExB;AAED,wBAAsB,OAAO,CAAC,WAAW,EAAE,MAAM,iBAqBhD;AAED,wBAAsB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,iBAwChD;AAED,eAAO,MAAM,kBAAkB,GAC7B,cAAc,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,UAAU,QAAQ,KACjB,OAAO,CAAC,GAAG,CAgCb,CAAA;AAED,eAAO,MAAM,qBAAqB,GAChC,WAAW,MAAM,KAChB,OAAO,CAAC,IAAI,CAWd,CAAA;AAED,eAAO,MAAM,qBAAqB,GAChC,cAAc,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,UAAU,QAAQ,KACjB,OAAO,CAAC,GAAG,CAuCb,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAU,WAAW,MAAM;;;;;;EAWxD,CAAA;AAED,wBAAsB,kBAAkB;;;;;;GA8CvC;AAED,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;;;;;;GAsC5E;AAED,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;;;GAmChH;AAED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ;;;;;;;;GAyC1D"}
|
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
import medusaError from "../util/medusa-error";
|
|
3
|
+
import { revalidateTag } from "next/cache";
|
|
4
|
+
import { redirect } from "next/navigation";
|
|
5
|
+
import { cookies } from "next/headers";
|
|
6
|
+
import { getAuthHeaders, getCacheTag, getCartId, removeAuthToken, removeCartId, removeSyncLock, setAuthToken, setCartId, } from "../cookies";
|
|
7
|
+
import { medusaAuthLogin, medusaAuthLogout, medusaAuthRegister, } from "medusa-services/auth";
|
|
8
|
+
import { isAccountDeletionPendingError, medusaCustomerCreate, medusaCustomerCreateAddress, medusaCustomerDeleteAddress, medusaCustomerRetrieve, medusaCustomerUpdate, medusaCustomerUpdateAddress, } from "medusa-services/customer";
|
|
9
|
+
import { medusaCartMerge, medusaCartTransfer } from "medusa-services/cart";
|
|
10
|
+
import { getAuthClientOptions, getMedusaBackendUrl, getStoreClientOptions, } from "../util/store-client";
|
|
11
|
+
import { cache } from "react";
|
|
12
|
+
function throwCustomerError(error) {
|
|
13
|
+
if (error && typeof error === "object" && "response" in error) {
|
|
14
|
+
medusaError(error);
|
|
15
|
+
}
|
|
16
|
+
throw error instanceof Error ? error : new Error(String(error));
|
|
17
|
+
}
|
|
18
|
+
export const retrieveCustomer = cache(async () => {
|
|
19
|
+
const authHeaders = await getAuthHeaders();
|
|
20
|
+
if (!("authorization" in authHeaders))
|
|
21
|
+
return null;
|
|
22
|
+
try {
|
|
23
|
+
const options = await getStoreClientOptions();
|
|
24
|
+
const { customer } = await medusaCustomerRetrieve(options, { fields: "*addresses" });
|
|
25
|
+
return customer;
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
if (isAccountDeletionPendingError(error)) {
|
|
29
|
+
const cookieStore = await cookies();
|
|
30
|
+
const cookieEmail = cookieStore.get("_medusa_customer_email")?.value;
|
|
31
|
+
return { id: "pending_deletion", email: cookieEmail || "pending" };
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
export const updateCustomer = async (body) => {
|
|
37
|
+
try {
|
|
38
|
+
const options = await getStoreClientOptions();
|
|
39
|
+
const { customer } = await medusaCustomerUpdate(body, options);
|
|
40
|
+
const cacheTag = await getCacheTag("customers");
|
|
41
|
+
revalidateTag(cacheTag);
|
|
42
|
+
return customer;
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
throwCustomerError(e);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
export async function signup(_currentState, formData) {
|
|
49
|
+
const password = formData.get("password");
|
|
50
|
+
const customerForm = {
|
|
51
|
+
email: formData.get("email"),
|
|
52
|
+
first_name: formData.get("first_name"),
|
|
53
|
+
last_name: formData.get("last_name"),
|
|
54
|
+
phone: formData.get("phone")?.replace(/[^\d+]/g, ""),
|
|
55
|
+
};
|
|
56
|
+
try {
|
|
57
|
+
const authOptions = await getAuthClientOptions();
|
|
58
|
+
const token = await medusaAuthRegister({ email: customerForm.email, password }, authOptions);
|
|
59
|
+
await setAuthToken(token);
|
|
60
|
+
const options = await getStoreClientOptions();
|
|
61
|
+
const { customer: createdCustomer } = await medusaCustomerCreate(customerForm, options);
|
|
62
|
+
const loginToken = await medusaAuthLogin({ email: customerForm.email, password }, authOptions);
|
|
63
|
+
await setAuthToken(loginToken);
|
|
64
|
+
const customerCacheTag = await getCacheTag("customers");
|
|
65
|
+
revalidateTag(customerCacheTag);
|
|
66
|
+
await transferCart(loginToken);
|
|
67
|
+
return createdCustomer;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
return error.toString();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export async function login(_currentState, formData) {
|
|
74
|
+
let email = formData.get("email_or_phone");
|
|
75
|
+
const password = formData.get("password");
|
|
76
|
+
if (email && !email.includes("@")) {
|
|
77
|
+
email = email.replace(/[^\d+]/g, "");
|
|
78
|
+
}
|
|
79
|
+
let shouldRedirect = false;
|
|
80
|
+
let countryCode = "in";
|
|
81
|
+
try {
|
|
82
|
+
const authOptions = await getAuthClientOptions();
|
|
83
|
+
const token = await medusaAuthLogin({ email_or_phone: email, password }, authOptions);
|
|
84
|
+
await setAuthToken(token);
|
|
85
|
+
const cookieStore = await cookies();
|
|
86
|
+
cookieStore.set("_medusa_customer_email", email, { maxAge: 60 * 60 * 24 * 7, path: "/" });
|
|
87
|
+
try {
|
|
88
|
+
const options = await getStoreClientOptions();
|
|
89
|
+
await medusaCustomerRetrieve({
|
|
90
|
+
...options,
|
|
91
|
+
authorization: `Bearer ${token}`,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
if (isAccountDeletionPendingError(err)) {
|
|
96
|
+
return "ACCOUNT_DELETION_PENDING";
|
|
97
|
+
}
|
|
98
|
+
throw err;
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
await transferCart(token);
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
console.error("Transfer cart failed in login:", e);
|
|
105
|
+
}
|
|
106
|
+
const customerCacheTag = await getCacheTag("customers");
|
|
107
|
+
revalidateTag(customerCacheTag);
|
|
108
|
+
countryCode = formData.get("country_code") || "in";
|
|
109
|
+
shouldRedirect = true;
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
if (isAccountDeletionPendingError(error)) {
|
|
113
|
+
const cookieStore = await cookies();
|
|
114
|
+
cookieStore.set("_medusa_customer_email", email, { maxAge: 60 * 60 * 24 * 7, path: "/" });
|
|
115
|
+
return "ACCOUNT_DELETION_PENDING";
|
|
116
|
+
}
|
|
117
|
+
const errorStr = String(error).toLowerCase();
|
|
118
|
+
if (errorStr.includes("invalid") || errorStr.includes("401") || errorStr.includes("not found")) {
|
|
119
|
+
return "Invalid credentials. Please try again.";
|
|
120
|
+
}
|
|
121
|
+
return error instanceof Error ? error.message : String(error);
|
|
122
|
+
}
|
|
123
|
+
if (shouldRedirect) {
|
|
124
|
+
const redirectUrl = formData.get("redirect_url");
|
|
125
|
+
const hasKeepContext = redirectUrl?.includes("login_context=keep");
|
|
126
|
+
if (redirectUrl && redirectUrl.startsWith("/") && hasKeepContext) {
|
|
127
|
+
redirect(redirectUrl);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
redirect(`/${countryCode}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
export async function signout(countryCode) {
|
|
136
|
+
try {
|
|
137
|
+
const authOptions = await getAuthClientOptions();
|
|
138
|
+
await medusaAuthLogout(authOptions);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// Continue local cleanup even if remote logout fails
|
|
142
|
+
}
|
|
143
|
+
await removeAuthToken();
|
|
144
|
+
await removeCartId();
|
|
145
|
+
await removeSyncLock();
|
|
146
|
+
const customerCacheTag = await getCacheTag("customers");
|
|
147
|
+
revalidateTag(customerCacheTag);
|
|
148
|
+
await removeCartId();
|
|
149
|
+
const cartCacheTag = await getCacheTag("carts");
|
|
150
|
+
revalidateTag(cartCacheTag);
|
|
151
|
+
redirect(`/${countryCode}`);
|
|
152
|
+
}
|
|
153
|
+
export async function transferCart(token) {
|
|
154
|
+
const cartId = await getCartId();
|
|
155
|
+
const options = await getStoreClientOptions();
|
|
156
|
+
const mergeOptions = token
|
|
157
|
+
? { ...options, authorization: `Bearer ${token}` }
|
|
158
|
+
: options;
|
|
159
|
+
console.log("--- TransferCart Debug ---");
|
|
160
|
+
console.log("Token provided:", !!token);
|
|
161
|
+
console.log("Guest Cart ID:", cartId);
|
|
162
|
+
try {
|
|
163
|
+
console.log("Calling merge API (always)...");
|
|
164
|
+
const data = await medusaCartMerge(mergeOptions, cartId ?? undefined);
|
|
165
|
+
if (data) {
|
|
166
|
+
console.log("--- Login Merge Response (JSON) ---");
|
|
167
|
+
console.log(JSON.stringify(data, null, 2));
|
|
168
|
+
console.log("-----------------------------------");
|
|
169
|
+
const activeCartId = data.cart?.id || data.id || data.cart_id;
|
|
170
|
+
if (activeCartId && typeof activeCartId === "string") {
|
|
171
|
+
console.log("Storing Cart ID in cookie:", activeCartId);
|
|
172
|
+
await setCartId(activeCartId);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
console.log("No active cart found for this customer (expected).");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
console.error("Merge API error:", error instanceof Error ? error.message : error);
|
|
181
|
+
if (cartId) {
|
|
182
|
+
await medusaCartTransfer(cartId, mergeOptions).catch(() => { });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
console.log("--------------------------");
|
|
186
|
+
const cartCacheTag = await getCacheTag("carts");
|
|
187
|
+
revalidateTag(cartCacheTag);
|
|
188
|
+
}
|
|
189
|
+
export const addCustomerAddress = async (currentState, formData) => {
|
|
190
|
+
const isDefaultBilling = currentState.isDefaultBilling || false;
|
|
191
|
+
const isDefaultShipping = currentState.isDefaultShipping || false;
|
|
192
|
+
const address = {
|
|
193
|
+
first_name: formData.get("first_name"),
|
|
194
|
+
last_name: formData.get("last_name"),
|
|
195
|
+
company: formData.get("company"),
|
|
196
|
+
address_1: formData.get("address_1"),
|
|
197
|
+
address_2: formData.get("address_2"),
|
|
198
|
+
city: formData.get("city"),
|
|
199
|
+
postal_code: formData.get("postal_code"),
|
|
200
|
+
province: formData.get("province"),
|
|
201
|
+
country_code: formData.get("country_code"),
|
|
202
|
+
phone: formData.get("phone"),
|
|
203
|
+
is_default_billing: isDefaultBilling,
|
|
204
|
+
is_default_shipping: isDefaultShipping,
|
|
205
|
+
metadata: {
|
|
206
|
+
address_type: formData.get("address_type") || "HOME",
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
try {
|
|
210
|
+
const options = await getStoreClientOptions();
|
|
211
|
+
await medusaCustomerCreateAddress(address, options);
|
|
212
|
+
const customerCacheTag = await getCacheTag("customers");
|
|
213
|
+
revalidateTag(customerCacheTag);
|
|
214
|
+
return { success: true, error: null };
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
return { success: false, error: String(err) };
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
export const deleteCustomerAddress = async (addressId) => {
|
|
221
|
+
try {
|
|
222
|
+
const options = await getStoreClientOptions();
|
|
223
|
+
await medusaCustomerDeleteAddress(addressId, options);
|
|
224
|
+
const customerCacheTag = await getCacheTag("customers");
|
|
225
|
+
revalidateTag(customerCacheTag);
|
|
226
|
+
return { success: true, error: null };
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
return { success: false, error: String(err) };
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
export const updateCustomerAddress = async (currentState, formData) => {
|
|
233
|
+
const addressId = currentState.addressId || formData.get("addressId");
|
|
234
|
+
if (!addressId) {
|
|
235
|
+
return { success: false, error: "Address ID is required" };
|
|
236
|
+
}
|
|
237
|
+
const address = {
|
|
238
|
+
first_name: formData.get("first_name"),
|
|
239
|
+
last_name: formData.get("last_name"),
|
|
240
|
+
company: formData.get("company"),
|
|
241
|
+
address_1: formData.get("address_1"),
|
|
242
|
+
address_2: formData.get("address_2"),
|
|
243
|
+
city: formData.get("city"),
|
|
244
|
+
postal_code: formData.get("postal_code"),
|
|
245
|
+
province: formData.get("province"),
|
|
246
|
+
country_code: formData.get("country_code"),
|
|
247
|
+
metadata: {
|
|
248
|
+
address_type: formData.get("address_type") || "HOME",
|
|
249
|
+
},
|
|
250
|
+
};
|
|
251
|
+
const phone = formData.get("phone");
|
|
252
|
+
if (phone) {
|
|
253
|
+
address.phone = phone;
|
|
254
|
+
}
|
|
255
|
+
try {
|
|
256
|
+
const options = await getStoreClientOptions();
|
|
257
|
+
await medusaCustomerUpdateAddress(addressId, address, options);
|
|
258
|
+
const customerCacheTag = await getCacheTag("customers");
|
|
259
|
+
revalidateTag(customerCacheTag);
|
|
260
|
+
return { success: true, error: null };
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
return { success: false, error: String(err) };
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
export const setDefaultAddress = async (addressId) => {
|
|
267
|
+
try {
|
|
268
|
+
const options = await getStoreClientOptions();
|
|
269
|
+
await medusaCustomerUpdateAddress(addressId, { is_default_shipping: true }, options);
|
|
270
|
+
const customerCacheTag = await getCacheTag("customers");
|
|
271
|
+
revalidateTag(customerCacheTag);
|
|
272
|
+
return { success: true, error: null };
|
|
273
|
+
}
|
|
274
|
+
catch (err) {
|
|
275
|
+
return { success: false, error: String(err) };
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
export async function initiateGoogleAuth() {
|
|
279
|
+
try {
|
|
280
|
+
const backendUrl = getMedusaBackendUrl();
|
|
281
|
+
if (!backendUrl) {
|
|
282
|
+
return { error: "Backend URL not configured" };
|
|
283
|
+
}
|
|
284
|
+
const response = await fetch(`${backendUrl}/auth/customer/google`, {
|
|
285
|
+
method: "POST",
|
|
286
|
+
headers: {
|
|
287
|
+
"Content-Type": "application/json",
|
|
288
|
+
},
|
|
289
|
+
cache: "no-store",
|
|
290
|
+
});
|
|
291
|
+
if (!response.ok) {
|
|
292
|
+
return { error: "Google auth failed" };
|
|
293
|
+
}
|
|
294
|
+
const result = await response.json();
|
|
295
|
+
let redirectUrl = typeof result === "string" ? result : result?.location;
|
|
296
|
+
if (!redirectUrl) {
|
|
297
|
+
return { error: "No redirect URL received from Google OAuth" };
|
|
298
|
+
}
|
|
299
|
+
try {
|
|
300
|
+
const url = new URL(redirectUrl);
|
|
301
|
+
const pathParts = url.pathname.split("/").filter(Boolean);
|
|
302
|
+
if (pathParts.length > 0 && /^[a-z]{2,3}$/i.test(pathParts[0])) {
|
|
303
|
+
if (pathParts.length > 1 && pathParts[1] === "auth") {
|
|
304
|
+
pathParts.shift();
|
|
305
|
+
url.pathname = "/" + pathParts.join("/");
|
|
306
|
+
redirectUrl = url.toString();
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
catch (e) {
|
|
311
|
+
// If URL parsing fails, use original redirectUrl
|
|
312
|
+
}
|
|
313
|
+
return { redirectUrl };
|
|
314
|
+
}
|
|
315
|
+
catch (error) {
|
|
316
|
+
return { error: error.message || "Internal server error" };
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
export async function handleGoogleAuthCallback(params) {
|
|
320
|
+
try {
|
|
321
|
+
if (!params.code || !params.state) {
|
|
322
|
+
return { error: "Missing authentication parameters" };
|
|
323
|
+
}
|
|
324
|
+
const backendUrl = getMedusaBackendUrl();
|
|
325
|
+
if (!backendUrl) {
|
|
326
|
+
return { error: "Backend URL not configured" };
|
|
327
|
+
}
|
|
328
|
+
const response = await fetch(`${backendUrl}/auth/customer/google/callback?${new URLSearchParams(params).toString()}`, {
|
|
329
|
+
method: "GET",
|
|
330
|
+
headers: {
|
|
331
|
+
"Content-Type": "application/json",
|
|
332
|
+
},
|
|
333
|
+
cache: "no-store",
|
|
334
|
+
});
|
|
335
|
+
if (!response.ok) {
|
|
336
|
+
return { error: `Authentication failed: ${response.status} - ${response.statusText}` };
|
|
337
|
+
}
|
|
338
|
+
const data = await response.json();
|
|
339
|
+
const token = data.token || data;
|
|
340
|
+
if (!token || typeof token !== "string") {
|
|
341
|
+
return { error: "No token received" };
|
|
342
|
+
}
|
|
343
|
+
return { token };
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
return { error: error.message || "Internal server error" };
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
export async function handleGoogleCallback(token, email, first_name, last_name) {
|
|
350
|
+
try {
|
|
351
|
+
if (!token || typeof token !== "string") {
|
|
352
|
+
return { error: "Token is required" };
|
|
353
|
+
}
|
|
354
|
+
await setAuthToken(token);
|
|
355
|
+
await transferCart(token).catch(() => { });
|
|
356
|
+
if (email && typeof email === "string") {
|
|
357
|
+
const cookieStore = await cookies();
|
|
358
|
+
cookieStore.set("_medusa_customer_email", email, { maxAge: 60 * 60 * 24 * 7, path: "/" });
|
|
359
|
+
const options = await getStoreClientOptions();
|
|
360
|
+
if (options.authorization) {
|
|
361
|
+
try {
|
|
362
|
+
await medusaCustomerCreate({ email, ...(first_name && { first_name }), ...(last_name && { last_name }) }, options);
|
|
363
|
+
}
|
|
364
|
+
catch (err) {
|
|
365
|
+
if (!err.message?.includes("already exists") && !err.message?.includes("duplicate")) {
|
|
366
|
+
// Ignore duplicate customer errors for OAuth sign-in
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
const customerCacheTag = await getCacheTag("customers");
|
|
372
|
+
if (customerCacheTag)
|
|
373
|
+
revalidateTag(customerCacheTag);
|
|
374
|
+
return { success: true };
|
|
375
|
+
}
|
|
376
|
+
catch (error) {
|
|
377
|
+
return { error: error.message || "Internal server error" };
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
export async function uploadProfileImage(formData) {
|
|
381
|
+
try {
|
|
382
|
+
const imageFile = formData.get("image");
|
|
383
|
+
if (!imageFile) {
|
|
384
|
+
return { error: "No image file provided" };
|
|
385
|
+
}
|
|
386
|
+
const uploadFormData = new FormData();
|
|
387
|
+
uploadFormData.append("files", imageFile);
|
|
388
|
+
const { uploadStoreFiles } = await import("medusa-reviews-logic/server");
|
|
389
|
+
const uploadResult = await uploadStoreFiles(uploadFormData);
|
|
390
|
+
if (!uploadResult.success) {
|
|
391
|
+
return { error: uploadResult.error };
|
|
392
|
+
}
|
|
393
|
+
const imageUrl = uploadResult.files?.[0]?.url;
|
|
394
|
+
if (!imageUrl) {
|
|
395
|
+
throw new Error("No image URL returned from server");
|
|
396
|
+
}
|
|
397
|
+
const currentCustomer = await retrieveCustomer();
|
|
398
|
+
const existingMetadata = currentCustomer?.metadata || {};
|
|
399
|
+
const newMetadata = {
|
|
400
|
+
...existingMetadata,
|
|
401
|
+
profile_image_url: imageUrl,
|
|
402
|
+
};
|
|
403
|
+
await updateCustomer({ metadata: newMetadata });
|
|
404
|
+
const customerCacheTag = await getCacheTag("customers");
|
|
405
|
+
if (customerCacheTag) {
|
|
406
|
+
revalidateTag(customerCacheTag);
|
|
407
|
+
}
|
|
408
|
+
return { success: true, imageUrl };
|
|
409
|
+
}
|
|
410
|
+
catch (error) {
|
|
411
|
+
return { error: error.message || "Failed to upload image" };
|
|
412
|
+
}
|
|
413
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import "server-only";
|
|
2
|
+
import { type DefaultHomeSectionId } from "./homepage-section-defaults";
|
|
3
|
+
import type { DynamicConfigResponse, HomepageConfig } from "./homepage-config.types";
|
|
4
|
+
export { DEFAULT_PAGE_INPUT, mergePageInputWithDefaults, resolvePageInput, homepageConfigFromDynamicResponse, simplifiedHomepageConfigFromDynamicResponse, type StorefrontPageInput, } from "./page-input";
|
|
5
|
+
export declare const getDynamicConfig: () => Promise<DynamicConfigResponse | null>;
|
|
6
|
+
export declare function getLogoFromPageInput(pageInput?: HomepageConfig | null): string | null;
|
|
7
|
+
/** Normalized hero slide used by storefront UI (`getHomeBannersFromPageInput`). */
|
|
8
|
+
export type HomepageBanner = {
|
|
9
|
+
image?: string;
|
|
10
|
+
title?: string;
|
|
11
|
+
subtitle?: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
buttonName?: string;
|
|
14
|
+
buttonLink?: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function getHomeBannersFromPageInput(pageInput?: HomepageConfig | null): HomepageBanner[] | null;
|
|
17
|
+
export declare function getAppBannersFromPageInput(pageInput?: HomepageConfig | null): HomepageBanner[] | null;
|
|
18
|
+
export declare function getWebsiteDescriptionFromPageInput(pageInput?: HomepageConfig | null): string | null;
|
|
19
|
+
/** Why choose us — defaults + `sections.whyChooseUs` override. */
|
|
20
|
+
export declare function getFeaturesFromPageInput(pageInput?: HomepageConfig | null): {
|
|
21
|
+
title: string;
|
|
22
|
+
features: Array<{
|
|
23
|
+
name: string;
|
|
24
|
+
icon: string;
|
|
25
|
+
}>;
|
|
26
|
+
};
|
|
27
|
+
/** CMS copy for a homepage section (title, name, text, description, etc.). */
|
|
28
|
+
export type SectionCopy = {
|
|
29
|
+
title: string | null;
|
|
30
|
+
name: string | null;
|
|
31
|
+
text: string | null;
|
|
32
|
+
description: string | null;
|
|
33
|
+
subtitle: string | null;
|
|
34
|
+
eyebrow: string | null;
|
|
35
|
+
/** Layout variant, e.g. new arrivals `grid` | `classic`. */
|
|
36
|
+
variant: string | null;
|
|
37
|
+
layout: string | null;
|
|
38
|
+
};
|
|
39
|
+
export declare function parseSectionCopy(block: unknown): SectionCopy;
|
|
40
|
+
export type HomeSectionCopyId = DefaultHomeSectionId;
|
|
41
|
+
export type HomeSectionsCopy = Record<HomeSectionCopyId, SectionCopy>;
|
|
42
|
+
export { mergeSectionBlock } from "./config-merge";
|
|
43
|
+
export declare function getMergedSectionBlock(id: HomeSectionCopyId, pageInput?: HomepageConfig | null): Record<string, unknown>;
|
|
44
|
+
/**
|
|
45
|
+
* Merged section copy: package defaults + `homepage-config.sections` overrides.
|
|
46
|
+
*/
|
|
47
|
+
export declare function getHomeSectionsCopyFromPageInput(pageInput?: HomepageConfig | null): HomeSectionsCopy;
|
|
48
|
+
export type TrustFeaturesConfig = {
|
|
49
|
+
title: string | null;
|
|
50
|
+
description: string | null;
|
|
51
|
+
features: Array<{
|
|
52
|
+
name: string;
|
|
53
|
+
icon: string;
|
|
54
|
+
}>;
|
|
55
|
+
};
|
|
56
|
+
/** Trust badge row — defaults + `sections.features` override. */
|
|
57
|
+
export declare function getTrustFeaturesFromPageInput(pageInput?: HomepageConfig | null): TrustFeaturesConfig;
|
|
58
|
+
export type ContactInfo = {
|
|
59
|
+
phone?: string;
|
|
60
|
+
email?: string;
|
|
61
|
+
address?: string;
|
|
62
|
+
};
|
|
63
|
+
export declare function getContactInfoFromPageInput(pageInput?: HomepageConfig | null): ContactInfo | null;
|
|
64
|
+
/**
|
|
65
|
+
* Homepage video stories/reviews carousel (`homepage-config.video-stories`).
|
|
66
|
+
*/
|
|
67
|
+
export declare function getVideoStoriesFromPageInput(pageInput?: HomepageConfig | null): {
|
|
68
|
+
title: string;
|
|
69
|
+
videoUrls: string[];
|
|
70
|
+
};
|
|
71
|
+
export type TestimonialItem = {
|
|
72
|
+
id: string;
|
|
73
|
+
text: string;
|
|
74
|
+
name: string;
|
|
75
|
+
rating?: number;
|
|
76
|
+
avatar?: string;
|
|
77
|
+
};
|
|
78
|
+
export declare function getTestimonialsFromPageInput(pageInput?: HomepageConfig | null): {
|
|
79
|
+
title: string;
|
|
80
|
+
subtitle: string | null;
|
|
81
|
+
testimonials: TestimonialItem[];
|
|
82
|
+
};
|
|
83
|
+
export type CustomerStoryItem = {
|
|
84
|
+
id: string;
|
|
85
|
+
image: string;
|
|
86
|
+
text: string;
|
|
87
|
+
name: string;
|
|
88
|
+
rating?: number;
|
|
89
|
+
location?: string;
|
|
90
|
+
};
|
|
91
|
+
export declare function getCustomerStoriesFromPageInput(pageInput?: HomepageConfig | null): {
|
|
92
|
+
title: string;
|
|
93
|
+
eyebrow: string;
|
|
94
|
+
items: CustomerStoryItem[];
|
|
95
|
+
};
|
|
96
|
+
export declare function getSocialLinksFromPageInput(pageInput?: HomepageConfig | null): Array<{
|
|
97
|
+
name: string;
|
|
98
|
+
url: string;
|
|
99
|
+
icon?: string;
|
|
100
|
+
}> | null;
|
|
101
|
+
export type HelpFaqItem = {
|
|
102
|
+
q: string;
|
|
103
|
+
a: string;
|
|
104
|
+
};
|
|
105
|
+
export type HelpFaqCategory = {
|
|
106
|
+
category: string;
|
|
107
|
+
icon?: string;
|
|
108
|
+
color?: string;
|
|
109
|
+
items: HelpFaqItem[];
|
|
110
|
+
};
|
|
111
|
+
export type HelpFaqSectionCopy = {
|
|
112
|
+
eyebrow?: string;
|
|
113
|
+
title?: string;
|
|
114
|
+
titleHighlight?: string;
|
|
115
|
+
subtitle?: string;
|
|
116
|
+
};
|
|
117
|
+
export type HelpFaqConfig = {
|
|
118
|
+
sectionCopy: HelpFaqSectionCopy;
|
|
119
|
+
categories: HelpFaqCategory[];
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* Help page FAQ — `sections.helpFaq` (preferred) with legacy `faq-array` fallback.
|
|
123
|
+
*/
|
|
124
|
+
export declare function getHelpFaqFromPageInput(pageInput?: HomepageConfig | null): HelpFaqConfig;
|
|
125
|
+
/** FAQ categories for the help template (null when empty). */
|
|
126
|
+
export declare function getFaqsFromPageInput(pageInput?: HomepageConfig | null): HelpFaqCategory[] | null;
|
|
127
|
+
export type PromoAnnouncementsConfig = {
|
|
128
|
+
messages: string[];
|
|
129
|
+
icon?: string;
|
|
130
|
+
iconAlt?: string;
|
|
131
|
+
ariaLabel: string;
|
|
132
|
+
separator?: string;
|
|
133
|
+
};
|
|
134
|
+
/** Promo ticker messages + UI copy (icon, aria label, separator). */
|
|
135
|
+
export declare function getPromoAnnouncementsFromPageInput(pageInput?: HomepageConfig | null): PromoAnnouncementsConfig;
|
|
136
|
+
/** @deprecated Use {@link getPromoAnnouncementsFromPageInput}. */
|
|
137
|
+
export declare function getAnnouncementMessagesFromPageInput(pageInput?: HomepageConfig | null): string[];
|
|
138
|
+
export type AboutBrandConfig = {
|
|
139
|
+
eyebrow: string;
|
|
140
|
+
title: string;
|
|
141
|
+
description: string;
|
|
142
|
+
readMoreHref: string;
|
|
143
|
+
stats: Array<{
|
|
144
|
+
label: string;
|
|
145
|
+
value: string;
|
|
146
|
+
}>;
|
|
147
|
+
};
|
|
148
|
+
export declare function getAboutBrandFromPageInput(pageInput?: HomepageConfig | null): AboutBrandConfig;
|
|
149
|
+
export type BrandPillarConfig = {
|
|
150
|
+
title: string;
|
|
151
|
+
description: string;
|
|
152
|
+
image?: string;
|
|
153
|
+
href?: string;
|
|
154
|
+
};
|
|
155
|
+
export declare function getBrandPillarsFromPageInput(pageInput?: HomepageConfig | null): {
|
|
156
|
+
sectionTitle: string;
|
|
157
|
+
pillars: BrandPillarConfig[];
|
|
158
|
+
};
|
|
159
|
+
export type BlogPostConfig = {
|
|
160
|
+
title: string;
|
|
161
|
+
excerpt?: string;
|
|
162
|
+
category?: string;
|
|
163
|
+
date?: string;
|
|
164
|
+
href: string;
|
|
165
|
+
image?: string;
|
|
166
|
+
};
|
|
167
|
+
export declare function getBlogPostsFromPageInput(pageInput?: HomepageConfig | null): BlogPostConfig[];
|
|
168
|
+
/** Promo countdown — defaults + `sections.promoCountdown` override. */
|
|
169
|
+
export declare function getPromoCountdownFromPageInput(pageInput?: HomepageConfig | null): {
|
|
170
|
+
code: string | null;
|
|
171
|
+
message: string | null;
|
|
172
|
+
endAt: string | null;
|
|
173
|
+
active: boolean;
|
|
174
|
+
ctaLabel: string | null;
|
|
175
|
+
ctaHref: string | null;
|
|
176
|
+
};
|
|
177
|
+
export type InstagramPostConfig = {
|
|
178
|
+
id: string;
|
|
179
|
+
image: string;
|
|
180
|
+
url?: string;
|
|
181
|
+
};
|
|
182
|
+
export type InstagramPostsData = {
|
|
183
|
+
title: string;
|
|
184
|
+
handle: string;
|
|
185
|
+
profileUrl: string;
|
|
186
|
+
profileImage?: string;
|
|
187
|
+
posts: InstagramPostConfig[];
|
|
188
|
+
};
|
|
189
|
+
/** Instagram feed — `sections.instagramPosts` + optional social-links fallback. */
|
|
190
|
+
export declare function getInstagramPostsFromPageInput(pageInput?: HomepageConfig | null): InstagramPostsData;
|
|
191
|
+
export { DEFAULT_HOMEPAGE_SECTIONS, type DefaultHomeSectionId, } from "./homepage-section-defaults";
|
|
192
|
+
export type { DynamicConfigResponse, HomepageConfig, HomepageSectionsConfig, HomepageSectionId, HomepageSectionCopyFields, HomepageNewArrivalsSection, } from "./homepage-config.types";
|
|
193
|
+
export { HOMEPAGE_SECTION_IDS } from "./homepage-config.types";
|
|
194
|
+
export declare function getPromoBarFromPageInput(pageInput?: HomepageConfig | null): {
|
|
195
|
+
text: string | null;
|
|
196
|
+
code: string | null;
|
|
197
|
+
value: string | null;
|
|
198
|
+
active: boolean;
|
|
199
|
+
};
|
|
200
|
+
//# sourceMappingURL=dynamic-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-config.d.ts","sourceRoot":"","sources":["../../../src/server/dynamic-config.ts"],"names":[],"mappings":"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"}
|