// WealthIntelligence — Profile page (inactivity + temporary illness + mailboxes)
const ProfilePage = ({state, t, updateState, setTemporaryIllness, openUserEditor}) => {
const inactivity = state.inactivity;
const ti = state.temporaryIllness || { active:false, since:null, note:'' };
const [tiNote, setTiNote] = useState(ti.note || '');
useEffect(()=>{ setTiNote(ti.note || ''); }, [ti.note]);
const cassettePermanent = state.cassette.filter(c => c.trigger==='permanent');
const cassetteTemporary = state.cassette.filter(c => c.trigger==='temporary');
const fmtSince = (iso) => {
if (!iso) return '';
try { return new Date(iso).toLocaleString('it-IT', { day:'numeric', month:'short', year:'numeric', hour:'2-digit', minute:'2-digit' }); }
catch(e){ return iso; }
};
return
{/* Inactivity — drives permanent triggers */}
{t.profile.section_inactivity}
{t.profile.inactivity_drives}
{t.profile.inactivity_desc}
{t.profile.months}
{inactivity.months}
{t.profile.pings}
{inactivity.pingCount}
{t.profile.trusted_contacts}
{(inactivity.trustedContacts||[]).map(pid => {
const p = state.people.find(x=>x.id===pid); if (!p) return null;
return
{p.name.split(' ')[0]}
;
})}
Cassette che si attiveranno: {cassettePermanent.length}
{/* Temporary illness — manual trigger */}
{t.profile.section_temporary}
{ti.active ? `${t.profile.temporary_active} ${fmtSince(ti.since)}` : t.profile.temporary_inactive}
{t.profile.temporary_desc}
{t.profile.temporary_note}
Cassette che diventeranno accessibili: {cassetteTemporary.length}
{ti.active ? (
) : (
)}
{/* Mailboxes */}
{t.profile.section_mailboxes}
{state.mailboxes.map(m => (
{m.kind==='google'?'G':m.kind==='apple'?'':'M'}
{m.email || (m.kind==='microsoft'?'Microsoft':'')}
{m.connected ? `Ultimo scan ${m.lastScan} · ${m.servicesFound} servizi` : 'Non connessa'}
{m.connected
?
Attiva
: }
))}
{/* Right column: user card */}
{state.user.name}
{state.user.email}
{state.user.phone &&
{state.user.phone}
}
{/* Trigger summary */}
Riepilogo trigger
{t.vault.triggers.permanent}
Automatico via inattività ({inactivity.months} mesi · {inactivity.pingCount} ping). {cassettePermanent.length} cassette.
{t.vault.triggers.temporary}
Manuale. {ti.active ? Attiva ora. : 'Non attiva.'} {cassetteTemporary.length} cassette.
;
};
// ------- User editor (drawer) -------
const UserEditor = ({user, t, onClose, onSave}) => {
const computeInitials = (name) => (name||'').split(/\s+/).filter(Boolean).map(w => w[0]).join('').slice(0,2).toUpperCase();
const [draft, setDraft] = useState(() => ({
name: user.name || '',
email: user.email || '',
phone: user.phone || '',
color: user.color || '#173B3F',
initials: user.initials || computeInitials(user.name || ''),
}));
const set = (k, v) => setDraft(d => {
const next = {...d, [k]:v};
if (k === 'name') next.initials = computeInitials(v);
return next;
});
const valid = draft.name.trim().length > 0;
return <>
{/* Live preview */}
{draft.name || 'Il tuo nome'}
{draft.email || 'email@esempio.it'}
set('name', e.target.value)}/>
set('email', e.target.value)}/>
set('phone', e.target.value)}/>
{window.WI.COLOR_OPTIONS.map(co => (
>;
};
Object.assign(window, { ProfilePage, UserEditor });