import NoMessage from "@/components/messages/noMessage";
import useMessageList from "@/hooks/useMessageList";
import useModal from "@/hooks/useModal";
import useObserver from "@/hooks/useObserver";
import { Message } from "@/types/message";
import { useNavigate } from "@tanstack/react-router";
import { useRef } from "react";
 
export default function MessageList() {
  const { modal: linkmodal, openModal, closeModal } = useModal();
  const { data: messages, fetchNextPage, hasNextPage } = useMessageList();
  const bottomRef = useRef(null);
 
  const onIntersect = ([entry]: IntersectionObserverEntry[]) =>
    entry.isIntersecting && hasNextPage && fetchNextPage();
 
  const navigate = useNavigate();
 
  useObserver<Message[]>({
    target: bottomRef,
    onIntersect,
  });
 
  if (!messages.length)
    return (
      <NoMessage
        modal={linkmodal}
        openModal={openModal}
        closeModal={closeModal}
      />
    );
 
  return (
    <div className="relative h-full w-full overflow-hidden">
      <div className="absolute inset-0 h-full overflow-y-auto">
        {messages.map((message: Message, index: number) => (
          <div
            key={index}
            className="flex h-14 w-full items-center gap-4 border-b border-black p-2"
            onClick={() =>
              navigate({
                to: "/messages/$messageId",
                params: { messageId: message.id.toString() },
              })
            }
          >
            <span className="w-3">{index + 1}</span>
            <span className="w-full overflow-hidden text-ellipsis whitespace-nowrap">
              {message.body}
            </span>
          </div>
        ))}
        <div className="h-10" ref={bottomRef}></div>
      </div>
    </div>
  );
}
 

시바 기껏 무한스크롤 만들어 놨더니 안되네

import { createFileRoute, useNavigate } from "@tanstack/react-router";
import { TbMailDown } from "react-icons/tb";
import linkIcon from "@assets/link.png";
import MessageList from "@/components/messages/messageList";
import useModal from "@/hooks/useModal";
import LinkModal from "@/components/modals/linkModal";
import { useRoomStore } from "@/store/useRoomStore";
import { roomSignOut } from "@/api/auth.api";
import { FaChevronLeft, FaChevronRight } from "react-icons/fa6";
 
import useMessageList from "@/hooks/useMessageList";
 
export const Route = createFileRoute("/messages/")({
  component: MessagesComponent,
});
 
function MessagesComponent() {
  const navigate = useNavigate();
  const { modal, openModal, closeModal } = useModal();
  const {
    data: messages,
    fetchNextPage,
    hasNextPage,
    hasPreviousPage,
    fetchPreviousPage,
  } = useMessageList();
 
  const deleteToken = useRoomStore((state) => state.signOut);
 
  async function signOut() {
    await roomSignOut();
    deleteToken();
    navigate({ to: "/" });
  }
 
  return (
    <>
      <div className="relative flex h-full w-full flex-col justify-between">
        <header className="flex h-16 w-full items-center justify-between gap-2 border-y-2 border-black px-2 text-xl">
          <div>
            {hasPreviousPage && (
              <button onClick={() => fetchPreviousPage()}>
                <FaChevronLeft />
              </button>
            )}
          </div>
          <div className="flex gap-2">
            <TbMailDown size={30} color="crimson" />
            받은 메시지
          </div>
          <div>
            {hasNextPage && (
              <button onClick={() => fetchNextPage()}>
                <FaChevronRight />
              </button>
            )}
          </div>
        </header>
        <button
          className="flex h-10 items-center justify-center gap-2 border-b bg-yellow-100 p-2"
          onClick={openModal}
        >
          <img src={linkIcon} alt="link" className="w-5" />
          링크 공유하기
        </button>
        <MessageList messages={messages} />
        <footer className="flex h-10 w-full items-center justify-between border-y-2 border-black text-xl">
          <button className="w-1/3" onClick={() => navigate({ to: ".." })}>

          </button>
          <button className="w-1/3">확인</button>
          <button className="w-1/3" onClick={signOut}>
            나가기
          </button>
        </footer>
      </div>
      <LinkModal openModal={openModal} closeModal={closeModal} modal={modal} />
    </>
  );
}