diff --git a/src/App.tsx b/src/App.tsx index 2fce6f7..a305aa9 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,6 +4,7 @@ import Navbar from './components/Navbar'; import Footer from './components/Footer'; import Home from './pages/Home'; import AllEvents from './pages/AllEvents'; +import EventDetail from './pages/EventDetail'; function ScrollToTop() { const { pathname } = useLocation(); @@ -26,6 +27,7 @@ function App() { } /> } /> + } /> diff --git a/src/components/EventCard.tsx b/src/components/EventCard.tsx index 7c80920..20bebcd 100644 --- a/src/components/EventCard.tsx +++ b/src/components/EventCard.tsx @@ -1,6 +1,8 @@ import { MapPin, Calendar, ArrowRight } from 'lucide-react'; +import { Link } from 'react-router-dom'; interface EventCardProps { + id: string; title: string; image: string; date: string; @@ -12,6 +14,7 @@ interface EventCardProps { } export default function EventCard({ + id, title, image, date, @@ -79,16 +82,22 @@ export default function EventCard({

BY: {organizer}

- + {isAvailable ? ( + + BELI TIKET + + + ) : ( + + )} diff --git a/src/pages/EventDetail.tsx b/src/pages/EventDetail.tsx new file mode 100644 index 0000000..d6cdc43 --- /dev/null +++ b/src/pages/EventDetail.tsx @@ -0,0 +1,204 @@ +import { useState } from 'react'; +import { useParams, Link } from 'react-router-dom'; +import { ArrowLeft, MapPin, Calendar, Info, FileText, Ticket as TicketIcon } from 'lucide-react'; + +const MOCK_EVENT_DETAIL = { + id: '1', + title: 'ADVENTURE FEST 2026 MUTIARA GADING CITY', + image: 'https://images.unsplash.com/photo-1540039155732-6761b54f6cce?q=80&w=1200&auto=format&fit=crop', + date: 'Minggu, 26 April 2026', + time: 'Pk. 06.00 - 12.00 WIB', + location: 'South Lake Park, Kabupaten Bekasi', + fullAddress: 'Blk. M 09 - M 10 No.15, Setia Asih, Kec. Tarumajaya, Kabupaten Bekasi, Jawa Barat 17215', + organizer: 'Harmoni Kreasi', + description: [ + 'Tiket hanya berlaku pada hari H', + 'Acara dimulai pukul 06.00 WIB hingga selesai.', + 'Peserta wajib membawa kartu identitas (KTP/SIM/Kartu Pelajar) saat acara berlangsung.', + 'Pendaftaran bersifat final, tidak dapat dialihkan kepada pihak lain, tidak dapat mengubah kategori lomba.' + ], + tickets: [ + { + id: 't1', + name: 'PRESALE INCLUDE INSURANCE', + benefits: 'Include: Jersey Peserta + Insurance + Finisher Medal + Best Finisher + Waterstation + Refreshment + Tiket Konser UTOPIA Harga Sudah Termasuk Pajak', + category: 'PELARI', + validDate: '24 Mei 2026', + price: 'IDR 155.000', + }, + { + id: 't2', + name: 'PRESALE NON INSURANCE', + benefits: 'Include: Jersey Peserta + Finisher Medal + Best Finisher + Waterstation + Refreshment + Tiket Konser UTOPIA Harga Sudah Termasuk Pajak', + category: 'PELARI', + validDate: '24 Mei 2026', + price: 'IDR 135.000', + } + ] +}; + +export default function EventDetail() { + const { id } = useParams(); + const [activeTab, setActiveTab] = useState<'info' | 'desc' | 'ticket'>('ticket'); + + // Dalam aplikasi nyata, Anda akan fetch data berdasarkan `id` + const event = MOCK_EVENT_DETAIL; + + return ( +
+
+ + {/* Back Button */} + + + KEMBALI KE EVENTS + + + {/* Hero Banner */} +
+ {event.title} +
+

+ {event.title} +

+

+ {event.date} +

+
+
+ + {/* Info Highlights */} +
+
+
+ +
+
+

Waktu Pelaksanaan

+

{event.time}

+
+
+
+
+ +
+
+

Lokasi

+

{event.location}

+
+
+
+ + {/* Tabs System */} +
+ + {/* Tab Headers */} +
+ + + +
+ + {/* Tab Content */} +
+ + {/* INFO TAB */} + {activeTab === 'info' && ( +
+

Venue Detail

+
+

{event.location}

+

+ {event.fullAddress} +

+ +
+
+ )} + + {/* DESCRIPTION TAB */} + {activeTab === 'desc' && ( +
+

Syarat & Ketentuan

+
    + {event.description.map((desc, idx) => ( +
  • + + {desc} +
  • + ))} +
+
+ )} + + {/* TICKET TAB */} + {activeTab === 'ticket' && ( +
+ {event.tickets.map((ticket) => ( +
+

+ {ticket.name} +

+

+ {ticket.benefits} +

+ +
+ + {ticket.category} + + + Valid: {ticket.validDate} + +
+ +
+
+ {ticket.price} +
+ +
+
+ ))} +
+ )} + +
+
+ +
+
+ ); +}