From 0243922ab8179b4a22cc34d0c9a0b9d2a9e2ef64 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 25 Mar 2026 14:12:57 +0200 Subject: [PATCH] query to get convo availability for list --- .../messages/get-convo-availability.ts | 62 ++++++++++++++++++- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/src/state/queries/messages/get-convo-availability.ts b/src/state/queries/messages/get-convo-availability.ts index 2392edb099..31c424fef4 100644 --- a/src/state/queries/messages/get-convo-availability.ts +++ b/src/state/queries/messages/get-convo-availability.ts @@ -1,7 +1,10 @@ -import {useQuery} from '@tanstack/react-query' +import {useMemo} from 'react' +import {useQueries, useQuery} from '@tanstack/react-query' import {DM_SERVICE_HEADERS} from '#/lib/constants' import {useAgent} from '#/state/session' +import {canBeMessaged} from '#/components/dms/util' +import type * as bsky from '#/types/bsky' import {STALE} from '..' const RQKEY_ROOT = 'convo-availability' @@ -18,8 +21,63 @@ export function useGetConvoAvailabilityQuery(did: string) { {headers: DM_SERVICE_HEADERS}, ) - return data + return { + did, + ...data, + } }, staleTime: STALE.INFINITY, }) } + +export enum ConvoAvailability { + CanChat = 'can-chat', + CannotChat = 'cannot-chat', + Pending = 'pending', +} + +export function useGetConvoAvailabilityForList( + profiles: bsky.profile.AnyProfileView[], +) { + const agent = useAgent() + + const unknownProfiles = useMemo(() => { + return profiles.filter(p => !canBeMessaged(p)) + }, [profiles]) + + return useQueries({ + queries: unknownProfiles.map(p => ({ + queryKey: RQKEY(p.did), + queryFn: async () => { + const {data} = await agent.chat.bsky.convo.getConvoAvailability( + {members: [p.did]}, + {headers: DM_SERVICE_HEADERS}, + ) + + return { + did: p.did, + ...data, + } + }, + staleTime: STALE.INFINITY, + })), + combine: results => { + return new Map( + profiles.map(p => { + const index = unknownProfiles.indexOf(p) + // if not in unknownProfiles it passed the canBeMessaged check + // and thus skipped the query completely. + if (index === -1) return [p.did, ConvoAvailability.CanChat] + const result = results[index] + // shouldn't happen + if (!result) return [p.did, ConvoAvailability.CannotChat] + + if (!result.data) return [p.did, ConvoAvailability.Pending] + return result.data.canChat + ? [p.did, ConvoAvailability.CanChat] + : [p.did, ConvoAvailability.CannotChat] + }), + ) + }, + }) +}