useBroadcastsMock.ts 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. 'use client';
  2. import { useQuery, useInfiniteQuery, UseQueryResult, UseInfiniteQueryResult } from '@tanstack/react-query';
  3. import { BroadcastInfo, BroadcastListResponse } from '@/types/broadcast';
  4. import { liveStreams, getTopPopularStreams } from '@/data/mockBroadcasts';
  5. // 쿼리 키 상수 정의
  6. export const broadcastKeys = {
  7. all: ['broadcasts'] as const,
  8. lists: () => [...broadcastKeys.all, 'list'] as const,
  9. list: (filters: string) => [...broadcastKeys.lists(), filters] as const,
  10. details: () => [...broadcastKeys.all, 'detail'] as const,
  11. detail: (id: string) => [...broadcastKeys.details(), id] as const,
  12. popular: (limit: number) => [...broadcastKeys.all, 'popular', limit] as const,
  13. live: (page: number, limit: number) => [...broadcastKeys.all, 'live', page, limit] as const,
  14. };
  15. // 인기 방송 목록 조회 훅 (더미 데이터)
  16. export function usePopularBroadcasts(limit: number = 5): UseQueryResult<BroadcastInfo[], Error> {
  17. return useQuery({
  18. queryKey: broadcastKeys.popular(limit),
  19. queryFn: async () => {
  20. // 실제 API 호출 시뮬레이션
  21. await new Promise(resolve => setTimeout(resolve, 100));
  22. return getTopPopularStreams(limit);
  23. },
  24. staleTime: 2 * 60 * 1000, // 2분
  25. refetchInterval: 30 * 1000, // 30초마다 갱신
  26. });
  27. }
  28. // 실시간 방송 목록 조회 훅 (더미 데이터)
  29. export function useLiveBroadcasts(limit: number = 20): UseQueryResult<BroadcastInfo[], Error> {
  30. return useQuery({
  31. queryKey: broadcastKeys.live(1, limit),
  32. queryFn: async () => {
  33. // 실제 API 호출 시뮬레이션
  34. await new Promise(resolve => setTimeout(resolve, 150));
  35. return [...liveStreams];
  36. },
  37. staleTime: 1 * 60 * 1000, // 1분
  38. refetchInterval: 15 * 1000, // 15초마다 갱신
  39. });
  40. }
  41. // 방송 상세 정보 조회 훅 (더미 데이터)
  42. export function useBroadcastDetail(broadcastId: string): UseQueryResult<BroadcastInfo | null, Error> {
  43. return useQuery({
  44. queryKey: broadcastKeys.detail(broadcastId),
  45. queryFn: async () => {
  46. // 실제 API 호출 시뮬레이션
  47. await new Promise(resolve => setTimeout(resolve, 100));
  48. const broadcast = liveStreams.find(stream => stream.id === broadcastId);
  49. return broadcast || null;
  50. },
  51. enabled: !!broadcastId,
  52. staleTime: 30 * 1000, // 30초
  53. refetchInterval: 10 * 1000, // 10초마다 갱신 (실시간 정보)
  54. });
  55. }
  56. // 무한스크롤을 위한 실시간 방송 목록 훅
  57. export function useLiveBroadcastsInfinite(limit: number = 20): UseInfiniteQueryResult<{ broadcasts: BroadcastInfo[], hasMore: boolean }, Error> {
  58. return useInfiniteQuery({
  59. queryKey: [...broadcastKeys.live(1, limit), 'infinite'],
  60. queryFn: async ({ pageParam = 1 }) => {
  61. // 실제 API 호출 시뮬레이션
  62. await new Promise(resolve => setTimeout(resolve, 200));
  63. const page = pageParam as number;
  64. const startIndex = (page - 1) * limit;
  65. const endIndex = startIndex + limit;
  66. // 더미 데이터에서 페이지네이션 시뮬레이션
  67. const allBroadcasts = [...liveStreams];
  68. const broadcasts = allBroadcasts.slice(startIndex, endIndex);
  69. const hasMore = endIndex < allBroadcasts.length;
  70. return {
  71. broadcasts,
  72. hasMore
  73. };
  74. },
  75. getNextPageParam: (lastPage, allPages) => {
  76. return lastPage.hasMore ? allPages.length + 1 : undefined;
  77. },
  78. initialPageParam: 1,
  79. staleTime: 1 * 60 * 1000, // 1분
  80. refetchInterval: 15 * 1000, // 15초마다 갱신
  81. });
  82. }