LiveSection.tsx 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  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 LiveSectionProps {
  6. broadcasts: BroadcastInfo[];
  7. isLoading?: boolean;
  8. }
  9. export default function LiveSection({ broadcasts, isLoading = false }: LiveSectionProps) {
  10. return (
  11. <section className={styles['live-section']}>
  12. <h2 className={styles['section-title']}>📺 실시간 LIVE</h2>
  13. <div className={styles['video-grid']}>
  14. {isLoading ? (
  15. // 로딩 스켈레톤 (8개)
  16. Array.from({ length: 8 }).map((_, index) => (
  17. <div key={`skeleton-${index}`} className={styles['skeleton-card']}>
  18. <div className={styles['skeleton-thumbnail']}></div>
  19. <div className={styles['skeleton-info']}>
  20. <div className={styles['skeleton-text']}></div>
  21. <div className={styles['skeleton-text-small']}></div>
  22. </div>
  23. </div>
  24. ))
  25. ) : (
  26. broadcasts.map((broadcast) => (
  27. <BroadcastCard
  28. key={broadcast.id}
  29. broadcast={broadcast}
  30. variant="grid"
  31. />
  32. ))
  33. )}
  34. </div>
  35. </section>
  36. );
  37. }