"use client" import { useEffect, useMemo, useState } from "react" import type { IpsecPeerDto } from "@mmapp/contracts/ipsec" 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" export type IpsecPeerFormState = { name: string address: string exchangeMode: string passive: boolean certificate: string profile: string disabled: boolean } export const defaultIpsecPeerForm = (): IpsecPeerFormState => ({ name: "", address: "0.0.0.0/0", exchangeMode: "ike2", passive: true, certificate: "", profile: "", disabled: false, }) const EXCHANGE_MODES = ["ike2", "main", "aggressive", "base"] /** Редактирование существующего peer (сервера) RouterOS. */ function IpsecPeerSheet({ open, onOpenChange, busy, editing, certificates, onSubmit, }: { open: boolean onOpenChange: (v: boolean) => void busy?: boolean editing: IpsecPeerDto | null certificates: string[] onSubmit: (form: IpsecPeerFormState) => void | Promise }) { const [form, setForm] = useState(defaultIpsecPeerForm) const set = (k: K, v: IpsecPeerFormState[K]) => setForm((f) => ({ ...f, [k]: v })) useEffect(() => { if (!open || !editing) return queueMicrotask(() => setForm({ name: editing.name, address: editing.address ?? "", exchangeMode: editing.exchangeMode ?? "ike2", passive: editing.passive ?? false, certificate: editing.certificate ?? "", profile: editing.profile ?? "", disabled: editing.disabled, })) }, [open, editing]) const canSubmit = useMemo(() => form.name.trim().length > 0, [form.name]) return ( {editing ? `Peer «${editing.name}»` : "Peer"} {editing?.managed ? "Managed peer: изменения применяются напрямую на роутере" : "Существующий peer RouterOS: изменения применяются напрямую"}
Основные set("name", e.target.value)} /> set("address", e.target.value)} /> set("certificate", e.target.value)} /> {certificates.map((c) => set("profile", e.target.value)} />
Состояние

Passive

set("passive", v)} />

Отключён

set("disabled", v)} />
}> Отмена
) } export { IpsecPeerSheet }