// Step 3 — Profile wizard with sub-steps per role
const I3 = window.SonaraIcons;
const GENRES = ["trap","hip-hop","pop","indie","R&B","drill","elettronica","house","rock","cantautorato","jazz","classica","reggaeton","latin","altro"];
const CITIES = ["Milano","Roma","Napoli","Torino","Bologna","Firenze","Palermo","Genova","Bari","Verona"];
const DAWS = ["Ableton","FL Studio","Logic","Pro Tools","Reaper","Cubase","Altro"];
const PRODUCER_SERVICES = ["Beat custom","Beat pronti","Mix","Master","Vocal production","Sound design","Songwriting","Altro"];
const ARTIST_LOOKING = ["Producer","Beat pronti","Mix/Master","Manager","Vocal coach","Altro"];
const MANAGER_AREAS = ["Contratti label","Booking live","Marketing","Distribuzione digitale","A&R","Sync/Licensing","Management 360°","Altro"];
const ROSTER = ["1–3 artisti","4–10 artisti","11–25 artisti","25+ artisti"];
function SubstepStrip({ idx, total }) {
return (
{Array.from({ length: total }).map((_, i) => (
))}
);
}
function AvatarUploader({ name }) {
const initial = (name || "?").trim().slice(0, 1).toUpperCase() || "S";
return (
);
}
function NavRow({ onBack, onNext, nextLabel = "Continua", canNext = true, skipLabel }) {
return (
Indietro
{skipLabel && {skipLabel} }
{nextLabel}
);
}
// === ARTIST ===
function ArtistWizard({ data, setData, onDone, onBack }) {
const [sub, setSub] = React.useState(0);
const total = 4;
const next = () => sub < total - 1 ? setSub(sub + 1) : onDone();
const back = () => sub === 0 ? onBack() : setSub(sub - 1);
return (
Profilo Artista · {sub + 1}/{total}
{sub === 0 && (
<>
Come ti chiami sul palco?
Il tuo nome d'arte appare in ogni listing, proposta e collaborazione.
setData({ ...data, artistName: e.target.value })}/>
setData({ ...data, city: e.target.value })}/>
{CITIES.map((c) => )}
>
)}
{sub === 1 && (
<>
Che musica fai?
Scegli da 1 a 3 generi. Servono per matching e discovery.
setData({ ...data, genres: v })} max={3}/>
setData({ ...data, looking: v })}/>
0}/>
>
)}
{sub === 2 && (
<>
Mostrati al meglio.
Tutto opzionale, ma profili completi ricevono +30% di proposte.
>
)}
{sub === 3 && (
<>
I tuoi link.
Aggiungi quello che hai. Ti aiuta a far vedere chi sei.
setData({ ...data, spotify: e.target.value })}/>
setData({ ...data, instagram: e.target.value })}/>
setData({ ...data, soundcloud: e.target.value })}/>
setData({ ...data, youtube: e.target.value })}/>
setData({ ...data, tiktok: e.target.value })}/>
>
)}
);
}
// === PRODUCER ===
function ProducerWizard({ data, setData, onDone, onBack }) {
const [sub, setSub] = React.useState(0);
const total = 4;
const next = () => sub < total - 1 ? setSub(sub + 1) : onDone();
const back = () => sub === 0 ? onBack() : setSub(sub - 1);
return (
Profilo Producer · {sub + 1}/{total}
{sub === 0 && (
<>
Come ti chiamano in studio?
Il tuo alias da producer. È il primo asset del tuo business.
setData({ ...data, producerName: e.target.value })}/>
setData({ ...data, city: e.target.value })}/>
setData({ ...data, hasStudio: v })}>
Hai uno studio musicale? {" "}
Se sì, il tuo profilo apparirà anche nella directory studi e potrai ricevere prenotazioni di sessioni.
{data.hasStudio && (
)}
>
)}
{sub === 1 && (
<>
Cosa produci?
Generi e servizi: ti aiutano ad apparire nei posti giusti.
setData({ ...data, genres: v })} max={5}/>
setData({ ...data, services: v })}/>
0}/>
>
)}
{sub === 2 && (
<>
Il tuo setup.
Niente di tecnico. Aiuta artisti e clienti a trovare match precisi.
setData({ ...data, daw: e.target.value })}>
Seleziona
{DAWS.map((d) => {d} )}
setData({ ...data, years: e.target.value })}/>
{[
{ id: "€", t: "€", s: "Entry · sotto 200€" },
{ id: "€€", t: "€€", s: "Mid · 200–800€" },
{ id: "€€€", t: "€€€", s: "Pro · 800€+" },
].map((opt) => (
setData({ ...data, pricing: opt.id })}>
))}
>
)}
{sub === 3 && (
<>
Bio e link.
Il tuo portfolio. Aggiungi quello che mostra la tua qualità.
setData({ ...data, spotify: e.target.value })}/>
setData({ ...data, soundcloud: e.target.value })}/>
setData({ ...data, youtube: e.target.value })}/>
setData({ ...data, beatstars: e.target.value })}/>
>
)}
);
}
// === MANAGER ===
function ManagerWizard({ data, setData, onDone, onBack }) {
const [sub, setSub] = React.useState(0);
const total = 4;
const next = () => sub < total - 1 ? setSub(sub + 1) : onDone();
const back = () => sub === 0 ? onBack() : setSub(sub - 1);
const isAgency = data.mgrType === "agency";
return (
Profilo Manager · {sub + 1}/{total}
{sub === 0 && (
<>
Come operi?
Privato o per un'agenzia/etichetta? Scegli per personalizzare il profilo.
setData({ ...data, mgrType: "private" })}>
Privato
Lavoro in autonomia
setData({ ...data, mgrType: "agency" })}>
Agenzia / Etichetta
Rappresento un'organizzazione
>
)}
{sub === 1 && (
<>
Le tue info.
Servono per verificarti. Visibili solo dove serve fiducia.
setData({ ...data, firstName: e.target.value })}/>
setData({ ...data, lastName: e.target.value })}/>
{isAgency && (
setData({ ...data, agency: e.target.value })}/>
)}
setData({ ...data, city: e.target.value })}/>
>
)}
{sub === 2 && (
<>
La tua esperienza.
Aiutaci a posizionarti. Tutto opzionale ma altamente consigliato.
setData({ ...data, years: e.target.value })}/>
setData({ ...data, roster: e.target.value })}>
Seleziona
{ROSTER.map((r) => {r} )}
setData({ ...data, areas: v })}/>
>
)}
{sub === 3 && (
<>
Bio e contatti.
Per artisti che valutano se lavorare con te.
setData({ ...data, website: e.target.value })}/>
setData({ ...data, linkedin: e.target.value })}/>
setData({ ...data, phone: e.target.value })}/>
>
)}
);
}
window.Step3Profile = function Step3Profile({ data, setData, onNext, onBack }) {
const role = data.role || "artist";
if (role === "artist") return ;
if (role === "producer") return ;
return ;
};