import { useState } from "react"; import { ActivityIndicator, Button, Icon, ResourceList, ResourceRow, SettingsCard, StatusBadge } from "@nodedc/ui-react"; import { environmentSetupAvailable } from "./api"; import type { useEnvironment } from "./useEnvironment"; import { TailnetAccess } from "./TailnetAccess"; import { SystemAccess } from "./SystemAccess"; const labels:Record={pending:"Ожидает",running:"Выполняется",error:"Ошибка",blocked:"Не выполнено"}; export function EnvironmentView({environment,failure,success}: {environment:ReturnType;failure:(error:unknown)=>void;success:(text:string)=>void}) { const {value,pending,running,loading,start}=environment; const [adding,setAdding]=useState(false); const revision=String(value?.run?.updated_at??0); const complete=value?.run?.state==="complete"&&value.run.profile_revision===value.profile.revision; return

Сконфигурируйте окружение при первом запуске или повторите проверку после изменений. Приложение установит нужные пакеты, настроит службы и получит системные сведения. Вход в частную сеть и доверенный SSH-ключ подтверждаются ниже.

{!environmentSetupAvailable()&&

Настройка запускается из установленного приложения на БК.

} {pending&&(!value?.run||value.run.state!=="running")&&} {!value?loading?:

Сведения о настройке недоступны. Обновите страницу.

:<> {!value.available&&

Журнал предыдущего запуска недоступен. Нажмите «Сконфигурировать» — приложение восстановит доступ и выполнит этапы заново.

} {value.profile.steps.map(specification=>{ const step=value.run?.steps.find(item=>item.id===specification.id); const state=step?.state??"pending"; return
  • :} title={specification.label} description={specification.description} metadata={step?.detail} status={state==="complete"?:{labels[state]??"Неизвестно"}} />
  • ; })}
    {value.run&&!running&&value.run.updated_at>0&&

    Результат проверки от {new Date(value.run.updated_at*1000).toLocaleString("ru-RU")}.

    } {complete&&!running&&

    Системные этапы завершены. Ниже проверьте вход в Tailscale и доверенный ключ для SSH.

    } {value.run?.state==="error"&&!running&&

    Часть этапов не завершена. Исправьте указанные причины и повторите настройку.

    } {value.run?.state==="interrupted"&&

    Предыдущая настройка прервана. Повторный запуск проверит уже выполненные этапы.

    } }
    {!running&&<> setAdding(false)} startAdd={()=>setAdding(true)} /> }
    ; }