import { useParams, Link } from 'react-router-dom'; import { useQuery } from '@tanstack/react-query'; import { useEffect } from 'react'; import { motion } from 'framer-motion'; import { Calendar, Clock, ChevronLeft, Link2 } from 'lucide-react'; import { getSchedule, getXProfile } from '../../../api/public/schedules'; import '../../../mobile.css'; // 전체화면 시 자동 가로 회전 훅 (숏츠가 아닐 때만) function useFullscreenOrientation(isShorts) { useEffect(() => { // 숏츠는 세로 유지 if (isShorts) return; const handleFullscreenChange = async () => { const isFullscreen = !!document.fullscreenElement; if (isFullscreen) { // 전체화면 진입 시 가로 모드로 전환 시도 try { if (screen.orientation && screen.orientation.lock) { await screen.orientation.lock('landscape'); } } catch (e) { // 지원하지 않는 브라우저이거나 권한이 없는 경우 무시 } } else { // 전체화면 종료 시 세로 모드로 복귀 try { if (screen.orientation && screen.orientation.unlock) { screen.orientation.unlock(); } } catch (e) { // 무시 } } }; document.addEventListener('fullscreenchange', handleFullscreenChange); document.addEventListener('webkitfullscreenchange', handleFullscreenChange); return () => { document.removeEventListener('fullscreenchange', handleFullscreenChange); document.removeEventListener('webkitfullscreenchange', handleFullscreenChange); }; }, [isShorts]); } // 카테고리 ID 상수 const CATEGORY_ID = { YOUTUBE: 2, X: 3, ALBUM: 4, FANSIGN: 5, CONCERT: 6, TICKET: 7, }; // HTML 엔티티 디코딩 함수 const decodeHtmlEntities = (text) => { if (!text) return ''; const textarea = document.createElement('textarea'); textarea.innerHTML = text; return textarea.value; }; // 유튜브 비디오 ID 추출 const extractYoutubeVideoId = (url) => { if (!url) return null; const shortMatch = url.match(/youtu\.be\/([a-zA-Z0-9_-]{11})/); if (shortMatch) return shortMatch[1]; const watchMatch = url.match(/youtube\.com\/watch\?v=([a-zA-Z0-9_-]{11})/); if (watchMatch) return watchMatch[1]; const shortsMatch = url.match(/youtube\.com\/shorts\/([a-zA-Z0-9_-]{11})/); if (shortsMatch) return shortsMatch[1]; return null; }; // 날짜 포맷팅 const formatFullDate = (dateStr) => { if (!dateStr) return ''; const date = new Date(dateStr); const dayNames = ['일', '월', '화', '수', '목', '금', '토']; return `${date.getFullYear()}. ${date.getMonth() + 1}. ${date.getDate()}. (${dayNames[date.getDay()]})`; }; // 시간 포맷팅 const formatTime = (timeStr) => { if (!timeStr) return null; return timeStr.slice(0, 5); }; // 유튜브 섹션 컴포넌트 function YoutubeSection({ schedule }) { const videoId = extractYoutubeVideoId(schedule.source_url); const isShorts = schedule.source_url?.includes('/shorts/'); // 전체화면 시 가로 회전 (숏츠 제외) useFullscreenOrientation(isShorts); const members = schedule.members || []; const isFullGroup = members.length === 5; if (!videoId) return null; return (
{decodeHtmlEntities(schedule.description)}
)}
요청하신 일정이 존재하지 않거나
삭제되었을 수 있습니다.