personal fork of bluesky app bsky.kelinci.net
0

Configure Feed

Select the types of activity you want to include in your feed.

social-app-fork / src / state / queries / messages / withdraw-join-group-chat.ts
1.8 kB 59 lines
1import type { ChatBskyGroupWithdrawJoinRequest } from '@atcute/bluesky'; 2import { ok } from '@atcute/client'; 3 4import { useMutation, useQueryClient } from '@tanstack/react-query'; 5 6import { getClients } from '#/state/session'; 7 8import { logger } from '#/logger'; 9 10import { 11 type ConvoRequestListQueryData, 12 optimisticDeleteJoinRequest, 13 RQKEY_ROOT as CONVO_REQUEST_LIST_KEY, 14} from './list-conversation-requests'; 15 16export function useWithdrawJoinGroupChatRequest({ 17 onSuccess, 18 onError, 19}: { 20 onSuccess?: (data: ChatBskyGroupWithdrawJoinRequest.$output) => void; 21 onError?: (error: Error) => void; 22} = {}) { 23 const queryClient = useQueryClient(); 24 const { chat } = getClients(); 25 26 return useMutation({ 27 mutationFn: async ({ convoId }: { convoId: string }) => { 28 if (!chat) { 29 throw new Error('Must be logged in to withdraw a join request'); 30 } 31 if (!convoId) { 32 throw new Error('No convoId provided'); 33 } 34 return await ok(chat.post('chat.bsky.group.withdrawJoinRequest', { input: { convoId } })); 35 }, 36 onMutate: ({ convoId }) => { 37 const prev = queryClient.getQueriesData<ConvoRequestListQueryData>({ 38 queryKey: [CONVO_REQUEST_LIST_KEY], 39 }); 40 queryClient.setQueriesData<ConvoRequestListQueryData>({ queryKey: [CONVO_REQUEST_LIST_KEY] }, (old) => 41 optimisticDeleteJoinRequest(convoId, old), 42 ); 43 return { prev }; 44 }, 45 onSuccess: (data) => { 46 void queryClient.invalidateQueries({ queryKey: [CONVO_REQUEST_LIST_KEY] }); 47 onSuccess?.(data); 48 }, 49 onError: (error, _variables, context) => { 50 logger.error('Failed to withdraw join request', { safeMessage: error }); 51 if (context?.prev) { 52 for (const [key, data] of context.prev) { 53 queryClient.setQueryData(key, data); 54 } 55 } 56 onError?.(error); 57 }, 58 }); 59}