| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- '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<BroadcastInfo[], Error> {
- 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<BroadcastInfo[], Error> {
- 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<BroadcastInfo | null, Error> {
- 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초마다 갱신
- });
- }
|