PopularSection.tsx 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. 'use client';
  2. import type { BroadcastInfo } from '@/types/broadcast';
  3. import BroadcastCard from './BroadcastCard';
  4. import styles from './styles/BroadcastSection.module.scss';
  5. interface PopularSectionProps {
  6. broadcasts: BroadcastInfo[];
  7. isLoading?: boolean;
  8. }
  9. export default function PopularSection({ broadcasts, isLoading = false }: PopularSectionProps) {
  10. return (
  11. <section className={styles['popular-section']}>
  12. <h2 className={styles['section-title']}>🔥 인기 LIVE</h2>
  13. <div className={styles['carousel-container']}>
  14. <div className={styles['carousel-track']}>
  15. {isLoading ? (
  16. // 로딩 스켈레톤 (5개)
  17. Array.from({ length: 5 }).map((_, index) => (
  18. <div key={`skeleton-${index}`} className={styles['skeleton-card']}>
  19. <div className={styles['skeleton-thumbnail']}></div>
  20. <div className={styles['skeleton-info']}>
  21. <div className={styles['skeleton-text']}></div>
  22. <div className={styles['skeleton-text-small']}></div>
  23. </div>
  24. </div>
  25. ))
  26. ) : (
  27. broadcasts.map((broadcast) => (
  28. <BroadcastCard
  29. key={broadcast.id}
  30. broadcast={broadcast}
  31. variant="carousel"
  32. />
  33. ))
  34. )}
  35. </div>
  36. </div>
  37. </section>
  38. );
  39. }