import { InfiniteData, UseInfiniteQueryResult } from '@tanstack/react-query' import { useMemo } from 'react' import { ApiCollection, ConversationResource } from '../types' import { ConversationRequestArgs, getConversationsRequestArgs } from '../utils/request/conversation' import { ResponseError } from '../utils/response_error' import { ApiGetQueryOptions, useApiPaginator } from './use_api' export type ConversationPaginationResult = UseInfiniteQueryResult< InfiniteData, unknown>, ResponseError > export type UseConversationsValue = Pick< ConversationPaginationResult, | 'isFetching' | 'isError' | 'isLoading' | 'error' | 'fetchNextPage' | 'hasNextPage' | 'isFetched' | 'isRefetching' > & { conversations: ConversationResource[] refetch: () => Promise } export function useConversations( args?: Partial, opts?: ApiGetQueryOptions ): UseConversationsValue { const requestArgs = getConversationsRequestArgs(args) const { data, ...rest } = useApiPaginator(requestArgs, opts) const conversations = useMemo(() => data.sort(sortByLastMessage), [data]) return { conversations, ...rest } } function sortByLastMessage(a: ConversationResource, b: ConversationResource): number { const dateA = a.lastMessageCreatedAt || a.createdAt const dateB = b.lastMessageCreatedAt || b.createdAt if (a.lastMessageCreatedAt && !b.lastMessageCreatedAt) return 1 if (!a.lastMessageCreatedAt && b.lastMessageCreatedAt) return -1 if (dateB > dateA) return 1 if (dateB < dateA) return -1 return 0 }