Path: blob/master/gate-controller/components/RelayListTab.tsx
1079 views
'use client';12import { useState, useEffect } from 'react';3import { invoke } from '@tauri-apps/api/core';4import { Button } from '@/components/ui/button';5import { toast } from 'sonner';6import { ConfiguredRelayCard } from '@/components/ConfiguredRelayCard';7import { AddRelayDialog } from '@/components/AddRelayDialog';8import { PlusCircle } from 'lucide-react';910interface ConfiguredRelay {11id: string;12type: 'ch340' | 'hw348' | 'cp210x';13channels?: number;14}1516export function RelayListTab() {17const [relays, setRelays] = useState<ConfiguredRelay[]>([]);18const [isAddDialogOpen, setAddDialogOpen] = useState(false);1920const fetchConfiguredRelays = async () => {21try {22const configuredRelays = await invoke<ConfiguredRelay[]>('get_configured_relays');23setRelays(configuredRelays);24} catch (error) {25toast.error('Failed to load relay configuration', { description: String(error) });26}27};2829useEffect(() => {30fetchConfiguredRelays();31}, []);3233return (34<div className="w-full h-full flex flex-col space-y-4">35<div className="flex items-center justify-between flex-shrink-0">36<h2 className="text-2xl font-bold">Configured Relays</h2>37<Button onClick={() => setAddDialogOpen(true)}>38<PlusCircle className="w-4 h-4 mr-2" />39Add Relay40</Button>41</div>4243<div className="flex-grow min-h-0">44{relays.length > 0 ? (45<div className="h-full overflow-y-auto pr-2">46<div className="grid grid-cols-1 lg:grid-cols-2 gap-4">47{relays.map((relay) => (48<ConfiguredRelayCard key={relay.id} relay={relay} onRelayRemoved={fetchConfiguredRelays} />49))}50</div>51</div>52) : (53<div className="text-center h-full flex flex-col justify-center items-center py-12 px-6 border-2 border-dashed rounded-lg">54<h3 className="text-lg font-semibold text-muted-foreground">No Relays Configured</h3>55<p className="text-sm text-muted-foreground mt-1">Click "Add Relay" to get started.</p>56</div>57)}58</div>5960<AddRelayDialog61open={isAddDialogOpen}62onOpenChange={setAddDialogOpen}63onRelayAdded={fetchConfiguredRelays}64/>65</div>66);67}686970