diff --git a/support-frontend/assets/pages/[countryGroupId]/checkout/helpers/sessionStorage.ts b/support-frontend/assets/pages/[countryGroupId]/checkout/helpers/sessionStorage.ts index de58f23c2e..bb652159fa 100644 --- a/support-frontend/assets/pages/[countryGroupId]/checkout/helpers/sessionStorage.ts +++ b/support-frontend/assets/pages/[countryGroupId]/checkout/helpers/sessionStorage.ts @@ -1,24 +1,34 @@ import { storage } from '@guardian/libs'; -import { type InferInput, object, picklist, safeParse, string } from 'valibot'; +import type { InferInput } from 'valibot'; +import { is, object, picklist, safeParse, string } from 'valibot'; + +function fromSessionStorage( + key: string, + schema: typeof OrderSchema | typeof ReturnAddressSchema, +) { + const sessionStorage = storage.session.get(key); + const parsed = safeParse(schema, sessionStorage); + return parsed.success ? parsed.output : undefined; +} /** * The Guardian Ad-Lite Landing Page sets the returnLink in sessionStorage * And the thank-you page reads it. */ -export const ReturnAddressSchema = object({ +const ReturnAddressSchema = object({ link: string(), }); -export function setReturnAddress(link: InferInput) { +type ReturnAddressSchemaType = InferInput; +export function setReturnAddress(link: ReturnAddressSchemaType) { storage.session.set('returnAddress', link); } -export function getReturnAddress() { - const sessionStorageReturnAddress = storage.session.get('returnAddress'); - const parsedReturnAddress = safeParse( +export function getReturnAddress(): string { + const parsedReturnAddress = fromSessionStorage( + 'returnAddress', ReturnAddressSchema, - sessionStorageReturnAddress, ); - return parsedReturnAddress.success - ? parsedReturnAddress.output.link + return is(ReturnAddressSchema, parsedReturnAddress) + ? parsedReturnAddress.link : 'https://www.theguardian.com'; } @@ -26,7 +36,7 @@ export function getReturnAddress() { * The checkout page sets the order in sessionStorage * And the thank-you page reads it. */ -export const OrderSchema = object({ +const OrderSchema = object({ firstName: string(), email: string(), paymentMethod: picklist([ @@ -39,19 +49,14 @@ export const OrderSchema = object({ ]), status: picklist(['success', 'pending']), }); -export function setThankYouOrder(order: InferInput) { +type OrderSchemaType = InferInput; +export function setThankYouOrder(order: OrderSchemaType) { storage.session.set('thankYouOrder', order); } -export function getThankYouOrder() { - const sessionStorageOrder = storage.session.get('thankYouOrder'); - const parsedOrder = safeParse(OrderSchema, sessionStorageOrder); - if (parsedOrder.success) { - return parsedOrder.output; - } else { - return undefined; - } +export function getThankYouOrder(): OrderSchemaType | undefined { + const parsedOrder = fromSessionStorage('thankYouOrder', OrderSchema); + return is(OrderSchema, parsedOrder) ? parsedOrder : undefined; } - export function unsetThankYouOrder() { storage.session.remove('thankYouOrder'); }