import EasyModal, { useModal } from "ez-modal-react"; import { useState, useEffect } from "react"; import Modal from "react-bootstrap/Modal"; import { Button } from "src/components"; import type { WgInterface } from "src/api/backend/wireguard"; interface WireGuardClientModalProps { interfaces: WgInterface[]; defaultInterfaceId?: number; } const WireGuardClientModal = EasyModal.create(({ interfaces, defaultInterfaceId }: WireGuardClientModalProps) => { const modal = useModal(); const [name, setName] = useState(""); const [selectedInterfaceId, setSelectedInterfaceId] = useState(0); const [storageLimitMb, setStorageLimitMb] = useState(500); const [txLimit, setTxLimit] = useState(0); const [rxLimit, setRxLimit] = useState(0); useEffect(() => { if (defaultInterfaceId) { setSelectedInterfaceId(defaultInterfaceId); } else if (interfaces && interfaces.length > 0) { setSelectedInterfaceId(interfaces[0].id); } }, [interfaces, defaultInterfaceId]); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (name.trim() && selectedInterfaceId) { modal.resolve({ name: name.trim(), interface_id: selectedInterfaceId, storage_limit_mb: storageLimitMb, tx_limit: txLimit, rx_limit: rxLimit }); modal.hide(); } }; const handleClose = () => { modal.resolve(null); modal.hide(); }; return (
{ e.stopPropagation(); handleSubmit(e); }}> New WireGuard Client
setName(e.target.value)} autoFocus required />
A friendly name to identify this client.
{interfaces && interfaces.length > 0 && (
Select which server this client will connect to.
)}
Limits & Quotas
setStorageLimitMb(Number(e.target.value))} min="0" required />
Maximum size of encrypted file storage per client. 0 = Unlimited.
setTxLimit(Number(e.target.value))} min="0" required />
Optional. 0 = Unlimited.
setRxLimit(Number(e.target.value))} min="0" required />
Optional. 0 = Unlimited.
); }); export default WireGuardClientModal;