import React, { useEffect, useState } from 'react'; import { CondoService } from '../services/mockDb'; import { AppSettings, Family, User } from '../types'; import { Save, Building, Coins, Plus, Pencil, Trash2, X, CalendarCheck, AlertTriangle, UserCog, Mail, Phone, Lock, Shield, User as UserIcon } from 'lucide-react'; export const SettingsPage: React.FC = () => { const [activeTab, setActiveTab] = useState<'general' | 'families' | 'users'>('general'); const [loading, setLoading] = useState(true); // General Settings State const [settings, setSettings] = useState({ defaultMonthlyQuota: 0, condoName: '', currentYear: new Date().getFullYear() }); 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: '' }); useEffect(() => { const fetchData = async () => { try { const [s, f, u] = await Promise.all([ CondoService.getSettings(), CondoService.getFamilies(), CondoService.getUsers() ]); setSettings(s); setFamilies(f); setUsers(u); } finally { setLoading(false); } }; fetchData(); }, []); // --- 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: '' }); 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 || '' }); 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"); } }; const getFamilyName = (id: string | null | undefined) => { if (!id) return '-'; return families.find(f => f.id === id)?.name || 'Sconosciuta'; }; if (loading) return
Caricamento...
; return (

Impostazioni

Gestisci configurazione, anagrafica e utenti.

{/* Tabs - Scrollable on mobile */}
{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.

)} {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'}

))}
)} {activeTab === 'users' && (
{/* Desktop Table */}
{users.map(user => ( ))}
Utente Contatti Ruolo Famiglia Azioni
{user.name || '-'}
{user.email}
{user.phone &&
{user.phone}
}
{user.role} {getFamilyName(user.familyId)}
{/* Mobile Cards for Users */}
{users.map(user => (
{user.role}

{user.name || 'Senza Nome'}

{user.email}

Famiglia: {getFamilyName(user.familyId)}
{user.phone && (
Telefono: {user.phone}
)}
))}
)} {/* 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"} />
)}
); };