personal fork of bluesky app
bsky.kelinci.net
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}