// Prodz — Profile (own + others). Tabs: Prods · Moments · Gear · (Shoutouts, me) · About. // Others: Follow / Collab / Message + Recommend (after following). "Me" exposes // language, Saved items, and the Shoutouts (job calls) you posted — review, link, edit. function PersonProfile({ id }) { const { L, lang, setLang } = useL(); const nav = useNav(); const { Avatar, Button, Tabs, Tag, StatusDot } = window.ProdzDesignSystem_d0b87b; const isMe = id === 'me'; const p = PEOPLE[id] || PEOPLE.me; const [tab, setTab] = useStateS('prods'); const [following, setFollowing] = useStateS(false); const [showRec, setShowRec] = useStateS(false); const [stars, setStars] = useStateS(5); const [review, setReview] = useStateS(''); const [statSheet, setStatSheet] = useStateS(null); // 'network' | 'collab' | 'recs' const rec = nav.recOf(id); const recAvg = rec.count ? (rec.sum / rec.count).toFixed(1) : '—'; const gear = [ { name: 'Sony FX6', kind: { it: 'Cinema camera', en: 'Cinema camera' }, sn: 'FX6-0042', img: IMG.camera, ready: true }, { name: 'Sigma 85mm f/1.4', kind: { it: 'Obiettivo', en: 'Lens' }, sn: 'ART-1185', img: IMG.lens, ready: true }, { name: 'Aputure 600d', kind: { it: 'Illuminazione', en: 'Lighting' }, sn: 'AP-600-7', img: null, ready: false }]; const specialties = ['EDITORIAL', 'LOW LIGHT', 'FASHION', 'COMMERCIAL']; const interests = ['Moda', 'Ritratto', 'Commercial']; const submitRec = () => { nav.recommend(id, stars, review); setShowRec(false); nav.toast(L('Raccomandazione inviata · grazie!', 'Recommendation sent · thanks!'), null); setStars(5);setReview(''); }; // people lists behind the stat tiles const followingList = (id === 'me' ? FOLLOWING : Object.keys(PEOPLE).filter((x) => x !== id && x !== 'me')).filter((x) => PEOPLE[x]); const collabList = collaboratorsOf(id); const recEntries = rec.entries || []; const tabs = [ { id: 'prods', label: L('Prod', 'Prods') }, { id: 'moments', label: 'Moments' }, { id: 'gear', label: 'Gear' }, ...(isMe ? [{ id: 'shouts', label: 'Shoutout' }] : []), { id: 'about', label: L('Info', 'About') }]; return (
{/* cover + avatar */}
{isMe ?
:
}

{p.name}

{p.online && }
{tr(L, p.role)} · {p.city}
{/* Recommend — appears once you follow this person (feeds their Recs stat) */} {!isMe && following && } {/* Saved items entry — own profile */} {isMe && }
{/* stats — tap to see the people / recommendations behind each number */}
setTab('prods')} /> setStatSheet('collab')} /> setStatSheet('network')} /> setStatSheet('recs')} />
{/* tabs */}
{tab === 'prods' &&
{PRODUCTIONS.concat(PRODUCTIONS.slice(0, 1)).map((pr, i) => )}
} {tab === 'moments' &&
{MOMENTS.map((m) =>
)}
} {tab === 'gear' &&

{L('Attrezzatura e disponibilità sul set.', 'Toolkit & on-set availability.')}

{gear.map((g) =>
{!g.img && }
{g.name}
{tr(L, g.kind)} · SN {g.sn}
)}
} {tab === 'shouts' && isMe &&

{L('Le job call e collab che hai pubblicato — rivedi, collega ed edita.', 'The job calls & collabs you posted — review, link and edit.')}

{MY_SHOUTOUTS.map((s) => { const prod = PRODUCTIONS.find((x) => x.id === s.prod); const open = s.status === 'open'; return (
{s.kind === 'job' ? L('Job Call', 'Job Call') : 'Collab'} {s.paid && {L('Retribuito', 'Paid')}} {open ? L('Aperta', 'Open') : L('Chiusa', 'Closed')}
{tr(L, s.title)}
{prod.title} {tr(L, s.date)} {s.applicants}
); })}
} {tab === 'about' &&
{L('Biografia', 'Biography')}

{L('Direttrice della fotografia con base a Milano. Lavoro su moda editoriale e commercial, con un approccio a naturali motivati e luci pratiche.', 'Cinematographer based in Milan. I work across editorial fashion and commercial with a motivated-naturals, practical-light approach.')}

{L('Specialità', 'Specialties')}
{specialties.map((s) => {s})}
{isMe &&
{L('Dal tuo profilo', 'From your profile')}
x).join(' · ')} />
}
}
{/* Recommend sheet — stars (1–5) + review feed the Recs average */} setShowRec(false)}> {L('Raccomanda', 'Recommend')}
{p.name}

{L('Il tuo voto si somma e media nella sua statistica “Recs”.', 'Your rating sums and averages into their “Recs” stat.')}

{[1, 2, 3, 4, 5].map((n) => )}