From 5338c94aa03a173bc4eb17e792002b7a1f672113 Mon Sep 17 00:00:00 2001 From: Zhakhangir Anuarbek Date: Tue, 26 Aug 2025 22:05:44 +0500 Subject: [PATCH] feat: enhance Scheme component to handle schedule data and improve venue/date selection --- src/components/Scheme.tsx | 113 ++++++++++++++++++++++++++------------ src/pages/preview.tsx | 50 ++++++++++++++++- 2 files changed, 126 insertions(+), 37 deletions(-) diff --git a/src/components/Scheme.tsx b/src/components/Scheme.tsx index 510804d..3a6b906 100644 --- a/src/components/Scheme.tsx +++ b/src/components/Scheme.tsx @@ -1,7 +1,19 @@ /* eslint-disable @next/next/no-img-element */ import { fluxgore, gothampro } from "@/utils/fonts"; import Button from "./Button"; -import { ReactNode, useState } from "react"; +import { ReactNode, useState, useMemo } from "react"; + +interface ScheduleData { + date: string; + location: string; + start: string; + stop: string; + activity: string; +} + +interface SchemeProps { + scheduleData?: ScheduleData[]; +} interface SchemeSelectProps { children: ReactNode; @@ -16,7 +28,8 @@ function SchemeSelect({ }: SchemeSelectProps) { const baseClasses = `${fluxgore.className} leading-none cursor-pointer transition-all duration-300 ease-in-out hover:opacity-80 transform hover:scale-105 uppercase`; const activeClasses = "text-[#1E1E1E] text-2xl md:text-4xl"; - const inactiveClasses = "text-[#0D0D0D] text-base md:text-xl opacity-50 self-end"; + const inactiveClasses = + "text-[#0D0D0D] text-base md:text-xl opacity-50 self-end"; return (

{ + const dates = [...new Set(scheduleData.map((item) => item.date))]; + const venues = [ + ...new Set(scheduleData.map((item) => item.location.toLowerCase())), + ]; - const venues = [ - { name: "главная площадка" }, - { name: "мотокросс" }, - { name: "картинг" }, - { name: "Детская площадка" }, - { name: "выставка" }, - { name: "мфт" }, + return { + uniqueDates: dates, + uniqueVenues: venues.length > 0 ? venues : ["главная площадка"], + }; + }, [scheduleData]); + + const [activeVenue, setActiveVenue] = useState( + uniqueVenues[0] || "главная площадка" + ); + const [activeDate, setActiveDate] = useState(uniqueDates[0] || "5 сентября"); + + // Filter schedule items based on active venue and date + const filteredSchedule = useMemo(() => { + return scheduleData.filter( + (item) => + item.location.toLowerCase() === activeVenue && item.date === activeDate + ); + }, [scheduleData, activeVenue, activeDate]); + + // Fallback data if no schedule provided + const fallbackSchedule = [ + { start: "10:00", stop: "10:30", activity: "Открытие фестиваля" }, + { start: "10:30", stop: "11:00", activity: "Приветственная речь" }, + { start: "11:00", stop: "12:00", activity: "Основная программа" }, ]; + const displaySchedule = + filteredSchedule.length > 0 + ? filteredSchedule.map((item) => ({ + time: `${item.start}-${item.stop}`, + title: item.activity, + })) + : fallbackSchedule.map((item) => ({ + time: `${item.start}-${item.stop}`, + title: item.activity, + })); + return (

@@ -85,41 +131,38 @@ function Scheme() { className="mt-10 md:mt-20 w-full h-auto" /> + {/* Date Selection */}
- - - + {uniqueDates.map((date) => ( + + ))}
+ {/* Venue Selection */}
- {venues.map((venue) => ( + {uniqueVenues.map((venue) => ( setActiveVenue(venue.name)} + key={venue} + active={venue === activeVenue} + onClick={() => setActiveVenue(venue)} > - {venue.name} + {venue} ))}
+ {/* Schedule Display */}
- - - - - - - - - - + {displaySchedule.map((item, index) => ( + + ))}
diff --git a/src/pages/preview.tsx b/src/pages/preview.tsx index ecc46bf..bbf778e 100644 --- a/src/pages/preview.tsx +++ b/src/pages/preview.tsx @@ -10,11 +10,57 @@ import Partners from "@/components/Partners"; import Scheme from "@/components/Scheme"; import Video from "@/components/Video"; import Head from "next/head"; +import { act } from "react"; export default function Home() { + const csvData = [ + { + date: "5 сентября", + location: "ГЛАВНАЯ ПЛОЩАДКА", + start: "10:00", + stop: "10:30", + activity: "Репетиция шоу", + }, + { + date: "5 сентября", + location: "ГЛАВНАЯ ПЛОЩАДКА", + start: "11:00", + stop: "11:30", + activity: "Открытие фестиваля", + }, + { + date: "5 сентября", + location: "ГЛАВНАЯ ПЛОЩАДКА", + start: "12:00", + stop: "13:00", + activity: "Показательные выступления", + }, + { + date: "6 сентября", + location: "ГЛАВНАЯ ПЛОЩАДКА", + start: "10:00", + stop: "10:30", + activity: "Репетиция шоу", + }, + { + date: "6 сентября", + location: "ГЛАВНАЯ ПЛОЩАДКА", + start: "10:00", + stop: "10:30", + activity: "Репетиция шоу", + }, + { + date: "6 сентября", + location: "ГЛАВНАЯ ПЛОЩАДКА", + start: "10:00", + stop: "10:30", + activity: "Репетиция шоу", + }, + // ... more data + ]; + return ( <> - Фестиваль технических видов спорта @@ -23,7 +69,7 @@ export default function Home() {