diff --git a/packages/samples/headless-ssr-commerce/app/(listing)/[category]/page.tsx b/packages/samples/headless-ssr-commerce/app/(listing)/[category]/page.tsx
index 8bdb0be3b9..740a6869fa 100644
--- a/packages/samples/headless-ssr-commerce/app/(listing)/[category]/page.tsx
+++ b/packages/samples/headless-ssr-commerce/app/(listing)/[category]/page.tsx
@@ -1,6 +1,7 @@
import * as externalCartAPI from '@/actions/external-cart-api';
import BreadcrumbManager from '@/components/breadcrumb-manager';
import Cart from '@/components/cart';
+import ContextDropdown from '@/components/context-dropdown';
import FacetGenerator from '@/components/facets/facet-generator';
import Pagination from '@/components/pagination';
import ProductList from '@/components/product-list';
@@ -11,6 +12,7 @@ import StandaloneSearchBox from '@/components/standalone-search-box';
import Summary from '@/components/summary';
import {listingEngineDefinition} from '@/lib/commerce-engine';
import {NextJsNavigatorContext} from '@/lib/navigatorContextProvider';
+import {defaultContext} from '@/utils/context';
import {headers} from 'next/headers';
import {notFound} from 'next/navigation';
@@ -42,9 +44,9 @@ export default async function Listing({params}: {params: {category: string}}) {
controllers: {
cart: {initialState: {items}},
context: {
- language: 'en',
- country: 'US',
- currency: 'USD',
+ language: defaultContext.language,
+ country: defaultContext.country,
+ currency: defaultContext.currency,
view: {
url: `https://sports.barca.group/browse/promotions/${matchedCategory}`,
},
@@ -57,6 +59,7 @@ export default async function Listing({params}: {params: {category: string}}) {
staticState={staticState}
navigatorContext={navigatorContext.marshal}
>
+
diff --git a/packages/samples/headless-ssr-commerce/app/cart/page.tsx b/packages/samples/headless-ssr-commerce/app/cart/page.tsx
index 1a1f9b9bef..9713f817bb 100644
--- a/packages/samples/headless-ssr-commerce/app/cart/page.tsx
+++ b/packages/samples/headless-ssr-commerce/app/cart/page.tsx
@@ -1,8 +1,10 @@
import * as externalCartAPI from '@/actions/external-cart-api';
import Cart from '@/components/cart';
+import ContextDropdown from '@/components/context-dropdown';
import SearchProvider from '@/components/providers/search-provider';
import {searchEngineDefinition} from '@/lib/commerce-engine';
import {NextJsNavigatorContext} from '@/lib/navigatorContextProvider';
+import {defaultContext} from '@/utils/context';
import {headers} from 'next/headers';
export default async function Search() {
@@ -18,9 +20,9 @@ export default async function Search() {
controllers: {
cart: {initialState: {items}},
context: {
- language: 'en',
- country: 'US',
- currency: 'USD',
+ language: defaultContext.language,
+ country: defaultContext.country,
+ currency: defaultContext.currency,
view: {
url: 'https://sports.barca.group/cart',
},
@@ -34,6 +36,7 @@ export default async function Search() {
navigatorContext={navigatorContext.marshal}
>
+
diff --git a/packages/samples/headless-ssr-commerce/app/products/[productId]/page.tsx b/packages/samples/headless-ssr-commerce/app/products/[productId]/page.tsx
index 8750560b60..e968419c12 100644
--- a/packages/samples/headless-ssr-commerce/app/products/[productId]/page.tsx
+++ b/packages/samples/headless-ssr-commerce/app/products/[productId]/page.tsx
@@ -1,7 +1,9 @@
import * as externalCartAPI from '@/actions/external-cart-api';
+import ContextDropdown from '@/components/context-dropdown';
import ProductPage from '@/components/pages/product-page';
import {searchEngineDefinition} from '@/lib/commerce-engine';
import {NextJsNavigatorContext} from '@/lib/navigatorContextProvider';
+import {defaultContext} from '@/utils/context';
import {headers} from 'next/headers';
import {Suspense} from 'react';
@@ -22,9 +24,9 @@ export default async function ProductDescriptionPage({
controllers: {
cart: {initialState: {items}},
context: {
- language: 'en',
- country: 'US',
- currency: 'USD',
+ language: defaultContext.language,
+ country: defaultContext.country,
+ currency: defaultContext.currency,
view: {
url: `https://sports.barca.group/products/${params.productId}`,
},
@@ -34,6 +36,7 @@ export default async function ProductDescriptionPage({
return (
<>
Product description page
+ Loading...}>
+
diff --git a/packages/samples/headless-ssr-commerce/components/context-dropdown.tsx b/packages/samples/headless-ssr-commerce/components/context-dropdown.tsx
new file mode 100644
index 0000000000..121ee41802
--- /dev/null
+++ b/packages/samples/headless-ssr-commerce/components/context-dropdown.tsx
@@ -0,0 +1,62 @@
+'use client';
+
+import {useContext, useEngine} from '@/lib/commerce-engine';
+import {
+ CommerceEngine,
+ ContextOptions,
+ loadProductListingActions,
+ loadSearchActions,
+} from '@coveo/headless-react/ssr-commerce';
+
+// A hardcoded list of storefront associations for switching app context by language, country, and currency.
+// Found in the admin console under "Storefront Associations," this list is static for demonstration purposes.
+// In a real application, these values would likely come from sources like environment variables or an API.
+const storefrontAssociations = [
+ 'en-CA-CAD',
+ 'fr-CA-CAD',
+ 'en-GB-GBP',
+ 'en-US-USD',
+];
+
+export default function ContextDropdown({
+ useCase,
+}: {
+ useCase?: 'listing' | 'search';
+}) {
+ const {state, methods} = useContext();
+ const engine = useEngine();
+
+ return (
+