'use client'; import { useQuery, useInfiniteQuery, UseQueryResult, UseInfiniteQueryResult } from '@tanstack/react-query'; import { BroadcastInfo, BroadcastListResponse } from '@/types/broadcast'; import { liveStreams, getTopPopularStreams } from '@/data/mockBroadcasts'; // 쿼리 키 상수 정의 export const broadcastKeys = { all: ['broadcasts'] as const, lists: () => [...broadcastKeys.all, 'list'] as const, list: (filters: string) => [...broadcastKeys.lists(), filters] as const, details: () => [...broadcastKeys.all, 'detail'] as const, detail: (id: string) => [...broadcastKeys.details(), id] as const, popular: (limit: number) => [...broadcastKeys.all, 'popular', limit] as const, live: (page: number, limit: number) => [...broadcastKeys.all, 'live', page, limit] as const, }; // 인기 방송 목록 조회 훅 (더미 데이터) export function usePopularBroadcasts(limit: number = 5): UseQueryResult { return useQuery({ queryKey: broadcastKeys.popular(limit), queryFn: async () => { // 실제 API 호출 시뮬레이션 await new Promise(resolve => setTimeout(resolve, 100)); return getTopPopularStreams(limit); }, staleTime: 2 * 60 * 1000, // 2분 refetchInterval: 30 * 1000, // 30초마다 갱신 }); } // 실시간 방송 목록 조회 훅 (더미 데이터) export function useLiveBroadcasts(limit: number = 20): UseQueryResult { return useQuery({ queryKey: broadcastKeys.live(1, limit), queryFn: async () => { // 실제 API 호출 시뮬레이션 await new Promise(resolve => setTimeout(resolve, 150)); return [...liveStreams]; }, staleTime: 1 * 60 * 1000, // 1분 refetchInterval: 15 * 1000, // 15초마다 갱신 }); } // 방송 상세 정보 조회 훅 (더미 데이터) export function useBroadcastDetail(broadcastId: string): UseQueryResult { return useQuery({ queryKey: broadcastKeys.detail(broadcastId), queryFn: async () => { // 실제 API 호출 시뮬레이션 await new Promise(resolve => setTimeout(resolve, 100)); const broadcast = liveStreams.find(stream => stream.id === broadcastId); return broadcast || null; }, enabled: !!broadcastId, staleTime: 30 * 1000, // 30초 refetchInterval: 10 * 1000, // 10초마다 갱신 (실시간 정보) }); } // 무한스크롤을 위한 실시간 방송 목록 훅 export function useLiveBroadcastsInfinite(limit: number = 20): UseInfiniteQueryResult<{ broadcasts: BroadcastInfo[], hasMore: boolean }, Error> { return useInfiniteQuery({ queryKey: [...broadcastKeys.live(1, limit), 'infinite'], queryFn: async ({ pageParam = 1 }) => { // 실제 API 호출 시뮬레이션 await new Promise(resolve => setTimeout(resolve, 200)); const page = pageParam as number; const startIndex = (page - 1) * limit; const endIndex = startIndex + limit; // 더미 데이터에서 페이지네이션 시뮬레이션 const allBroadcasts = [...liveStreams]; const broadcasts = allBroadcasts.slice(startIndex, endIndex); const hasMore = endIndex < allBroadcasts.length; return { broadcasts, hasMore }; }, getNextPageParam: (lastPage, allPages) => { return lastPage.hasMore ? allPages.length + 1 : undefined; }, initialPageParam: 1, staleTime: 1 * 60 * 1000, // 1분 refetchInterval: 15 * 1000, // 15초마다 갱신 }); }