From 3e67d6689dfb69fb067a6a81a5db71f6d147664e Mon Sep 17 00:00:00 2001 From: Chris Wanstrath Date: Mon, 6 Oct 2025 22:13:13 -0700 Subject: [PATCH] browse tweaks --- src/js/commands.ts | 12 +++++++++++- src/js/scrollback.ts | 6 ++++++ src/js/webapp.ts | 12 ++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/js/commands.ts b/src/js/commands.ts index 029603b..a798759 100644 --- a/src/js/commands.ts +++ b/src/js/commands.ts @@ -9,11 +9,21 @@ import { resize } from "./resize" import { sessionId } from "./session" import { send } from "./websocket" import { status } from "./statusbar" +import { setStatus, latestId } from "./scrollback" +import { currentAppUrl } from "./webapp" export const commands: string[] = [] export const browserCommands: Record void | Promise | CommandOutput> = { - browse: (url: string) => openBrowser(url, "command"), + browse: (url?: string) => { + const currentUrl = url ?? currentAppUrl() + if (currentUrl) { + openBrowser(currentUrl, "command") + } else { + setTimeout(() => setStatus(latestId()!, "error"), 0) + return "usage: browse " + } + }, "browser-session": () => sessionId, clear: () => scrollback.innerHTML = "", commands: () => { diff --git a/src/js/scrollback.ts b/src/js/scrollback.ts index 3304e62..9e00190 100644 --- a/src/js/scrollback.ts +++ b/src/js/scrollback.ts @@ -22,6 +22,12 @@ export function insert(node: HTMLElement) { scrollback.append(node) } +export function latestId(): string | undefined { + const nodes = document.querySelectorAll("[data-id]") + if (nodes.length) + return (nodes[nodes.length - 1] as HTMLElement).dataset.id +} + export function addInput(id: string, input: string, status?: InputStatus) { const parent = $$("li.input") const statusSpan = $$(`span.status.${statusColors[status || "waiting"]}`, "•") diff --git a/src/js/webapp.ts b/src/js/webapp.ts index cb1494d..66860dc 100644 --- a/src/js/webapp.ts +++ b/src/js/webapp.ts @@ -1,6 +1,8 @@ //// // NOSE webapps +import { sessionStore } from "./session" + export const apps: string[] = [] export function cacheApps(a: string[]) { @@ -9,4 +11,14 @@ export function cacheApps(a: string[]) { apps.sort() window.dispatchEvent(new CustomEvent("apps:change")) +} + +export function currentAppUrl(): string | undefined { + const project = sessionStore.get("project") || "root" + + if (!apps.includes(project)) return + + const hostname = sessionStore.get("hostname") || "localhost" + const s = hostname.startsWith("localhost") ? "" : "s" + return `http${s}://${project}.${hostname}` } \ No newline at end of file