From a56d8f18701e86a6f882b26139f4194d28e87338 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Fri, 19 Dec 2025 00:40:04 -0800 Subject: [PATCH] add bulk delete mutations for collection items --- src/lib/api/adapters/collection.adapter.ts | 48 +++++++++++++++++++ src/lib/api/mutations/artifact.mutations.ts | 14 ++++++ src/lib/api/mutations/collection.mutations.ts | 43 +++++++++++++++++ 3 files changed, 105 insertions(+) diff --git a/src/lib/api/adapters/collection.adapter.ts b/src/lib/api/adapters/collection.adapter.ts index 2b199482..9501a8da 100644 --- a/src/lib/api/adapters/collection.adapter.ts +++ b/src/lib/api/adapters/collection.adapter.ts @@ -144,6 +144,22 @@ export class CollectionAdapter extends BaseAdapter { }) } + /** + * Removes multiple characters from the collection in a single batch request + */ + async removeCharactersBatch(ids: string[]): Promise<{ deleted: number }> { + if (ids.length === 0) return { deleted: 0 } + + const response = await this.request<{ + meta: { deleted: number } + }>('/collection/characters/batch_destroy', { + method: 'DELETE', + body: { ids } + }) + + return response.meta + } + /** * Gets the IDs of all characters in a user's collection * Useful for filtering out already-owned characters in the add modal @@ -261,6 +277,22 @@ export class CollectionAdapter extends BaseAdapter { }) } + /** + * Removes multiple weapons from the collection in a single batch request + */ + async removeWeaponsBatch(ids: string[]): Promise<{ deleted: number }> { + if (ids.length === 0) return { deleted: 0 } + + const response = await this.request<{ + meta: { deleted: number } + }>('/collection/weapons/batch_destroy', { + method: 'DELETE', + body: { ids } + }) + + return response.meta + } + // ============================================ // Collection Summons // ============================================ @@ -358,6 +390,22 @@ export class CollectionAdapter extends BaseAdapter { }) } + /** + * Removes multiple summons from the collection in a single batch request + */ + async removeSummonsBatch(ids: string[]): Promise<{ deleted: number }> { + if (ids.length === 0) return { deleted: 0 } + + const response = await this.request<{ + meta: { deleted: number } + }>('/collection/summons/batch_destroy', { + method: 'DELETE', + body: { ids } + }) + + return response.meta + } + // ============================================ // Collection Job Accessories // ============================================ diff --git a/src/lib/api/mutations/artifact.mutations.ts b/src/lib/api/mutations/artifact.mutations.ts index 7660cfe3..15e06486 100644 --- a/src/lib/api/mutations/artifact.mutations.ts +++ b/src/lib/api/mutations/artifact.mutations.ts @@ -103,6 +103,20 @@ export function useDeleteCollectionArtifact() { })) } +/** + * Delete multiple collection artifacts in a single batch + */ +export function useBulkDeleteCollectionArtifacts() { + const queryClient = useQueryClient() + + return createMutation(() => ({ + mutationFn: (ids: string[]) => artifactAdapter.deleteCollectionArtifactsBatch(ids), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: artifactKeys.collectionBase }) + } + })) +} + // ============================================================================ // Grid Artifact Mutations (Equipped on Characters) // ============================================================================ diff --git a/src/lib/api/mutations/collection.mutations.ts b/src/lib/api/mutations/collection.mutations.ts index 03b5e9c4..d064fc91 100644 --- a/src/lib/api/mutations/collection.mutations.ts +++ b/src/lib/api/mutations/collection.mutations.ts @@ -129,6 +129,21 @@ export function useRemoveCharacterFromCollection() { })) } +/** + * Remove multiple characters from collection in a single batch + */ +export function useBulkRemoveCharactersFromCollection() { + const queryClient = useQueryClient() + + return createMutation(() => ({ + mutationFn: (ids: string[]) => collectionAdapter.removeCharactersBatch(ids), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: collectionKeys.characters() }) + queryClient.invalidateQueries({ queryKey: collectionKeys.characterIds() }) + } + })) +} + // ============================================================================ // Weapon Mutations // ============================================================================ @@ -191,6 +206,20 @@ export function useRemoveWeaponFromCollection() { })) } +/** + * Remove multiple weapons from collection in a single batch + */ +export function useBulkRemoveWeaponsFromCollection() { + const queryClient = useQueryClient() + + return createMutation(() => ({ + mutationFn: (ids: string[]) => collectionAdapter.removeWeaponsBatch(ids), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: collectionKeys.weapons() }) + } + })) +} + // ============================================================================ // Summon Mutations // ============================================================================ @@ -253,6 +282,20 @@ export function useRemoveSummonFromCollection() { })) } +/** + * Remove multiple summons from collection in a single batch + */ +export function useBulkRemoveSummonsFromCollection() { + const queryClient = useQueryClient() + + return createMutation(() => ({ + mutationFn: (ids: string[]) => collectionAdapter.removeSummonsBatch(ids), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: collectionKeys.summons() }) + } + })) +} + // ============================================================================ // Job Accessory Mutations // ============================================================================