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>
 | 
						|
  );
 | 
						|
}
 |