import React, { useEffect, useState } from 'react'; import { CondoService } from '../services/mockDb'; import { AppSettings, Family, User, AlertDefinition } from '../types'; import { Save, Building, Coins, Plus, Pencil, Trash2, X, CalendarCheck, AlertTriangle, User as UserIcon, Mail, Server, Bell, Clock, FileText, Send, Lock } from 'lucide-react'; export const SettingsPage: React.FC = () => { const currentUser = CondoService.getCurrentUser(); const isAdmin = currentUser?.role === 'admin'; const [activeTab, setActiveTab] = useState<'profile' | 'general' | 'families' | 'users' | 'smtp' | 'alerts'>(isAdmin ? 'general' : 'profile'); const [loading, setLoading] = useState(true); // Profile State const [profileForm, setProfileForm] = useState({ name: currentUser?.name || '', phone: currentUser?.phone || '', password: '', receiveAlerts: currentUser?.receiveAlerts ?? true }); const [profileSaving, setProfileSaving] = useState(false); const [profileMsg, setProfileMsg] = useState(''); // General Settings State const [settings, setSettings] = useState({ defaultMonthlyQuota: 0, condoName: '', currentYear: new Date().getFullYear(), smtpConfig: { host: '', port: 587, user: '', pass: '', secure: false, fromEmail: '' } }); const [saving, setSaving] = useState(false); const [successMsg, setSuccessMsg] = useState(''); // Families State const [families, setFamilies] = useState([]); const [showFamilyModal, setShowFamilyModal] = useState(false); const [editingFamily, setEditingFamily] = useState(null); const [familyForm, setFamilyForm] = useState({ name: '', unitNumber: '', contactEmail: '' }); // Users State const [users, setUsers] = useState([]); const [showUserModal, setShowUserModal] = useState(false); const [editingUser, setEditingUser] = useState(null); const [userForm, setUserForm] = useState({ name: '', email: '', password: '', phone: '', role: 'user', familyId: '', receiveAlerts: true }); // Alerts State const [alerts, setAlerts] = useState([]); const [showAlertModal, setShowAlertModal] = useState(false); const [editingAlert, setEditingAlert] = useState(null); const [alertForm, setAlertForm] = useState>({ subject: '', body: '', daysOffset: 0, offsetType: 'before_next_month', sendHour: 9, active: true }); useEffect(() => { const fetchData = async () => { try { if (isAdmin) { const [s, f, u, a] = await Promise.all([ CondoService.getSettings(), CondoService.getFamilies(), CondoService.getUsers(), CondoService.getAlerts() ]); setSettings(s); setFamilies(f); setUsers(u); setAlerts(a); } else { // If not admin, we might only need limited data, or nothing if we rely on session // For now, nothing extra to fetch for the profile as it's in session } } catch(e) { console.error(e); } finally { setLoading(false); } }; fetchData(); }, [isAdmin]); // --- Profile Handlers --- const handleProfileSubmit = async (e: React.FormEvent) => { e.preventDefault(); setProfileSaving(true); setProfileMsg(''); try { await CondoService.updateProfile(profileForm); setProfileMsg('Profilo aggiornato con successo!'); setTimeout(() => setProfileMsg(''), 3000); setProfileForm(prev => ({ ...prev, password: '' })); // clear password } catch (e) { console.error(e); setProfileMsg('Errore aggiornamento profilo'); } finally { setProfileSaving(false); } }; // --- Settings Handlers --- const handleSettingsSubmit = async (e: React.FormEvent) => { e.preventDefault(); setSaving(true); setSuccessMsg(''); try { await CondoService.updateSettings(settings); setSuccessMsg('Impostazioni salvate con successo!'); setTimeout(() => setSuccessMsg(''), 3000); } catch (e) { console.error(e); } finally { setSaving(false); } }; const handleNewYear = async () => { const nextYear = settings.currentYear + 1; if (window.confirm(`Sei sicuro di voler chiudere l'anno ${settings.currentYear} e aprire il ${nextYear}? \n\nI dati vecchi non verranno cancellati, ma la visualizzazione di default passerà al nuovo anno con saldi azzerati.`)) { setSaving(true); try { const newSettings = { ...settings, currentYear: nextYear }; await CondoService.updateSettings(newSettings); setSettings(newSettings); setSuccessMsg(`Anno ${nextYear} aperto con successo!`); setTimeout(() => setSuccessMsg(''), 3000); } catch(e) { console.error(e); } finally { setSaving(false); } } }; // --- Family Handlers --- const openAddFamilyModal = () => { setEditingFamily(null); setFamilyForm({ name: '', unitNumber: '', contactEmail: '' }); setShowFamilyModal(true); }; const openEditFamilyModal = (family: Family) => { setEditingFamily(family); setFamilyForm({ name: family.name, unitNumber: family.unitNumber, contactEmail: family.contactEmail || '' }); setShowFamilyModal(true); }; const handleDeleteFamily = async (id: string) => { if (!window.confirm('Sei sicuro di voler eliminare questa famiglia? Tutti i dati e lo storico pagamenti verranno persi.')) { return; } try { await CondoService.deleteFamily(id); setFamilies(families.filter(f => f.id !== id)); } catch (e) { console.error(e); } }; const handleFamilySubmit = async (e: React.FormEvent) => { e.preventDefault(); try { if (editingFamily) { const updatedFamily = { ...editingFamily, name: familyForm.name, unitNumber: familyForm.unitNumber, contactEmail: familyForm.contactEmail }; await CondoService.updateFamily(updatedFamily); setFamilies(families.map(f => f.id === updatedFamily.id ? updatedFamily : f)); } else { const newFamily = await CondoService.addFamily(familyForm); setFamilies([...families, newFamily]); } setShowFamilyModal(false); } catch (e) { console.error(e); } }; // --- User Handlers --- const openAddUserModal = () => { setEditingUser(null); setUserForm({ name: '', email: '', password: '', phone: '', role: 'user', familyId: '', receiveAlerts: true }); setShowUserModal(true); }; const openEditUserModal = (user: User) => { setEditingUser(user); setUserForm({ name: user.name || '', email: user.email, password: '', phone: user.phone || '', role: user.role || 'user', familyId: user.familyId || '', receiveAlerts: user.receiveAlerts ?? true }); setShowUserModal(true); }; const handleDeleteUser = async (id: string) => { if(!window.confirm("Sei sicuro di voler eliminare questo utente?")) return; try { await CondoService.deleteUser(id); setUsers(users.filter(u => u.id !== id)); } catch (e) { console.error(e); } }; const handleUserSubmit = async (e: React.FormEvent) => { e.preventDefault(); try { if (editingUser) { await CondoService.updateUser(editingUser.id, userForm); const updatedUsers = await CondoService.getUsers(); setUsers(updatedUsers); } else { await CondoService.createUser(userForm); const updatedUsers = await CondoService.getUsers(); setUsers(updatedUsers); } setShowUserModal(false); } catch (e) { console.error(e); alert("Errore nel salvataggio utente"); } }; // --- Alert Handlers --- const openAddAlertModal = () => { setEditingAlert(null); setAlertForm({ subject: '', body: '', daysOffset: 1, offsetType: 'before_next_month', sendHour: 9, active: true }); setShowAlertModal(true); }; const openEditAlertModal = (alert: AlertDefinition) => { setEditingAlert(alert); setAlertForm(alert); setShowAlertModal(true); }; const handleDeleteAlert = async (id: string) => { if(!window.confirm("Eliminare questo avviso automatico?")) return; try { await CondoService.deleteAlert(id); setAlerts(alerts.filter(a => a.id !== id)); } catch (e) { console.error(e); } }; const handleAlertSubmit = async (e: React.FormEvent) => { e.preventDefault(); try { const payload: AlertDefinition = { id: editingAlert ? editingAlert.id : '', subject: alertForm.subject!, body: alertForm.body!, daysOffset: Number(alertForm.daysOffset), offsetType: alertForm.offsetType as any, sendHour: Number(alertForm.sendHour), active: alertForm.active! }; const saved = await CondoService.saveAlert(payload); if (editingAlert) { setAlerts(alerts.map(a => a.id === saved.id ? saved : a)); } else { setAlerts([...alerts, saved]); } setShowAlertModal(false); } catch (e) { console.error(e); } }; if (loading) return
Caricamento...
; return (

Impostazioni

Gestisci configurazione, anagrafica, utenti e comunicazioni.

{/* Tabs - Scrollable on mobile */}
{/* Profile Tab (Always Visible) */} {/* Admin Tabs */} {isAdmin && ( <> )}
{activeTab === 'profile' && (

Dati Profilo

setProfileForm({...profileForm, name: e.target.value})} className="w-full border border-slate-300 rounded-lg p-2.5 focus:ring-2 focus:ring-blue-500 outline-none" />
setProfileForm({...profileForm, phone: e.target.value})} className="w-full border border-slate-300 rounded-lg p-2.5 focus:ring-2 focus:ring-blue-500 outline-none" />
setProfileForm({...profileForm, password: e.target.value})} className="w-full border border-slate-300 rounded-lg p-2.5 pl-9 focus:ring-2 focus:ring-blue-500 outline-none" />
setProfileForm({...profileForm, receiveAlerts: e.target.checked})} className="w-5 h-5 text-blue-600 rounded border-slate-300 focus:ring-blue-500" />

