Files
Termix/src/ui/manage/manage-requests.ts
T

74 lines
2.3 KiB
TypeScript
Raw Normal View History

2026-10-10 14:58:27 -05:00
import type { HostDraft } from "@termix-ssh/plugin-sdk/frontend";
import type { HostDefaultsLevel } from "@/types/host-defaults";
export type ManageMode = "hosts" | "credentials" | "defaults";
/** What to open in the Manage tab. */
export type ManageRequest =
| { kind: "host"; hostId: string | null; draft?: HostDraft }
| { kind: "credential"; credentialId: string | null }
| { kind: "defaults"; level: HostDefaultsLevel; folderName?: string }
| { kind: "browse"; mode: ManageMode };
export const MANAGE_REQUEST_EVENT = "manage:request";
let pending: ManageRequest | null = null;
/**
* Parks a request for the Manage tab and pokes it. The shell opens the tab on
* the same event, and the tab claims the parked request once it mounts.
*/
export function requestManage(request: ManageRequest): void {
pending = request;
window.dispatchEvent(new Event(MANAGE_REQUEST_EVENT));
}
/** Takes the parked request, leaving none behind. */
export function takePendingManageRequest(): ManageRequest | null {
const request = pending;
pending = null;
return request;
}
/**
* The window events older callers fire (the dashboard, folder menus, the
* palette), turned into a request. Null for anything else.
*/
export function requestFromLegacyEvent(
name: string,
detail?: unknown,
): ManageRequest | null {
switch (name) {
case "host-manager:add-host":
return {
kind: "host",
hostId: null,
draft: (detail as HostDraft | undefined) ?? undefined,
};
case "host-manager:edit-host":
return detail ? { kind: "host", hostId: String(detail) } : null;
case "host-manager:add-credential":
return { kind: "credential", credentialId: null };
case "host-manager:show-credentials":
return { kind: "browse", mode: "credentials" };
case "host-manager:edit-defaults":
case "termix:open-host-defaults": {
const target = detail as
{ level?: HostDefaultsLevel; folderName?: string } | undefined;
if (!target?.level) return { kind: "browse", mode: "defaults" };
return {
kind: "defaults",
level: target.level,
folderName: target.folderName,
};
}
default:
return null;
}
}
/** Test seam. */
export function resetManageRequests(): void {
pending = null;
}