// 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;