diff --git a/apps/web/package.json b/apps/web/package.json index ac07d6e2..5e5c33ac 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@ddays-app/tsconfig": "*", - "@ddays-app/types": "*", + "@ddays-app/types": "1.0.0", "@types/react": "^18.2.37", "@types/react-dom": "^18.2.15", "@typescript-eslint/eslint-plugin": "^6.10.0", diff --git a/apps/web/src/assets/images/events/schedule/campfire-talks.png b/apps/web/src/assets/images/events/schedule/campfire-talks.png new file mode 100644 index 00000000..d1cd3bdb Binary files /dev/null and b/apps/web/src/assets/images/events/schedule/campfire-talks.png differ diff --git a/apps/web/src/assets/images/events/schedule/pizza-lunch.png b/apps/web/src/assets/images/events/schedule/pizza-lunch.png new file mode 100644 index 00000000..02026793 Binary files /dev/null and b/apps/web/src/assets/images/events/schedule/pizza-lunch.png differ diff --git a/apps/web/src/components/ScheduleSection/ScheduleCard.tsx b/apps/web/src/components/ScheduleSection/ScheduleCard.tsx index 769819f5..408e93d0 100644 --- a/apps/web/src/components/ScheduleSection/ScheduleCard.tsx +++ b/apps/web/src/components/ScheduleSection/ScheduleCard.tsx @@ -4,68 +4,70 @@ import PlusSvg from 'assets/icons/plus-black.svg'; import { useEffect, useState } from 'react'; import { useScreenSize } from '../../hooks/useScreenSize'; +import ScheduleImageCard from './ScheduleImageCard'; import c from './ScheduleSection.module.scss'; import { getEventTime, getEventTypeTranslation, getSpeakerCompanyStringForEvent, + getThemeShort, } from './utils'; -const getThemeShort = (theme: string) => { - switch (theme) { - case 'dev': - return 'DEV'; - case 'design': - return 'DIZ'; - case 'marketing': - return 'MARK'; - case 'tech': - return 'TECH'; - } -}; - type ScheduleCardProps = { event: EventWithSpeakerDto; openCardId: number | null; setOpenCardId: (id: number | null) => void; + lastClickedCardId: React.MutableRefObject; }; const ScheduleCard: React.FC = ({ event, openCardId, setOpenCardId, + lastClickedCardId, }) => { - const [currentImageIndex, setCurrentImageIndex] = useState(0); + const [currentImageIndex, setCurrentImageIndex] = useState(1); + const [isImageShown, setIsImageShown] = useState(false); + + const { isMobile } = useScreenSize(1030); + const isOpenDescription = openCardId === event.id; - const images = event.speakers + const imagesList = event.speakers ?.filter((speaker) => speaker.photo !== null) - .map((speaker) => speaker.photo) || ['']; + .map((speaker) => speaker.photo); + + const images = imagesList?.length === 0 ? [''] : imagesList!; useEffect(() => { const intervalId = setInterval(() => { - setCurrentImageIndex((prev) => (prev + 1) % images.length); + setCurrentImageIndex((prev) => { + const next = (prev + 1) % images!.length; + if (next === 0) return 1; + return next; + }); }, 2000); return () => clearInterval(intervalId); }, []); - const cardAspectRatio = 401 / 320; - const { isMobile } = useScreenSize(930); - - const isOpenDescription = openCardId === event.id; - const [isImageShown, setIsImageShown] = useState(false); - const handleCardClick = () => { + if (!event.description) return; + if (isOpenDescription) { setOpenCardId(null); + lastClickedCardId.current = event.id; } else { setOpenCardId(event.id); + lastClickedCardId.current = -1; } }; const handleHover = () => { - if (!isOpenDescription) { + if (isOpenDescription) { + lastClickedCardId.current = event.id; + } else { setIsImageShown(true); + lastClickedCardId.current = -1; } }; @@ -80,17 +82,49 @@ const ScheduleCard: React.FC = ({ onClick={handleCardClick} className={c.scheduleCardContainer}>
- {(isImageShown || isOpenDescription) && - !isMobile && - images[currentImageIndex] && ( -
- -
- )} + {(isImageShown || isOpenDescription) && !isMobile && ( + <> + {event.type === 'panel' && images[currentImageIndex] && ( + <> + + + + )} + + {event.type !== 'panel' && + images.map((image, index) => { + return ( + + ); + })} + + )} +

@@ -135,7 +169,7 @@ const ScheduleCard: React.FC = ({

- {event.description !== '' && ( + {event.description && (