import { ArrowLeft, Layers3, MemoryStick, Wifi } from "lucide-react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { Link, useParams } from "react-router-dom"; import { api } from "../api/client"; import type { DeviceGroup, DeviceState } from "../api/types"; import { DeviceCard } from "../components/DeviceCard"; import { RgbControlPanel } from "../components/RgbControlPanel"; import { useToast } from "../components/Toast"; import { Badge, ErrorPanel, LoadingGrid, PageHeader } from "../components/ui"; export function DeviceGroupPage() { const { groupId = "" } = useParams(); const queryClient = useQueryClient(); const { notify } = useToast(); const query = useQuery({ queryKey: ["device-group", groupId], queryFn: () => api(`/api/v1/device-groups/${groupId}`), }); const command = useMutation({ mutationFn: (state: DeviceState) => api<{ status: string; results: Array<{ status: string }> }>(`/api/v1/device-groups/${groupId}/state`, { method: "POST", body: JSON.stringify({ state }), }), onSuccess: (result) => { const failed = result.results.filter((item) => item.status === "failed").length; notify(failed ? `${failed} RAM-modules konden niet worden bijgewerkt.` : "RAM-groep bijgewerkt.", failed ? "danger" : "success"); void queryClient.invalidateQueries({ queryKey: ["device-group", groupId] }); void queryClient.invalidateQueries({ queryKey: ["device-groups"] }); void queryClient.invalidateQueries({ queryKey: ["devices"] }); void queryClient.invalidateQueries({ queryKey: ["system"] }); }, onError: (error) => notify(error instanceof Error ? error.message : "RAM-groepsopdracht mislukt.", "danger"), }); if (query.isLoading) return ; if (query.error || !query.data) return void query.refetch()} />; const group = query.data; const disabled = group.online_count === 0 || group.devices.every((device) => device.read_only || device.blocked); return <> Terug naar apparaten
{group.online_count}/{group.module_count} online Als groep bedienbaar {group.mixed ? Gemengde toestand : null}
command.mutate(state)} />
{group.module_count} modules Groepsopdrachten worden afzonderlijk bevestigd en blijvend opgeslagen per fysieke module.

Individuele RAM-modules

Open een module om kleur, effect en overige mogelijkheden uitsluitend daarop toe te passen.

{group.devices.map((device, index) => )}
; } function moduleAddress(location: string | null) { const address = location?.match(/address (0x[0-9a-f]+)/i)?.[1]; return address?.toUpperCase() ?? "onbekend adres"; }