// Esplora — container with 3 tabs (Beat / Servizi / Producer) // Each tab has a different page title, count, sort options, and active filter pills. // Filter rail content + grid come from EsploraBeat / EsploraServizi / EsploraProducer. const { useState: useStateEsp } = React; const EspIcons = window.SonaraIcons; const TAB_CONFIG = { beat: { title: "Esplora beat", eyebrow: "Catalog", sub: "aggiornato in tempo reale", activeFilters: [], sortOptions: [["relevance","Pertinenza"],["new","Recenti"],["popular","Popolari"],["price-asc","Prezzo ↑"],["price-desc","Prezzo ↓"]], }, servizi: { title: "Esplora servizi", eyebrow: "Marketplace", sub: "Mix, master, vocal, custom production", activeFilters: [], sortOptions: [["relevance","Pertinenza"],["rating","Rating"],["price-asc","Prezzo ↑"],["fast","Tempi rapidi"]], }, producer: { title: "Esplora producer", eyebrow: "Directory", sub: "Trova chi può lavorare con te", activeFilters: [], sortOptions: [["relevance","Pertinenza"],["top","Top Rated"],["active","Più attivi"],["new","Recenti"]], }, artisti: { title: "Esplora artisti", eyebrow: "Directory", sub: "Scopri voci emergenti, collabora, segui talenti", activeFilters: [], sortOptions: [["relevance","Pertinenza"],["emerging","Top emergenti"],["new","Recenti"],["active","Più attivi"]], }, }; function SortDropdown({ tab, value, onChange }) { const [open, setOpen] = useStateEsp(false); const opts = TAB_CONFIG[tab].sortOptions; const sel = opts.find(o => o[0] === value) || opts[0]; return (
{open && (
setOpen(false)}> {opts.map(([v, l]) => ( ))}
)}
); } function EsploraPage({ playerStyle = "expanded", cardStyle = "standard", tabStyle = "subtab" }) { const [tab, setTab] = useStateEsp("beat"); const [view, setView] = useStateEsp("list"); const [railOpen, setRailOpen] = useStateEsp(() => { try { return localStorage.getItem("sonara-rail-open") !== "0"; } catch (e) { return true; } }); React.useEffect(() => { try { localStorage.setItem("sonara-rail-open", railOpen ? "1" : "0"); } catch (e) {} }, [railOpen]); const [sort, setSort] = useStateEsp({ beat: "relevance", servizi: "relevance", producer: "relevance", artisti: "relevance" }); const cfg = TAB_CONFIG[tab]; const counts = { beat: window.BEAT_COUNT || 24, servizi: window.SVC_COUNT || 18, producer: window.PROD_COUNT || 24, artisti: window.ART_COUNT || 24, }; const tabs = [ ["beat", "Beat", counts.beat], ["servizi", "Servizi", counts.servizi], ["producer", "Producer", counts.producer], ["artisti", "Artisti", counts.artisti], ]; const supportsMap = tab === "producer" || tab === "artisti"; const supportsRail = true; React.useEffect(() => { if (!supportsMap) setView("list"); }, [tab, supportsMap]); return (
{/* Tab nav — appears ABOVE the title (changes context like a section switcher) */}
{cfg.eyebrow}

{cfg.title}

{counts[tab].toLocaleString("it")} risultati · {cfg.sub}
{supportsRail && window.RailToggleButton && ( )} {cfg.activeFilters.map(f => ( {f} ))} {cfg.activeFilters.length > 0 && }
{supportsMap && (
)} setSort(s => ({ ...s, [tab]: v }))}/>
{tab === "beat" && } {tab === "servizi" && } {tab === "producer" && view === "list" && } {tab === "producer" && view === "map" && } {tab === "artisti" && view === "list" && } {tab === "artisti" && view === "map" && }
); } window.EsploraPage = EsploraPage;