import { useParams, Link } from 'react-router-dom';
import { useQuery, keepPreviousData } from '@tanstack/react-query';
import { motion } from 'framer-motion';
import { Calendar, ChevronRight } from 'lucide-react';
import { getSchedule } from '@/api';
// 섹션 컴포넌트들
import { YoutubeSection, XSection, DefaultSection, CATEGORY_ID, decodeHtmlEntities } from './sections';
/**
* PC 일정 상세 페이지
*/
function PCScheduleDetail() {
const { id } = useParams();
const {
data: schedule,
isLoading,
error,
} = useQuery({
queryKey: ['schedule', id],
queryFn: () => getSchedule(id),
placeholderData: keepPreviousData,
retry: false,
});
if (isLoading) {
return
;
}
if (error || !schedule) {
return (
{/* 아이콘 */}
{/* 메시지 */}
일정을 찾을 수 없습니다
요청하신 일정이 존재하지 않거나 삭제되었을 수 있습니다.
다른 일정을 확인해 주세요.
{/* 장식 요소 */}
{[...Array(5)].map((_, i) => (
))}
{/* 버튼들 */}
일정 목록
);
}
// 카테고리별 섹션 렌더링
const categoryId = schedule.category?.id;
const renderCategorySection = () => {
switch (categoryId) {
case CATEGORY_ID.YOUTUBE:
return ;
case CATEGORY_ID.X:
return ;
default:
return ;
}
};
const isYoutube = categoryId === CATEGORY_ID.YOUTUBE;
const isX = categoryId === CATEGORY_ID.X;
const hasCustomLayout = isYoutube || isX;
return (
{/* 브레드크럼 네비게이션 */}
일정
{schedule.category?.name}
{decodeHtmlEntities(schedule.title)}
{/* 메인 컨텐츠 */}
{renderCategorySection()}
);
}
export default PCScheduleDetail;