import { useInfiniteQuery, type QueryFunctionContext } from "@tanstack/react-query" import type { Channel, MessageId } from "~/lib/api/types" import ChatMessage from "./chat-message" import MessageBox from "./message-box" import VisibleTrigger from "./visible-trigger" interface ChannelAreaProps { channel: Channel } export default function ChannelArea( { channel }: ChannelAreaProps ) { const channelId = channel.id const fetchMessages = async ({ pageParam }: QueryFunctionContext) => { return await import("~/lib/api/client/channel").then(m => m.default.paginatedMessages(channelId, 50, pageParam as MessageId | undefined)) } const { data, error, fetchNextPage, hasNextPage, isFetching, isFetchingNextPage, isPending, status, } = useInfiniteQuery({ queryKey: ["messages", channelId], initialPageParam: undefined, queryFn: fetchMessages, getNextPageParam: (lastPage) => lastPage.length < 50 ? undefined : lastPage[lastPage.length - 1]?.id, staleTime: Infinity, }) const fetchNextPageVisible = () => { if (!isFetchingNextPage && hasNextPage) fetchNextPage() } let messageArea = null if (isPending) { messageArea =
Loading...
} else { messageArea = <>
{ status === "success" && data.pages.map((page, i) => ( page.map((message) => (
)) ) ) }
} return ( <>
{channel?.name}
{messageArea}
); }