add party share mutations and crew shared parties query

This commit is contained in:
Justin Edmund 2026-01-05 00:37:18 -08:00
parent 272c1dfa4e
commit 7ede296826
2 changed files with 93 additions and 1 deletions

View file

@ -15,6 +15,7 @@ import {
} from '$lib/api/adapters/party.adapter'
import { partyKeys } from '$lib/api/queries/party.queries'
import { userKeys } from '$lib/api/queries/user.queries'
import { crewKeys } from '$lib/api/queries/crew.queries'
import type { Party } from '$lib/types/api/party'
/**
@ -312,3 +313,69 @@ export function useRegeneratePreview() {
}
}))
}
/**
* Share party with crew mutation
*
* Shares a party with the current user's crew.
*
* @example
* ```svelte
* <script lang="ts">
* import { useSharePartyWithCrew } from '$lib/api/mutations/party.mutations'
*
* const shareParty = useSharePartyWithCrew()
*
* function handleShare(partyId: string, shortcode: string) {
* shareParty.mutate({ partyId, shortcode })
* }
* </script>
* ```
*/
export function useSharePartyWithCrew() {
const queryClient = useQueryClient()
return createMutation(() => ({
mutationFn: ({ partyId }: { partyId: string; shortcode: string }) =>
partyAdapter.shareWithCrew(partyId),
onSuccess: (_share, { shortcode }) => {
// Invalidate the party to refresh its shares
queryClient.invalidateQueries({ queryKey: partyKeys.detail(shortcode) })
// Invalidate crew's shared parties list
queryClient.invalidateQueries({ queryKey: crewKeys.sharedParties() })
}
}))
}
/**
* Remove party share mutation
*
* Removes a share from a party.
*
* @example
* ```svelte
* <script lang="ts">
* import { useRemovePartyShare } from '$lib/api/mutations/party.mutations'
*
* const removeShare = useRemovePartyShare()
*
* function handleRemoveShare(partyId: string, shareId: string, shortcode: string) {
* removeShare.mutate({ partyId, shareId, shortcode })
* }
* </script>
* ```
*/
export function useRemovePartyShare() {
const queryClient = useQueryClient()
return createMutation(() => ({
mutationFn: ({ partyId, shareId }: { partyId: string; shareId: string; shortcode: string }) =>
partyAdapter.removeShare(partyId, shareId),
onSuccess: (_data, { shortcode }) => {
// Invalidate the party to refresh its shares
queryClient.invalidateQueries({ queryKey: partyKeys.detail(shortcode) })
// Invalidate crew's shared parties list
queryClient.invalidateQueries({ queryKey: crewKeys.sharedParties() })
}
}))
}

View file

@ -7,7 +7,7 @@
* @module api/queries/crew
*/
import { queryOptions } from '@tanstack/svelte-query'
import { queryOptions, infiniteQueryOptions } from '@tanstack/svelte-query'
import { crewAdapter } from '$lib/api/adapters/crew.adapter'
import type { MemberFilter } from '$lib/types/api/crew'
@ -96,6 +96,30 @@ export const crewQueries = {
queryFn: () => crewAdapter.getPendingPhantomClaims(),
staleTime: 1000 * 60 * 2, // 2 minutes
gcTime: 1000 * 60 * 15 // 15 minutes
}),
/**
* Parties shared with the crew query options
* Uses infinite query for pagination
*/
sharedParties: () =>
infiniteQueryOptions({
queryKey: ['crew', 'shared_parties'] as const,
queryFn: async ({ pageParam }) => {
const response = await crewAdapter.getSharedParties(pageParam)
return {
parties: response.parties,
page: response.meta.page,
totalPages: response.meta.totalPages,
total: response.meta.count,
perPage: response.meta.perPage
}
},
initialPageParam: 1,
getNextPageParam: (lastPage) =>
lastPage.page < lastPage.totalPages ? lastPage.page + 1 : undefined,
staleTime: 1000 * 60 * 2, // 2 minutes
gcTime: 1000 * 60 * 15 // 15 minutes
})
}
@ -122,6 +146,7 @@ export const crewKeys = {
membersAll: () => [...crewKeys.all, 'members'] as const,
members: (filter: MemberFilter) => [...crewKeys.all, 'members', filter] as const,
crewInvitations: (crewId: string) => [...crewKeys.all, crewId, 'invitations'] as const,
sharedParties: () => [...crewKeys.all, 'shared_parties'] as const,
invitations: {
all: ['invitations'] as const,
pending: () => ['invitations', 'pending'] as const