import { useEffect, useState } from "react"; import { ActivityIndicator, Button, ConfirmationModal, Icon, IconButton, ResourceList, ResourceRow, Select, StatusBadge, TextAreaField, TextField, Window, WindowFooterActions } from "@nodedc/ui-react"; import { request } from "./api"; import { useAccess, type AccessKey } from "./useAccess"; export function SystemAccess({ revision, failure, success, adding, closeAdd, startAdd }: { revision: string; failure: (error: unknown) => void; success: (message: string) => void; adding: boolean; closeAdd: () => void; startAdd?: () => void }) { const { access, loading, refresh } = useAccess(revision, failure); const [user, setUser] = useState(""); const [label, setLabel] = useState(""); const [key, setKey] = useState(""); const [pending, setPending] = useState(false); const [remove, setRemove] = useState(null); const [detail, setDetail] = useState(null); useEffect(() => { if (access) setUser(current => access.users.includes(current) ? current : access.users[0] ?? ""); }, [access]); useEffect(() => { if (!adding) { setLabel(""); setKey(""); } }, [adding]); async function add(event: React.FormEvent) { event.preventDefault(); if (pending) return; setPending(true); try { await request("/api/access", "POST", { user, label, key: key.trim() }); await refresh(); closeAdd(); success("Доступ устройства добавлен"); } catch (error) { failure(error); } finally { setPending(false); } } return

Компьютеры, которым разрешён вход по SSH через Node.

{loading ? "Проверяем SSH" : !access ? "Нет сведений" : access.ssh_ready ? "SSH отвечает локально" : "SSH не отвечает"}
{loading && !access ? : !access ?

Не удалось загрузить список. Повторите обновление.

: <> {access.keys.length === 0 ?

Доверенных устройств пока нет. Добавьте компьютер, которому нужен доступ.

: {access.keys.map(item =>
  • } title={item.label} description={`Пользователь системы: ${item.user}`} metadata={{item.id}} status={Доступ разрешён} actions={<> setDetail(item)}> setRemove(item)}>} />
  • )}
    }

    Разрешённый ключ не означает, что компьютер сейчас подключён. Отзыв закрывает новые подключения через Node; открытые сеансы и отдельно настроенные способы входа в систему сохраняются.

    } {startAdd && } { if (!pending) closeAdd(); }} footer={}> {!access ?

    {loading ? "Получаем пользователей системы…" : "Не удалось получить пользователей. Закройте окно и обновите список."}

    : access.users.length === 0 ?

    Не найдены администраторы системы. Добавьте пользователя в настройках системы.

    :
    setLabel(event.target.value)} autoComplete="off" />