From e64829410b54120dbf81fd0ec487a8b57a4b2d52 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 6 Nov 2024 16:04:35 +0530 Subject: [PATCH] z --- web/packages/new/photos/services/family.ts | 46 ++++++++++++++++------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/web/packages/new/photos/services/family.ts b/web/packages/new/photos/services/family.ts index ffe79aa0eb..f5f0e5a6a5 100644 --- a/web/packages/new/photos/services/family.ts +++ b/web/packages/new/photos/services/family.ts @@ -1,25 +1,47 @@ import { authenticatedRequestHeaders, ensureOk } from "@/base/http"; import log from "@/base/log"; import { apiURL } from "@/base/origins"; +import { nullToUndefined } from "@/utils/transform"; import { LS_KEYS, getData, removeData, } from "@ente/shared/storage/localStorage"; import type { User } from "@ente/shared/user/types"; +import { z } from "zod"; -export interface FamilyMember { - email: string; - usage: number; - id: string; - isAdmin: boolean; -} +const FamilyMember = z.object({ + /** + * Email address of the family member. + */ + email: z.string(), + /** + * Storage used by the family member. + * + * This field will not be present for invited members until they accept. + */ + usage: z.number().nullable().transform(nullToUndefined), + /** + * `true` if this is the admin. + * + * This field will not be sent for invited members until they accept. + */ + isAdmin: z.boolean().nullable().transform(nullToUndefined), +}); -export interface FamilyData { - storage: number; - expiry: number; - members: FamilyMember[]; -} +type FamilyMember = z.infer; + +const FamilyData = z.object({ + members: z.array(FamilyMember), + /** + * Family admin subscription storage capacity. + * + * This excludes add-on and any other bonus storage. + */ + storage: z.number(), +}); + +export type FamilyData = z.infer; export function getLocalFamilyData(): FamilyData { // eslint-disable-next-line @typescript-eslint/no-unsafe-return @@ -62,7 +84,7 @@ export function getFamilyPlanAdmin(familyData: FamilyData): FamilyMember { export function getTotalFamilyUsage(familyData: FamilyData): number { return familyData.members.reduce( - (sum, currentMember) => sum + currentMember.usage, + (sum, currentMember) => sum + (currentMember.usage ?? 0), 0, ); }