From 75afc352279ecbb41b9e8841877b9dc847159a9d Mon Sep 17 00:00:00 2001 From: Nathan Booker Date: Tue, 21 Jan 2025 22:22:39 -0600 Subject: [PATCH] Add currency form syncs with https://github.com/bigcommerce/catalyst/pull/1912 --- .../soul/primitives/navigation/index.tsx | 84 ++++++++++++++++++- 1 file changed, 82 insertions(+), 2 deletions(-) diff --git a/apps/web/vibes/soul/primitives/navigation/index.tsx b/apps/web/vibes/soul/primitives/navigation/index.tsx index 81de3845f..6a0ddaa07 100644 --- a/apps/web/vibes/soul/primitives/navigation/index.tsx +++ b/apps/web/vibes/soul/primitives/navigation/index.tsx @@ -7,8 +7,6 @@ import * as Popover from '@radix-ui/react-popover'; import { clsx } from 'clsx'; import debounce from 'lodash.debounce'; import { ArrowRight, ChevronDown, Search, SearchIcon, ShoppingBag, User } from 'lucide-react'; -import Link from 'next/link'; -import { usePathname } from 'next/navigation'; import React, { forwardRef, Ref, @@ -29,6 +27,9 @@ import { Logo } from '@/vibes/soul/primitives/logo'; import { Price } from '@/vibes/soul/primitives/price-label'; import { ProductCard } from '@/vibes/soul/primitives/product-card'; +import { Link } from '~/components/link'; +import { usePathname } from '~/i18n/routing'; + interface Link { label: string; href: string; @@ -47,6 +48,11 @@ interface Locale { label: string; } +interface Currency { + id: string; + label: string; +} + type Action = ( state: Awaited, payload: Awaited, @@ -71,6 +77,7 @@ export type SearchResult = }; type LocaleAction = Action; +type CurrencyAction = Action; type SearchAction = Action< { searchResults: S[] | null; @@ -92,6 +99,9 @@ interface Props { locales?: Locale[]; activeLocaleId?: string; localeAction?: LocaleAction; + currencies?: Currency[]; + activeCurrencyId?: string; + currencyAction?: CurrencyAction; logo?: Streamable; logoWidth?: number; logoHeight?: number; @@ -264,6 +274,9 @@ export const Navigation = forwardRef(function Navigation activeLocaleId, localeAction, locales, + currencies, + activeCurrencyId, + currencyAction, searchHref, searchParamName = 'query', searchAction, @@ -560,6 +573,15 @@ export const Navigation = forwardRef(function Navigation locales={locales as [Locale, Locale, ...Locale[]]} /> ) : null} + + {/* Currency Dropdown */} + {currencies && currencies.length > 1 && currencyAction ? ( + + ) : null} @@ -861,3 +883,61 @@ function LocaleForm({ ); } + +function CurrencyForm({ + action, + currencies, + activeCurrencyId, +}: { + activeCurrencyId?: string; + action: CurrencyAction; + currencies: [Currency, ...Currency[]]; +}) { + const [lastResult, formAction] = useActionState(action, null); + const activeCurrency = currencies.find((currency) => currency.id === activeCurrencyId); + + useEffect(() => { + if (lastResult?.error) console.log(lastResult.error); + }, [lastResult?.error]); + + return ( + + + {activeCurrency?.label ?? currencies[0].label} + + + + + {currencies.map((currency) => ( + { + // eslint-disable-next-line @typescript-eslint/require-await + startTransition(async () => { + const formData = new FormData(); + formData.append('id', currency.id); + formAction(formData); + }); + }} + > + {currency.label} + + ))} + + + + ); +}