Abilita la ricezione di email per scadenze e comunicazioni condominiali.

{profileMsg}
)} {isAdmin && activeTab === 'general' && (
{/* General Data Form */}

Dati Generali

setSettings({ ...settings, condoName: e.target.value })} className="w-full border border-slate-300 rounded-lg px-4 py-2.5 focus:ring-2 focus:ring-blue-500 outline-none transition-all" placeholder="Es. Condominio Roma" required />
setSettings({ ...settings, defaultMonthlyQuota: parseFloat(e.target.value) })} className="w-full border border-slate-300 rounded-lg px-4 py-2.5 pl-8 focus:ring-2 focus:ring-blue-500 outline-none transition-all" required />
{successMsg}
{/* Fiscal Year Management */}

Anno Fiscale

Anno corrente: {settings.currentYear}

Chiudendo l'anno, il sistema passerà al {settings.currentYear + 1}. I dati storici rimarranno consultabili.

)} {isAdmin && activeTab === 'families' && (
{/* Desktop Table */}
{families.map(family => ( ))}
Nome Famiglia Interno Email Azioni
{family.name} {family.unitNumber} {family.contactEmail || '-'}
{/* Mobile Cards for Families */}
{families.map(family => (

{family.name}

Interno: {family.unitNumber}

{family.contactEmail || 'Nessuna email'}

))}
)} {isAdmin && activeTab === 'users' && (
{/* Desktop Table */}
{users.map(user => ( ))}
Utente Contatti Ruolo Alerts Azioni
{user.name || '-'}
{user.email}
{user.phone &&
{user.phone}
}
{user.role} {user.receiveAlerts ? ( ) : ( No )}
{/* Mobile User Cards */}
{users.map(user => (
{user.role}

{user.name || 'Senza Nome'}

{user.email}

{user.receiveAlerts ? ( Riceve Avvisi ) : ( Niente Avvisi )}
))}
)} {isAdmin && activeTab === 'smtp' && (

Server SMTP

Configura il server per l'invio delle email.

setSettings({...settings, smtpConfig: {...settings.smtpConfig!, host: e.target.value}})} className="w-full border border-slate-300 rounded-lg p-2.5 focus:ring-2 focus:ring-blue-500 outline-none" />
setSettings({...settings, smtpConfig: {...settings.smtpConfig!, port: parseInt(e.target.value)}})} className="w-full border border-slate-300 rounded-lg p-2.5 focus:ring-2 focus:ring-blue-500 outline-none" />
setSettings({...settings, smtpConfig: {...settings.smtpConfig!, user: e.target.value}})} className="w-full border border-slate-300 rounded-lg p-2.5 focus:ring-2 focus:ring-blue-500 outline-none" />
setSettings({...settings, smtpConfig: {...settings.smtpConfig!, pass: e.target.value}})} className="w-full border border-slate-300 rounded-lg p-2.5 focus:ring-2 focus:ring-blue-500 outline-none" />
setSettings({...settings, smtpConfig: {...settings.smtpConfig!, fromEmail: e.target.value}})} className="w-full border border-slate-300 rounded-lg p-2.5 focus:ring-2 focus:ring-blue-500 outline-none" />
setSettings({...settings, smtpConfig: {...settings.smtpConfig!, secure: e.target.checked}})} className="w-4 h-4 text-blue-600 rounded border-slate-300 focus:ring-blue-500" />
{successMsg || 'Salvataggio...'}
)} {isAdmin && activeTab === 'alerts' && (

Avvisi Automatici

Pianifica email ricorrenti per i condomini.

{alerts.length === 0 && (
Nessun avviso configurato.
)} {alerts.map(alert => (

{alert.subject}

{!alert.active && DISATTIVO}

{alert.body}

{alert.offsetType === 'before_next_month' ? `${alert.daysOffset} giorni prima del prossimo mese` : `${alert.daysOffset} giorni dopo inizio mese corrente` }
Alle ore {alert.sendHour}:00
))}
)} {/* Family Modal */} {showFamilyModal && (

{editingFamily ? 'Modifica Famiglia' : 'Nuova Famiglia'}

setFamilyForm({...familyForm, name: e.target.value})} className="w-full border border-slate-300 rounded-lg p-3 focus:ring-2 focus:ring-blue-500 outline-none" placeholder="Es. Famiglia Rossi" />
setFamilyForm({...familyForm, unitNumber: e.target.value})} className="w-full border border-slate-300 rounded-lg p-3 focus:ring-2 focus:ring-blue-500 outline-none" />
setFamilyForm({...familyForm, contactEmail: e.target.value})} className="w-full border border-slate-300 rounded-lg p-3 focus:ring-2 focus:ring-blue-500 outline-none" />
)} {/* User Modal */} {showUserModal && (

{editingUser ? 'Modifica Utente' : 'Nuovo Utente'}

setUserForm({...userForm, name: e.target.value})} className="w-full border border-slate-300 rounded-lg p-3 focus:ring-2 focus:ring-blue-500 outline-none" />
setUserForm({...userForm, email: e.target.value})} className="w-full border border-slate-300 rounded-lg p-3 focus:ring-2 focus:ring-blue-500 outline-none" />
setUserForm({...userForm, phone: e.target.value})} className="w-full border border-slate-300 rounded-lg p-3 focus:ring-2 focus:ring-blue-500 outline-none" />
setUserForm({...userForm, password: e.target.value})} className="w-full border border-slate-300 rounded-lg p-3 focus:ring-2 focus:ring-blue-500 outline-none" placeholder={editingUser ? "Lascia vuoto per non cambiare" : "Inserisci password"} />
setUserForm({...userForm, receiveAlerts: e.target.checked})} className="w-5 h-5 text-blue-600 rounded border-slate-300 focus:ring-blue-500" />
)} {/* Alert Config Modal */} {showAlertModal && (

{editingAlert ? 'Modifica Avviso' : 'Nuovo Avviso'}

setAlertForm({...alertForm, subject: e.target.value})} className="w-full border border-slate-300 rounded-lg p-3 focus:ring-2 focus:ring-blue-500 outline-none" placeholder="Es. Promemoria Scadenza Rata" />