"use client" import { useEffect, useMemo, useRef, useState, type ReactNode, type RefObject } from "react" import { FormField, FormToggle, SegmentedControl } from "@/components/form-kit" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, } from "@/components/ui/sheet" import { Stepper, StepperContent, StepperIndicator, StepperItem, StepperNav, StepperPanel, StepperSeparator, StepperTitle, StepperTrigger, } from "@/components/reui/stepper" import { Badge } from "@/components/reui/badge" import { IconTile } from "@/components/reui/icon-tile" import { Frame, FramePanel } from "@/components/reui/frame" import { Item, ItemActions, ItemContent, ItemMedia, ItemTitle, } from "@/components/ui/item" import { Flag } from "@/components/flag" import { StatusDot } from "@/components/status-dot" import { cn } from "@/lib/utils" import type { InterfaceCatalogState } from "@mmapp/contracts/users" import { can } from "@/lib/auth" import { readInterfaceCatalogState, userApiError } from "@/shared/api/users" import { TYPE_VARIANT } from "@/components/data-grids/users-expanded-detail" import { bindingDiffKey, bindingTitle, catalogForServer, defaultSections, defaultServers, IFACE_TYPE_LABEL, PERM_COLOR, PERM_OPTS, ROLE_LABEL, SECTION_GROUP_DEFS, type AppUser, type AppUserForm, type InterfaceBinding, type InterfaceType, type PermLevel, type Role, type UserServerOption, } from "@/lib/users" import { CableIcon, ChevronDownIcon, EyeIcon, KeyRoundIcon, LayoutDashboardIcon, LockIcon, NetworkIcon, PlusIcon, ServerIcon, ShieldIcon, TrashIcon, WrenchIcon, } from "lucide-react" const IFACE_TILE: Record = { ether: { icon: CableIcon, className: "text-muted-foreground" }, gre: { icon: NetworkIcon, className: "text-info" }, wg: { icon: ShieldIcon, className: "text-success" }, ipsec: { icon: LockIcon, className: "text-info" }, other: { icon: CableIcon, className: "text-muted-foreground" }, } type CatalogPick = { interfaceName: string peerPublicKey: string peerName?: string type: InterfaceType } function pickKey(p: CatalogPick): string { return `${p.interfaceName}\0${p.peerPublicKey}` } const SECTION_GROUP_ICONS: Record = { "Обзор":