Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
parkpow
GitHub Repository: parkpow/deep-license-plate-recognition
Path: blob/master/gate-controller/components/RelayListTab.tsx
1079 views
1
'use client';
2
3
import { useState, useEffect } from 'react';
4
import { invoke } from '@tauri-apps/api/core';
5
import { Button } from '@/components/ui/button';
6
import { toast } from 'sonner';
7
import { ConfiguredRelayCard } from '@/components/ConfiguredRelayCard';
8
import { AddRelayDialog } from '@/components/AddRelayDialog';
9
import { PlusCircle } from 'lucide-react';
10
11
interface ConfiguredRelay {
12
id: string;
13
type: 'ch340' | 'hw348' | 'cp210x';
14
channels?: number;
15
}
16
17
export function RelayListTab() {
18
const [relays, setRelays] = useState<ConfiguredRelay[]>([]);
19
const [isAddDialogOpen, setAddDialogOpen] = useState(false);
20
21
const fetchConfiguredRelays = async () => {
22
try {
23
const configuredRelays = await invoke<ConfiguredRelay[]>('get_configured_relays');
24
setRelays(configuredRelays);
25
} catch (error) {
26
toast.error('Failed to load relay configuration', { description: String(error) });
27
}
28
};
29
30
useEffect(() => {
31
fetchConfiguredRelays();
32
}, []);
33
34
return (
35
<div className="w-full h-full flex flex-col space-y-4">
36
<div className="flex items-center justify-between flex-shrink-0">
37
<h2 className="text-2xl font-bold">Configured Relays</h2>
38
<Button onClick={() => setAddDialogOpen(true)}>
39
<PlusCircle className="w-4 h-4 mr-2" />
40
Add Relay
41
</Button>
42
</div>
43
44
<div className="flex-grow min-h-0">
45
{relays.length > 0 ? (
46
<div className="h-full overflow-y-auto pr-2">
47
<div className="grid grid-cols-1 lg:grid-cols-2 gap-4">
48
{relays.map((relay) => (
49
<ConfiguredRelayCard key={relay.id} relay={relay} onRelayRemoved={fetchConfiguredRelays} />
50
))}
51
</div>
52
</div>
53
) : (
54
<div className="text-center h-full flex flex-col justify-center items-center py-12 px-6 border-2 border-dashed rounded-lg">
55
<h3 className="text-lg font-semibold text-muted-foreground">No Relays Configured</h3>
56
<p className="text-sm text-muted-foreground mt-1">Click &quot;Add Relay&quot; to get started.</p>
57
</div>
58
)}
59
</div>
60
61
<AddRelayDialog
62
open={isAddDialogOpen}
63
onOpenChange={setAddDialogOpen}
64
onRelayAdded={fetchConfiguredRelays}
65
/>
66
</div>
67
);
68
}
69
70