import React, { useEffect, useState } from 'react'; import { Link } from 'react-router-dom'; import { CondoService } from '../services/mockDb'; import { Family, Condo, Notice, AppSettings } from '../types'; import { Search, ChevronRight, UserCircle, Building, Bell, AlertTriangle, Hammer, Calendar, Info, Link as LinkIcon, Check } from 'lucide-react'; export const FamilyList: React.FC = () => { const [families, setFamilies] = useState([]); const [loading, setLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(''); const [activeCondo, setActiveCondo] = useState(undefined); const [notices, setNotices] = useState([]); const [userReadIds, setUserReadIds] = useState([]); const [settings, setSettings] = useState(null); const currentUser = CondoService.getCurrentUser(); useEffect(() => { const fetchData = async () => { try { CondoService.seedPayments(); const [fams, condo, allNotices, appSettings] = await Promise.all([ CondoService.getFamilies(), CondoService.getActiveCondo(), CondoService.getNotices(), CondoService.getSettings() ]); setFamilies(fams); setActiveCondo(condo); setSettings(appSettings); if (condo && currentUser && appSettings.features.notices) { // Filter notices logic: // 1. Must belong to current condo and be active // 2. If Admin/PowerUser -> See everything // 3. If standard User -> See Public notices (no target) OR Targeted notices containing their familyId const isPrivileged = currentUser.role === 'admin' || currentUser.role === 'poweruser'; const condoNotices = allNotices.filter(n => { if (n.condoId !== condo.id || !n.active) return false; if (isPrivileged) return true; // Check targeting const hasTargets = n.targetFamilyIds && n.targetFamilyIds.length > 0; if (!hasTargets) return true; // Public to all return currentUser.familyId && n.targetFamilyIds?.includes(currentUser.familyId); }); setNotices(condoNotices); // Check which ones are read const readStatuses = await Promise.all(condoNotices.map(n => CondoService.getNoticeReadStatus(n.id))); const readIds: string[] = []; readStatuses.forEach((reads, idx) => { if (reads.find(r => r.userId === currentUser.id)) { readIds.push(condoNotices[idx].id); } }); setUserReadIds(readIds); } } catch (e) { console.error("Error fetching data", e); } finally { setLoading(false); } }; fetchData(); }, []); const filteredFamilies = families.filter(f => f.name.toLowerCase().includes(searchTerm.toLowerCase()) || f.unitNumber.toLowerCase().includes(searchTerm.toLowerCase()) ); const NoticeIcon = ({type}: {type: string}) => { switch(type) { case 'warning': return ; case 'maintenance': return ; case 'event': return ; default: return ; } }; if (loading) { return
Caricamento in corso...
; } if (!activeCondo) { return (

Nessun Condominio Selezionato

Seleziona o crea un condominio dalle impostazioni.

); } return (
{/* Responsive Header */}

Elenco Condomini

{activeCondo.name}

setSearchTerm(e.target.value)} />
{/* Notices Section (Visible to Users only if feature enabled) */} {settings?.features.notices && notices.length > 0 && (

Bacheca Avvisi

{notices.map(notice => { const isRead = userReadIds.includes(notice.id); return (

{notice.title}

{isRead && Letto} {!isRead && Nuovo}

{new Date(notice.date).toLocaleDateString()}

{notice.content}

{notice.link && ( Apri Link )}
); })}
)} {/* List */}
    {filteredFamilies.length === 0 ? (
  • Nessuna famiglia trovata in questo condominio.
  • ) : ( filteredFamilies.map((family) => (
  • {family.name}

    Interno: {family.unitNumber}

  • )) )}
); };