Skip to content

Commit

Permalink
feat: strongly typed session storage usage
Browse files Browse the repository at this point in the history
  • Loading branch information
paul-daniel-dempsey committed Jan 30, 2025
1 parent 624c2ca commit caaef91
Showing 1 changed file with 25 additions and 20 deletions.
Original file line number Diff line number Diff line change
@@ -1,32 +1,42 @@
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<typeof ReturnAddressSchema>) {
type ReturnAddressSchemaType = InferInput<typeof ReturnAddressSchema>;
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';
}

/**
* 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([
Expand All @@ -39,19 +49,14 @@ export const OrderSchema = object({
]),
status: picklist(['success', 'pending']),
});
export function setThankYouOrder(order: InferInput<typeof OrderSchema>) {
type OrderSchemaType = InferInput<typeof OrderSchema>;
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');
}

0 comments on commit caaef91

Please sign in to comment.