mirror of https://github.com/jetkvm/kvm.git
86 lines
2.6 KiB
TypeScript
86 lines
2.6 KiB
TypeScript
import { Button } from "@components/Button";
|
|
import Card from "@components/Card";
|
|
import { FieldError } from "@components/InputField";
|
|
import { LuPlus, LuSend, LuTrash2 } from "react-icons/lu";
|
|
|
|
export interface StoredDevice {
|
|
name: string;
|
|
macAddress: string;
|
|
}
|
|
|
|
interface DeviceListProps {
|
|
storedDevices: StoredDevice[];
|
|
errorMessage: string | null;
|
|
onSendMagicPacket: (macAddress: string) => void;
|
|
onDeleteDevice: (index: number) => void;
|
|
onCancelWakeOnLanModal: () => void;
|
|
setShowAddForm: (show: boolean) => void;
|
|
}
|
|
|
|
export default function DeviceList({
|
|
storedDevices,
|
|
errorMessage,
|
|
onSendMagicPacket,
|
|
onDeleteDevice,
|
|
onCancelWakeOnLanModal,
|
|
setShowAddForm,
|
|
}: DeviceListProps) {
|
|
return (
|
|
<div className="space-y-4">
|
|
<Card className="opacity-0 animate-fadeIn">
|
|
<div className="w-full divide-y divide-slate-700/30 dark:divide-slate-600/30">
|
|
{storedDevices.map((device, index) => (
|
|
<div key={index} className="flex items-center justify-between p-3 gap-x-2">
|
|
<div className="space-y-0.5">
|
|
<p className="text-sm font-semibold leading-none text-slate-900 dark:text-slate-100">{device?.name}</p>
|
|
<p className="text-sm text-slate-600 dark:text-slate-400">
|
|
{device.macAddress?.toLowerCase()}
|
|
</p>
|
|
</div>
|
|
|
|
{errorMessage && <FieldError error={errorMessage} />}
|
|
<div className="flex items-center space-x-2">
|
|
<Button
|
|
size="XS"
|
|
theme="light"
|
|
text="Wake"
|
|
LeadingIcon={LuSend}
|
|
onClick={() => onSendMagicPacket(device.macAddress)}
|
|
/>
|
|
<Button
|
|
size="XS"
|
|
theme="danger"
|
|
LeadingIcon={LuTrash2}
|
|
onClick={() => onDeleteDevice(index)}
|
|
aria-label="Delete device"
|
|
/>
|
|
</div>
|
|
</div>
|
|
))}
|
|
</div>
|
|
</Card>
|
|
<div
|
|
className="flex items-center justify-end space-x-2 opacity-0 animate-fadeIn"
|
|
style={{
|
|
animationDuration: "0.7s",
|
|
animationDelay: "0.2s",
|
|
}}
|
|
>
|
|
<Button
|
|
size="SM"
|
|
theme="blank"
|
|
text="Close"
|
|
onClick={onCancelWakeOnLanModal}
|
|
/>
|
|
<Button
|
|
size="SM"
|
|
theme="primary"
|
|
text="Add New Device"
|
|
onClick={() => setShowAddForm(true)}
|
|
LeadingIcon={LuPlus}
|
|
/>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|