"use client" import { useEffect, useMemo, useState } from "react" import { FormField, SectionTitle } from "@/components/form-kit" import { Button } from "@/components/ui/button" import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription, SheetFooter, SheetClose, } from "@/components/ui/sheet" import { detectWgConfigFormat, parseWgConfig, type WgParsedConfig } from "@/lib/wg-config" import { UploadIcon } from "lucide-react" type ServerOption = { id: string; name: string; host: string } function WgImportSheet({ open, onOpenChange, servers, busy, defaultServerId, onImport, }: { open: boolean onOpenChange: (v: boolean) => void servers: ServerOption[] busy?: boolean defaultServerId?: string onImport: (args: { serverId: string content: string format: "auto" | "rsc" | "conf" dryRun: boolean }) => Promise }) { const [serverId, setServerId] = useState("") const [content, setContent] = useState("") const [format, setFormat] = useState<"auto" | "rsc" | "conf">("auto") const [preview, setPreview] = useState(null) const [parseError, setParseError] = useState(null) const detected = useMemo( () => (content.trim() ? detectWgConfigFormat(content) : null), [content], ) useEffect(() => { if (!open) return setServerId(defaultServerId ?? "") }, [open, defaultServerId]) function runPreview() { setParseError(null) setPreview(null) try { setPreview(parseWgConfig(content, format)) } catch (e) { setParseError(e instanceof Error ? e.message : "Ошибка разбора") } } function onFile(file: File | null) { if (!file) return const reader = new FileReader() reader.onload = () => { setContent(String(reader.result ?? "")) setPreview(null) setParseError(null) } reader.readAsText(file) } return ( { if (v) { setServerId(defaultServerId ?? "") } else { setContent("") setPreview(null) setParseError(null) setServerId("") } onOpenChange(v) }} > Импорт конфига WireGuard Native .conf или MikroTik .rsc → применить на выбранный роутер
Содержимое