import DeviceCard from '@/components/DeviceCard'; import LoadingScreen from '@/components/LoadingScreen'; import { HaArea, HaEntity } from '@/types/types'; import { getHaEntitiesByArea, toggleHaEntity } from '@/utils/haApi'; import { useLocalSearchParams, useRouter } from 'expo-router'; import { ChevronLeft, ServerOff, WifiOff } from 'lucide-react-native'; import React, { useCallback, useEffect, useState } from 'react'; import { RefreshControl, ScrollView, Text, TouchableOpacity, View } from 'react-native'; export default function AutomationDetailScreen() { const router = useRouter(); const params = useLocalSearchParams(); const [area, setArea] = useState(null); const [devices, setDevices] = useState([]); const [isLoading, setIsLoading] = useState(true); const [refreshing, setRefreshing] = useState(false); // Fetch dei devices dell'area const fetchAreaDevices = useCallback(async (areaId: string, isRefreshing = false) => { try { if (!isRefreshing) setIsLoading(true); // Fetch Documenti const response = await getHaEntitiesByArea(areaId); const filteredDevices = response.filter(device => device.name); setDevices(filteredDevices); } catch (error) { console.error('Errore nel recupero dei dispositivi dell\'area:', error); } finally { setIsLoading(false); setRefreshing(false); } }, []); useEffect(() => { if (params.areaData) { try { const jsonString = Array.isArray(params.areaData) ? params.areaData[0] : params.areaData; const parsedArea = JSON.parse(jsonString); setArea(parsedArea); } catch (error) { console.error('Errore nel parsing dei dati del cantiere:', error); } } }, [params.areaData]); useEffect(() => { if (params.id) { setIsLoading(true); const areaId = Array.isArray(params.id) ? params.id[0] : params.id; fetchAreaDevices(areaId); } }, [params.id, fetchAreaDevices]); const onRefresh = () => { setRefreshing(true); const areaId = Array.isArray(params.id) ? params.id[0] : params.id; fetchAreaDevices(areaId, true); }; const onToggle = useCallback((entityId: string) => { // Optimistic UI update setDevices(prevDevices => prevDevices.map(d => d.entity_id === entityId ? { ...d, state: d.state === 'on' ? 'off' : 'on' } : d ) ); // Fire and forget the API call toggleHaEntity(entityId).catch(() => { // Revert on error console.log("Toggle failed, reverting UI."); const areaId = Array.isArray(params.id) ? params.id[0] : params.id; if (areaId) fetchAreaDevices(areaId); }); }, [fetchAreaDevices, params.id]); if (isLoading) { return ; } if (!area) { return ( Area non trovata L'area che stai cercando non esiste o รจ stata rimossa. router.back()} className="mt-4 bg-[#099499] px-6 py-3 rounded-xl active:scale-95"> Torna Indietro ); } return ( router.back()} className='rounded-full active:bg-gray-100'> {area.name} 0 ? 'justify-start' : 'justify-center'}`} refreshControl={} > {devices.length > 0 ? ( {devices.map(device => ( ))} ) : ( Nessun dispositivo Non ci sono dispositivi in quest'area. )} ); }