import { NextFetchEvent, NextMiddleware } from 'next/server'; import settings from 'settings'; import { PzNextRequest } from '.'; import logger from '../utils/log'; import { basket } from '../data/urls'; import { urlLocaleMatcherRegex } from '../utils'; const resetBasket = async (req: PzNextRequest) => { await fetch(`${settings.commerceUrl}${basket.getBasket}`, { method: 'DELETE', headers: { Cookie: req.headers.get('cookie') || '', 'Content-Type': 'application/json', 'X-CSRFToken': req.cookies.get('csrftoken')?.value ?? '', Referer: settings.commerceUrl } }); }; const withCurrency = (middleware: NextMiddleware) => async (req: PzNextRequest, event: NextFetchEvent) => { const ip = req.headers.get('x-forwarded-for') ?? ''; try { const { currencies, defaultCurrencyCode, defaultLocaleValue } = settings.localization; const locale = req.middlewareParams.rewrites.locale ?? defaultLocaleValue; const url = req.nextUrl.clone(); if (!defaultCurrencyCode) { logger.error('Default currency code is not defined in settings.', { ip }); throw new Error( 'Default currency code is not defined. Use `defaultCurrencyCode` property in `localization` object in `settings.js` file.' ); } const getActiveCurrencyCode = settings.localization.getActiveCurrencyCode ?? (({ req }) => { return ( req.cookies.get('pz-currency')?.value ?? settings.localization.defaultCurrencyCode ); }); let activeCurrency = getActiveCurrencyCode({ req, locale, defaultCurrencyCode }); if (req.cookies.get('pz-set-currency')) { activeCurrency = req.cookies.get('pz-set-currency')?.value; } if ( !activeCurrency || !currencies.find((c) => c.code === activeCurrency) ) { logger.warn( `Currency ${activeCurrency} is not defined in settings. Using default currency ${defaultCurrencyCode} instead.`, { ip } ); activeCurrency = defaultCurrencyCode; } if ( req.cookies.get('pz-currency') && req.cookies.get('pz-currency')?.value !== activeCurrency && url.pathname.match(urlLocaleMatcherRegex) && !url.search.includes('mobile_app=true') && !url.search.includes('page=CreditCardThreeDSecurePage') && !url.search.includes('page=RedirectionPageCompletePage') && settings.resetBasketOnCurrencyChange !== false ) { logger.info('Currency changed. Resetting basket...', { sessionid: req.cookies.get('osessionid')?.value ?? '', oldCurrency: req.cookies.get('pz-currency')?.value, newCurrency: activeCurrency, ip }); resetBasket(req); } req.middlewareParams.rewrites.currency = activeCurrency; } catch (error) { logger.error('withCurrency error', { error, ip }); } return middleware(req, event); }; export default withCurrency;