import { useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { ArrowLeft } from "lucide-react"; import type { Host } from "@/types/ui-types"; import type { HostDefaultsTarget } from "@/api/host-defaults-api"; import { HostEditor } from "../HostEditor"; import { isSshGroupTab, makeHostSshSubTabs, makeHostTabs, TabStrip, useHostEditorSections, } from "../HostManagerTabs"; import { listHostProtocols, type HostProtocols } from "../host-protocols"; export interface HostDefaultsEditorTarget extends HostDefaultsTarget { /** The folder's path, shown as the title. */ folderName?: string; } /** * The host editor as a form for one level of host defaults: the same tabs * and fields as a new host, minus what only one host can have (its name, * address, secrets, folder). */ export function HostDefaultsEditorView({ target, onClose, onDirtyChange, hosts, credentials, }: { target: HostDefaultsEditorTarget; onClose: () => void; onDirtyChange?: (dirty: boolean) => void; hosts: Host[]; credentials: { id: string; name: string; username: string }[]; }) { const { t } = useTranslation(); useHostEditorSections(); const [activeTab, setActiveTab] = useState("general"); // Every protocol counts as on, so every tab that has defaults shows. const protocols = useMemo(() => { const all: HostProtocols = { enableSsh: true }; for (const protocol of listHostProtocols()) all[protocol.settingKey] = true; return all; }, []); const flags = protocols as unknown as Record; const tabs = makeHostTabs(t, flags, true); const sshSubTabs = makeHostSshSubTabs(t, flags, true); const inSshGroup = isSshGroupTab(activeTab); const title = target.level === "admin" ? t("hostDefaults.titleAdmin") : target.level === "user" ? t("hostDefaults.titleUser") : t("hostDefaults.titleFolder", { name: target.folderName ?? "" }); const description = target.level === "admin" ? t("hostDefaults.descriptionAdmin") : target.level === "user" ? t("hostDefaults.descriptionUser") : t("hostDefaults.descriptionFolder"); return (
{ if (id === "ssh") { if (!inSshGroup) setActiveTab("ssh"); } else { setActiveTab(id); } }} isActive={(id) => (id === "ssh" ? inSshGroup : activeTab === id)} /> {inSshGroup && ( )}

{description}

{}} onDirtyChange={onDirtyChange} onTabChange={setActiveTab} hosts={hosts} credentials={credentials} defaultsTarget={target} />
); }