diff --git a/lib/shared/farcaster/farcaster-api.js b/lib/shared/farcaster/farcaster-api.js --- a/lib/shared/farcaster/farcaster-api.js +++ b/lib/shared/farcaster/farcaster-api.js @@ -14,6 +14,10 @@ } from './farcaster-conversation-types.js'; import type { FarcasterMessage } from './farcaster-messages-types.js'; import { farcasterMessageValidator } from './farcaster-messages-types.js'; +import { + farcasterDCUserValidator, + type FarcasterDCUser, +} from './farcaster-user-types.js'; import { useTunnelbroker } from '../../tunnelbroker/tunnelbroker-context.js'; import { tShapeInexact, @@ -366,6 +370,81 @@ ); } +export type GetFarcasterDirectCastUsersInput = { + +q: string, + +limit?: ?number, + +cursor?: ?string, + +excludeFIDs?: ?$ReadOnlyArray, +}; + +type GetFarcasterDirectCastUsersResultData = { + +users: $ReadOnlyArray, + ... +}; +const getFarcasterDirectCastUsersResultDataValidator: TInterface = + tShapeInexact({ + users: t.list(farcasterDCUserValidator), + }); + +type GetFarcasterDirectCastUsersCursor = { + +cursor?: string, +}; +const getFarcasterDirectCastUsersCursorValidator: TInterface = + tShapeInexact({ + cursor: t.maybe(t.String), + }); + +export type GetFarcasterDirectCastUsersResult = { + +result: GetFarcasterDirectCastUsersResultData, + +next?: GetFarcasterDirectCastUsersCursor, + ... +}; +const getFarcasterDirectCastUsersResultValidator: TInterface = + tShapeInexact({ + result: getFarcasterDirectCastUsersResultDataValidator, + next: t.maybe(getFarcasterDirectCastUsersCursorValidator), + }); + +function useGetFarcasterDirectCastUsers(): ( + input: GetFarcasterDirectCastUsersInput, +) => Promise { + const { sendFarcasterRequest } = useTunnelbroker(); + return React.useCallback( + async (input: GetFarcasterDirectCastUsersInput) => { + const { q, limit, cursor, excludeFIDs } = input; + // vNext doesn't work when cursor is set + let query = { q }; + if (limit) { + query = { ...query, limit }; + } + if (excludeFIDs) { + query = { ...query, excludeFIDs }; + } + if (cursor) { + query = { ...query, cursor }; + } else { + // vNext doesn't work when cursor is set + query = { ...query, vNext: 'true' }; + } + + const params = new URLSearchParams(query); + const response = await sendFarcasterRequest({ + apiVersion: 'v2', + endpoint: 'direct-cast-users', + method: { type: 'GET' }, + payload: params.toString(), + }); + const parsedResult = JSON.parse(response); + const result: GetFarcasterDirectCastUsersResult = assertWithValidator( + parsedResult, + getFarcasterDirectCastUsersResultValidator, + ); + return result; + }, + [sendFarcasterRequest], + ); +} + export { useSendFarcasterTextMessage, useFetchFarcasterMessages, @@ -375,4 +454,5 @@ useUpdateFarcasterSubscription, useStreamFarcasterDirectCastRead, useMarkFarcasterDirectCastUnread, + useGetFarcasterDirectCastUsers, };