From 8164b02277e30ed392f37a3df672fff199d09d10 Mon Sep 17 00:00:00 2001 From: Paul Dempsey <76729591+paul-daniel-dempsey@users.noreply.github.com> Date: Thu, 30 Jan 2025 12:33:38 +0000 Subject: [PATCH] feat: strongly typed session storage usage --- .../checkout/helpers/sessionStorage.ts | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/support-frontend/assets/pages/[countryGroupId]/checkout/helpers/sessionStorage.ts b/support-frontend/assets/pages/[countryGroupId]/checkout/helpers/sessionStorage.ts index de58f23c2eb..7bcbc0d93a2 100644 --- a/support-frontend/assets/pages/[countryGroupId]/checkout/helpers/sessionStorage.ts +++ b/support-frontend/assets/pages/[countryGroupId]/checkout/helpers/sessionStorage.ts @@ -1,5 +1,15 @@ 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 @@ -8,17 +18,17 @@ import { type InferInput, object, picklist, safeParse, string } from 'valibot'; export 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'; } @@ -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('order', OrderSchema); + return is(OrderSchema, parsedOrder) ? parsedOrder : undefined; } - export function unsetThankYouOrder() { storage.session.remove('thankYouOrder'); }