diff --git a/apps/pyconkr/src/components/pages/presentation_detail.tsx b/apps/pyconkr/src/components/pages/presentation_detail.tsx index 0e87899..8183a16 100644 --- a/apps/pyconkr/src/components/pages/presentation_detail.tsx +++ b/apps/pyconkr/src/components/pages/presentation_detail.tsx @@ -4,6 +4,7 @@ import { ErrorBoundary, Suspense } from "@suspensive/react"; import { DateTime } from "luxon"; import * as React from "react"; import { Navigate, useParams } from "react-router-dom"; +import * as R from "remeda"; import PyCon2025Logo from "../../assets/pyconkr2025_logo.png"; import { useAppContext } from "../../contexts/app_context"; @@ -37,6 +38,12 @@ const StyledPresentationImage = styled(Common.Components.FallbackImage)(({ theme }, })); +const HeaderTableCell = styled(TableCell)({ + width: "1%", + whiteSpace: "nowrap", + textAlign: "center", +}); + const DescriptionBox = styled(Box)(({ theme }) => ({ width: "100%", padding: theme.spacing(2, 4), @@ -147,7 +154,8 @@ export const PresentationDetailPage: React.FC = ErrorBoundary.with( const descriptionFallback = language === "ko" ? "해당 발표의 설명은 준비 중이에요!" : "Description of the presentation is under preparation!"; const categoriesStr = language === "ko" ? "카테고리" : "Categories"; const speakersStr = language === "ko" ? "발표자" : "Speakers"; - // const slideShowStr = language === "ko" ? "발표 슬라이드" : "Presentation Slideshow"; + const slideShowStr = language === "ko" ? "발표 슬라이드" : "Presentation Slideshow"; + const slideShowLinkStr = language === "ko" ? "링크" : "Link"; const datetimeLabel = language === "ko" ? "발표 시각" : "Presentation Time"; const datetimeSeparator = language === "ko" ? " ~ " : " - "; @@ -203,9 +211,9 @@ export const PresentationDetailPage: React.FC = ErrorBoundary.with( ? Object.entries(scheduleMap).map(([datetime, rooms], index) => ( {index === 0 && ( - + - + )} @@ -222,7 +230,7 @@ export const PresentationDetailPage: React.FC = ErrorBoundary.with( : null} {presentation.categories.length ? ( - } /> + } /> {presentation.categories.map((c) => ( @@ -232,17 +240,16 @@ export const PresentationDetailPage: React.FC = ErrorBoundary.with( ) : null} + {R.isString(presentation.public_slideshow_file) ? ( + + } /> + ({ color: theme.palette.primary.main, textDecoration: "underline" })}> + + + + ) : null} - {/* {presentation.slideshow_url && ( - <> - - {slideShowStr} :  - - - - - )} */} {presentation.image && ( = ({ rowSpan, colSpan, session }) => { - const navigate = useNavigate(); const clickable = R.isArray(session.speakers) && !R.isEmpty(session.speakers); // Firefox는 rowSpan된 td의 height를 계산할 때 rowSpan을 고려하지 않습니다. 따라서 직접 계산하여 height를 설정합니다. const sessionBoxHeight = `${TD_HEIGHT * rowSpan}rem`; @@ -118,18 +117,32 @@ const SessionColumn: React.FC<{ .replace(/(?![.0-9A-Za-zㄱ-ㅣ가-힣-])./g, ""); return ( - clickable && navigate(`/presentations/${session.id}#${urlSafeTitle}`)} - className={clickable ? "clickable" : ""} - sx={{ height: sessionBoxHeight, gap: 0.75, padding: "0.5rem" }} - > - - - {session.speakers.map((speaker) => ( - - ))} - - + {clickable ? ( + + + + + {session.speakers.map((speaker) => ( + + ))} + + + + ) : ( + + + + {session.speakers.map((speaker) => ( + + ))} + + + )} ); }; diff --git a/packages/common/src/schemas/backendAPI.ts b/packages/common/src/schemas/backendAPI.ts index 57ce390..be05f0b 100644 --- a/packages/common/src/schemas/backendAPI.ts +++ b/packages/common/src/schemas/backendAPI.ts @@ -81,6 +81,7 @@ namespace BackendAPISchemas { summary: string | null; description: string; slideshow_url: string | null; + public_slideshow_file: string | null; image: string | null; categories: { id: string;