import { ChatBskyConvoDefs, type ChatBskyGroupDisableJoinLink, } from '@atproto/api' import {useMutation, useQueryClient} from '@tanstack/react-query' import {DM_SERVICE_HEADERS} from '#/lib/constants' import {logger} from '#/logger' import {invalidateJoinLinkPreviewsForCode} from '#/state/queries/join-links' import {useAgent} from '#/state/session' import { rollbackConvoOptimistic, updateConvoOptimistic, } from './utils/convo-cache' export function useDisableJoinLink( convoId: string | undefined, { onSuccess, onError, }: { onSuccess?: (data: ChatBskyGroupDisableJoinLink.OutputSchema) => void onError?: (error: Error) => void }, ) { const queryClient = useQueryClient() const agent = useAgent() return useMutation({ mutationFn: async () => { if (!convoId) throw new Error('No convoId provided') const {data} = await agent.chat.bsky.group.disableJoinLink( {convoId}, {headers: DM_SERVICE_HEADERS, encoding: 'application/json'}, ) return data }, onMutate: () => { if (!convoId) return return updateConvoOptimistic(queryClient, convoId, prev => { if (!ChatBskyConvoDefs.isGroupConvo(prev.kind) || !prev.kind.joinLink) { return undefined } return { ...prev, kind: { ...prev.kind, joinLink: {...prev.kind.joinLink, enabledStatus: 'disabled'}, }, } }) }, onSuccess: data => { if (convoId) { updateConvoOptimistic(queryClient, convoId, prev => { if (!ChatBskyConvoDefs.isGroupConvo(prev.kind)) return undefined return { ...prev, kind: {...prev.kind, joinLink: data.joinLink}, } }) } void invalidateJoinLinkPreviewsForCode(queryClient, data.joinLink.code) onSuccess?.(data) }, onError: (e, _variables, context) => { logger.error(e) if (convoId && context) { rollbackConvoOptimistic(queryClient, convoId, context) } onError?.(e) }, }) }