"use client" import { useEffect, useMemo, useState } from "react" import { FormField, FormToggle, SectionTitle } from "@/components/form-kit" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription, SheetFooter, SheetClose, } from "@/components/ui/sheet" import { ChevronDownIcon, ChevronRightIcon } from "lucide-react" export type WgCreateFormState = { serverId: string name: string listenPort: string mtu: string comment: string address: string enabled: boolean showAdvanced: boolean peerEnabled: boolean peerPublicKey: string peerAllowedIps: string peerEndpoint: string peerKeepalive: string peerComment: string } export const defaultWgCreateForm = (): WgCreateFormState => ({ serverId: "", name: "", listenPort: "13231", mtu: "1420", comment: "", address: "", enabled: true, showAdvanced: false, peerEnabled: false, peerPublicKey: "", peerAllowedIps: "", peerEndpoint: "", peerKeepalive: "25", peerComment: "", }) type ServerOption = { id: string; name: string; host: string } function WgCreateSheet({ open, onOpenChange, servers, busy, defaultServerId, onSubmit, }: { open: boolean onOpenChange: (v: boolean) => void servers: ServerOption[] busy?: boolean defaultServerId?: string onSubmit: (form: WgCreateFormState) => void | Promise }) { const [form, setForm] = useState(defaultWgCreateForm) const set = (k: K, v: WgCreateFormState[K]) => setForm((f) => ({ ...f, [k]: v })) useEffect(() => { if (!open) return setForm({ ...defaultWgCreateForm(), serverId: defaultServerId ?? "" }) }, [open, defaultServerId]) const canSubmit = useMemo(() => { return Boolean(form.serverId && form.name.trim() && form.listenPort) }, [form.serverId, form.name, form.listenPort]) return ( Быстрый туннель WireGuard Создать интерфейс на выбранном MikroTik (ключи сгенерирует RouterOS)
Основные set("name", e.target.value)} />
set("listenPort", e.target.value)} /> set("mtu", e.target.value)} />
set("comment", e.target.value)} placeholder="MSK → SPB overlay" />

Включён

disabled=no на роутере

set("enabled", v)} />
{form.showAdvanced && (
set("address", e.target.value)} />

Добавить первого пира

Сразу после создания интерфейса

set("peerEnabled", v)} />
{form.peerEnabled && (
set("peerPublicKey", e.target.value)} /> set("peerAllowedIps", e.target.value)} /> set("peerEndpoint", e.target.value)} /> set("peerKeepalive", e.target.value)} /> set("peerComment", e.target.value)} />
)}
)}
}> Отмена
) } export { WgCreateSheet }