import type { HaArea } from '@/types/types'; import { getHaAreas, testHaConnection } from '@/utils/haApi'; import { useRouter } from 'expo-router'; import { Archive, Briefcase, DoorOpen, Grid2X2, Lightbulb, Plus, Users, WifiOff } from 'lucide-react-native'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { RefreshControl, ScrollView, Text, TouchableOpacity, View } from 'react-native'; import LoadingScreen from '@/components/LoadingScreen'; const AREA_STYLES = [ { icon: Users, bgColor: 'bg-indigo-100' }, { icon: Briefcase, bgColor: 'bg-slate-100' }, { icon: Lightbulb, bgColor: 'bg-yellow-100' }, { icon: DoorOpen, bgColor: 'bg-green-100' }, { icon: Archive, bgColor: 'bg-orange-100' }, { icon: Grid2X2, bgColor: 'bg-sky-100' }, ]; export default function AutomationScreen() { const router = useRouter(); const [allAreas, setAllAreas] = useState([]); const [connectionStatus, setConnectionStatus] = useState<{ success: boolean; message: string }>({ success: false, message: 'Connecting...' }); const [isLoading, setIsLoading] = useState(true); const [refreshing, setRefreshing] = useState(false); const [floors, setFloors] = useState(['Tutti']); const [selectedFloor, setSelectedFloor] = useState('Tutti'); const initialize = useCallback(async () => { const connResult = await testHaConnection(); setConnectionStatus(connResult); if (connResult.success) { const areasResult = await getHaAreas(); const areas = areasResult.map(area => ({ ...area, floor_name: area.floor_name || 'Non assegnato', device_count: area.device_count || 0, })); setAllAreas(areas); const uniqueFloors = Array.from(new Set(areas.map(area => area.floor_name || 'Non assegnato'))); setFloors(['Tutti', ...uniqueFloors]); } }, []); useEffect(() => { const load = async () => { setIsLoading(true); await initialize(); setIsLoading(false); }; load(); }, [initialize]); const onRefresh = useCallback(async () => { setRefreshing(true); await initialize(); setRefreshing(false); }, [initialize]); const filteredAreas = useMemo(() => { if (selectedFloor === 'Tutti') { return allAreas; } return allAreas.filter(area => area.floor_name === selectedFloor); }, [allAreas, selectedFloor]); if (isLoading) { return ; } if (!connectionStatus.success) { return ( Domotica Controlla gli ambienti {connectionStatus.success ? 'ONLINE' : 'OFFLINE'} {connectionStatus.success && ( {floors.map(floor => ( setSelectedFloor(floor)} className={`px-5 py-2.5 rounded-xl ${selectedFloor === floor ? 'bg-[#099499]' : 'bg-gray-100 active:bg-gray-200'}`} > {floor} ))} )} } > Errore di connessione {connectionStatus.message} Riprova ); } return ( Domotica Controlla gli ambienti {connectionStatus.success ? 'ONLINE' : 'OFFLINE'} {connectionStatus.success && ( {floors.map(floor => ( setSelectedFloor(floor)} className={`px-5 py-2.5 rounded-xl ${selectedFloor === floor ? 'bg-[#099499]' : 'bg-gray-100 active:bg-gray-200'}`} > {floor} ))} )} } > {filteredAreas.length > 0 ? ( {filteredAreas.map((area, index) => { const { icon: IconComponent, bgColor } = AREA_STYLES[index % AREA_STYLES.length]; return ( router.push({ pathname: '/(protected)/automation/[id]', params: { id: area.name, areaData: JSON.stringify(area), } })} className="bg-white rounded-3xl p-5 shadow-sm border border-gray-100 active:scale-[0.98] w-[48%] mb-4 aspect-square" > {area.name} {area.device_count} dispositivi ) })} ) : ( Nessuna area trovata {`Nessuna area per il piano "${selectedFloor}"`} )} {/* alert('Aggiungi nuovo collegamento')} className="absolute bottom-8 right-6 w-16 h-16 bg-[#099499] rounded-full shadow-lg items-center justify-center active:scale-90" > */} ); }