From 0e727db7c8cc1d352e1892048eb5500ebb237c7e Mon Sep 17 00:00:00 2001 From: LeeCh0129 Date: Sun, 22 Jun 2025 05:35:34 +0900 Subject: [PATCH 1/9] =?UTF-8?q?=E2=9C=A8=20feat:=20=EC=82=AC=EC=9D=B4?= =?UTF-8?q?=EB=93=9C=EB=B0=94=20=EB=8C=80=EC=8B=9C=EB=B3=B4=EB=93=9C=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EB=AC=B4=ED=95=9C=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A1=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/common/sidebar/Sidebar.tsx | 94 +++++++++++++++---- .../hooks/useContainerInfiniteScroll.ts | 47 ++++++++++ src/app/shared/hooks/useDashboardInfinite.ts | 46 +++++++++ 3 files changed, 168 insertions(+), 19 deletions(-) create mode 100644 src/app/shared/hooks/useContainerInfiniteScroll.ts create mode 100644 src/app/shared/hooks/useDashboardInfinite.ts diff --git a/src/app/shared/components/common/sidebar/Sidebar.tsx b/src/app/shared/components/common/sidebar/Sidebar.tsx index 00737f3..acccb77 100644 --- a/src/app/shared/components/common/sidebar/Sidebar.tsx +++ b/src/app/shared/components/common/sidebar/Sidebar.tsx @@ -1,13 +1,14 @@ -// components/common/sidebar/Sidebar.tsx 'use client' -import { useDashboard } from '@hooks/useDashboard' +import { useContainerInfiniteScroll } from '@hooks/useContainerInfiniteScroll' import { useModalStore } from '@store/useModalStore' import { useSelectedDashboardStore } from '@store/useSelectedDashboardStore' import Image from 'next/image' import Link from 'next/link' import { usePathname, useRouter } from 'next/navigation' +import { useMemo } from 'react' +import { useDashboardsInfinite } from '@/app/shared/hooks/useDashboardInfinite' import { Dashboard } from '@/types/dashboard' import CreateDashboardButton from './CreateDashboardButton' @@ -17,22 +18,43 @@ export default function Sidebar(): JSX.Element { const pathname = usePathname() const router = useRouter() const { openModal } = useModalStore() - const { data: dashboards = [], isLoading, error } = useDashboard() const { setSelectedDashboard } = useSelectedDashboardStore() + // 무한스크롤 데이터 관리 + const { + data, + isLoading, + error, + fetchNextPage, + hasNextPage, + isFetchingNextPage, + } = useDashboardsInfinite(25) + + // 컨테이너 스크롤 감지 + const containerRef = useContainerInfiniteScroll( + fetchNextPage, + hasNextPage, + isFetchingNextPage, + ) + + // 모든 대시보드 데이터 병합 + const allDashboards = useMemo(() => { + return data?.pages.flatMap((page) => page.dashboards) || [] + }, [data]) + const handleDashboardClick = (dashboard: Dashboard) => { - setSelectedDashboard(dashboard) // 선택한 대시보드를 전역 상태에 저장 + setSelectedDashboard(dashboard) router.push(`/dashboard/${dashboard.id}`) } - // 에러 타입 타입 불일치(jsx로 렌더링할 수 없음) 방지를 위한 string 처리 + // 에러 타입 처리 const errorMessage = error instanceof Error ? error.message : '대시보드 목록 불러오기 실패' return ( -