// Events page — properties hub + RedFest archive
const { useState: useStateE } = React;
function EventsPage({ t, go }) {
const [active, setActive] = useStateE(PROPERTIES[0].id);
const prop = PROPERTIES.find(p => p.id === active);
return (
{t.sections.events}
What's
on.
Our home-grown live-entertainment properties. Upcoming dates and lineups are published only after client confirmation.
{/* Property selector tabs */}
{PROPERTIES.map(p => (
))}
{/* Hero for active property */}
{prop.isStock &&
}
{prop.tag} · {prop.venue}
{prop.name}
{prop.blurb}
{/* Property meta */}
{[['Status', 'Dates TBA · awaiting confirmation'], [t.misc.venue, prop.venue], [t.misc.since, prop.since], [t.misc.cadence, prop.cadence]].map(([k,v])=>(
))}
{prop.note && (
Note {prop.note}
)}
{/* Archive — only meaningful for RedFest + DXBLaughs */}
{prop.id === 'redfestdxb' && (
Past editions · 2014–2019
Six years.
Forty-plus headliners.
A factual archive of headliners verified through public sources. Post-2019 editions are not listed pending client confirmation.
{REDFEST_ARCHIVE.map(y => (
{y.year}
{y.headliners.map(h => (
{h}·
))}
{y.note &&
{y.note}
}
))}
)}
{prop.id === 'dxblaughs' && (
Past performers · archive
The names that brought
the house down.
{DXBLAUGHS_ARCHIVE.map(n => (
{n}
Archive
))}
★
Listed factually as historical archive. No endorsement implied. Artist names cleared for archival listing.
)}
{prop.id !== 'redfestdxb' && prop.id !== 'dxblaughs' && (
Lineup & dates
{prop.name} dates and lineup will be published once confirmed by the client.
Join the newsletter to be first to know.
)}
{/* All properties grid */}
All properties
The full slate.
{PROPERTIES.map(p => (
))}
);
}
Object.assign(window, { EventsPage });