From 916a6f52cd49c85bb85fca4d70076064cd6d6f76 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Fri, 19 Dec 2025 15:42:46 -0800 Subject: [PATCH] add collection counts query for nav tab totals --- src/lib/api/adapters/collection.adapter.ts | 16 +++++++++++++++- src/lib/api/queries/collection.queries.ts | 20 +++++++++++++++++++- src/lib/types/api/collection.ts | 10 ++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/lib/api/adapters/collection.adapter.ts b/src/lib/api/adapters/collection.adapter.ts index 9501a8da..2c7650d9 100644 --- a/src/lib/api/adapters/collection.adapter.ts +++ b/src/lib/api/adapters/collection.adapter.ts @@ -19,7 +19,8 @@ import type { CollectionWeaponInput, CollectionSummonInput, CollectionJobAccessoryInput, - CollectionFilters + CollectionFilters, + CollectionCounts } from '$lib/types/api/collection' /** @@ -51,6 +52,19 @@ export class CollectionAdapter extends BaseAdapter { super(options) } + // ============================================ + // Collection Counts + // ============================================ + + /** + * Gets the total counts for all collection entity types + */ + async getCounts(userId: string): Promise { + return this.request(`/users/${userId}/collection/counts`, { + method: 'GET' + }) + } + // ============================================ // Collection Characters // ============================================ diff --git a/src/lib/api/queries/collection.queries.ts b/src/lib/api/queries/collection.queries.ts index dd1e38c5..bfad7499 100644 --- a/src/lib/api/queries/collection.queries.ts +++ b/src/lib/api/queries/collection.queries.ts @@ -13,7 +13,8 @@ import type { CollectionCharacter, CollectionWeapon, CollectionSummon, - CollectionFilters + CollectionFilters, + CollectionCounts } from '$lib/types/api/collection' /** @@ -51,6 +52,22 @@ export interface CollectionInitialData { * ``` */ export const collectionQueries = { + /** + * Get counts for all collection entity types + * Used to display totals in the navigation tabs + * + * @param userId - The user whose collection to fetch counts for + * @param enabled - Whether the query is enabled (default: true) + */ + counts: (userId: string, enabled: boolean = true) => + queryOptions({ + queryKey: ['collection', 'counts', userId] as const, + queryFn: () => collectionAdapter.getCounts(userId), + enabled: !!userId && enabled, + staleTime: 1000 * 60 * 5, // 5 minutes + gcTime: 1000 * 60 * 30 // 30 minutes + }), + /** * User's collection characters with infinite scroll * Works for any user - privacy is enforced server-side @@ -227,6 +244,7 @@ export const collectionQueries = { */ export const collectionKeys = { all: ['collection'] as const, + counts: (userId: string) => [...collectionKeys.all, 'counts', userId] as const, characters: (userId?: string) => userId ? ([...collectionKeys.all, 'characters', userId] as const) diff --git a/src/lib/types/api/collection.ts b/src/lib/types/api/collection.ts index d5a28daa..9613ad58 100644 --- a/src/lib/types/api/collection.ts +++ b/src/lib/types/api/collection.ts @@ -178,3 +178,13 @@ export enum CollectionPrivacy { CrewOnly = 1, Private = 2 } + +/** + * Collection counts response + */ +export interface CollectionCounts { + characters: number + weapons: number + summons: number + artifacts: number +}