From 0be98b44ae9c23a42d1bee6281af02a7f0215b51 Mon Sep 17 00:00:00 2001 From: Jorge Moya Date: Tue, 25 Jun 2024 13:21:38 -0500 Subject: [PATCH] feat(core): add store selector page and link in footer --- .changeset/mean-poets-tease.md | 5 ++ .../_components/locale-link.tsx | 60 +++++++++++++++ core/app/[locale]/store-selector/page.tsx | 76 +++++++++++++++++++ core/components/footer/footer.tsx | 16 +++- core/components/footer/locale.tsx | 14 ++++ core/messages/en.json | 4 + 6 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 .changeset/mean-poets-tease.md create mode 100644 core/app/[locale]/store-selector/_components/locale-link.tsx create mode 100644 core/app/[locale]/store-selector/page.tsx create mode 100644 core/components/footer/locale.tsx diff --git a/.changeset/mean-poets-tease.md b/.changeset/mean-poets-tease.md new file mode 100644 index 000000000..bbc176463 --- /dev/null +++ b/.changeset/mean-poets-tease.md @@ -0,0 +1,5 @@ +--- +"@bigcommerce/catalyst-core": patch +--- + +Add store selector page. diff --git a/core/app/[locale]/store-selector/_components/locale-link.tsx b/core/app/[locale]/store-selector/_components/locale-link.tsx new file mode 100644 index 000000000..381270a21 --- /dev/null +++ b/core/app/[locale]/store-selector/_components/locale-link.tsx @@ -0,0 +1,60 @@ +import { Link } from '~/components/link'; +import { LocaleType } from '~/i18n'; +import { cn } from '~/lib/utils'; + +/** + * Custom map of locale to language and region + * Temporary solution until we have a better way to include regions for all locales + */ +const localeLanguageRegionMap = { + da: { language: 'Dansk', region: 'Danmark', flag: 'dk' }, + en: { language: 'English', region: 'United States', flag: 'us' }, + 'es-419': { language: 'Español', region: 'America Latina', flag: '' }, + 'es-AR': { language: 'Español', region: 'Argentina', flag: 'ar' }, + 'es-CL': { language: 'Español', region: 'Chile', flag: 'cl' }, + 'es-CO': { language: 'Español', region: 'Colombia', flag: 'co' }, + 'es-LA': { language: 'Español', region: 'America Latina', flag: '' }, + 'es-MX': { language: 'Español', region: 'México', flag: 'mx' }, + 'es-PE': { language: 'Español', region: 'Perú', flag: 'pe' }, + es: { language: 'Español', region: 'España', flag: 'es' }, + it: { language: 'Italiano', region: 'Italia', flag: 'it' }, + nl: { language: 'Nederlands', region: 'Nederland', flag: 'nl' }, + pl: { language: 'Polski', region: 'Polska', flag: 'pl' }, + pt: { language: 'Português', region: 'Portugal', flag: 'pt' }, + de: { language: 'Deutsch', region: 'Deutschland', flag: 'de' }, + fr: { language: 'Français', region: 'France', flag: 'fr' }, + ja: { language: '日本語', region: '日本', flag: 'jp' }, + no: { language: 'Norsk', region: 'Norge', flag: 'no' }, + 'pt-BR': { language: 'Português', region: 'Brasil', flag: 'br' }, + sv: { language: 'Svenska', region: 'Sverige', flag: 'se' }, +}; + +const getCountryFlagEmoji = (countryCode: string) => { + const codePoints = countryCode + .toUpperCase() + .split('') + .map((char) => 127397 + char.charCodeAt(0)); + + return String.fromCodePoint(...codePoints); +}; + +export const LocaleLink = ({ locale, selected }: { locale: LocaleType; selected: boolean }) => { + return ( + +
+
{getCountryFlagEmoji(localeLanguageRegionMap[locale].flag)}
+
+ {localeLanguageRegionMap[locale].language} + {localeLanguageRegionMap[locale].region} +
+
+ + ); +}; diff --git a/core/app/[locale]/store-selector/page.tsx b/core/app/[locale]/store-selector/page.tsx new file mode 100644 index 000000000..12a7feb0c --- /dev/null +++ b/core/app/[locale]/store-selector/page.tsx @@ -0,0 +1,76 @@ +import { getTranslations, unstable_setRequestLocale } from 'next-intl/server'; + +import { client } from '~/client'; +import { graphql } from '~/client/graphql'; +import { Link } from '~/components/link'; +import { StoreLogo, StoreLogoFragment } from '~/components/store-logo'; +import { NavigationMenu, NavigationMenuLink } from '~/components/ui/navigation-menu'; +import { locales, LocaleType } from '~/i18n'; + +import { LocaleLink } from './_components/locale-link'; + +export const metadata = { + title: 'Location selector', +}; + +const StoreSelectorPageQuery = graphql( + ` + query LocationSelectorPageQuery { + site { + settings { + ...StoreLogoFragment + } + } + } + `, + [StoreLogoFragment], +); + +export default async function StoreSelector({ + params: { locale: selectedLocale }, +}: { + params: { locale: LocaleType }; +}) { + unstable_setRequestLocale(selectedLocale); + + const t = await getTranslations('StoreSelector'); + + const { data } = await client.fetch({ + document: StoreSelectorPageQuery, + }); + + const storeSettings = data.site.settings; + + return ( + <> +
+ + + {storeSettings && ( + + + + )} + + +
+ +
+

{t('heading')}

+

{t('message')}

+ +
+ {locales.map((locale) => ( + + ))} +
+
+ + ); +} + +export function generateStaticParams() { + return locales.map((locale) => ({ locale })); +} + +export const dynamic = 'force-static'; diff --git a/core/components/footer/footer.tsx b/core/components/footer/footer.tsx index fce91581d..90c62db4b 100644 --- a/core/components/footer/footer.tsx +++ b/core/components/footer/footer.tsx @@ -12,6 +12,7 @@ import { CategoryFooterMenuFragment, } from './footer-menus'; import { WebPageFooterMenu, WebPageFooterMenuFragment } from './footer-menus/web-page-footer-menu'; +import { Locale } from './locale'; import { PaymentMethods } from './payment-methods'; import { SocialIcons, SocialIconsFragment } from './social-icons'; @@ -69,10 +70,21 @@ export const Footer = ({ data }: Props) => { - - + + +
+ + {data.settings && } +
+
+ + {data.settings && } +
+ + +
); diff --git a/core/components/footer/locale.tsx b/core/components/footer/locale.tsx new file mode 100644 index 000000000..790535858 --- /dev/null +++ b/core/components/footer/locale.tsx @@ -0,0 +1,14 @@ +import { Globe } from 'lucide-react'; +import { getLocale } from 'next-intl/server'; + +import { Link } from '../link'; + +export const Locale = async () => { + const locale = await getLocale(); + + return ( + + {locale.toUpperCase()} + + ); +}; diff --git a/core/messages/en.json b/core/messages/en.json index 252bb3fd9..15764a0c9 100644 --- a/core/messages/en.json +++ b/core/messages/en.json @@ -396,5 +396,9 @@ "processing": "Processing...", "addedProductQuantity": "{cartItems, plural, =1 {1 Item} other {# Items}} added to your cart", "errorAddingProductToCart": "Error adding product to cart. Please try again." + }, + "StoreSelector": { + "heading": "Store selector", + "message": "Select your preferred language and delivery location" } }