From cfe0f7f1b925c16402f16d79cbb5967654daea6e Mon Sep 17 00:00:00 2001 From: Nystik <236107-Nystik@users.noreply.gitlab.com> Date: Mon, 30 Mar 2026 01:05:20 +0200 Subject: [PATCH] server status bar indicator --- plugin/src/main.js | 6 +++++ plugin/src/status-bar.js | 48 ++++++++++++++++++++++++++++++++++++++++ plugin/styles.css | 25 +++++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 plugin/src/status-bar.js diff --git a/plugin/src/main.js b/plugin/src/main.js index cb10573..391a967 100644 --- a/plugin/src/main.js +++ b/plugin/src/main.js @@ -2,6 +2,7 @@ const { Plugin, TFile, TFolder } = require("obsidian"); const { showFilePicker, addFileMenuItems, addFolderMenuItems } = require("./file-actions"); const { patchSettingsModal, unpatchSettingsModal } = require("./settings/inject"); const pluginRegistry = require("./plugin-registry"); +const { initStatusBar } = require("./status-bar"); window.__obsidianAPI = require("obsidian"); @@ -11,6 +12,7 @@ class IgnisBridgePlugin extends Plugin { await pluginRegistry.refresh(); patchSettingsModal(this); + this._statusBarInterval = initStatusBar(this); this.addRibbonIcon("upload", "Upload file", () => { showFilePicker(this.app); @@ -28,6 +30,10 @@ class IgnisBridgePlugin extends Plugin { } onunload() { + if (this._statusBarInterval) { + clearInterval(this._statusBarInterval); + } + unpatchSettingsModal(this); console.log("[ignis-bridge] Plugin unloaded"); } diff --git a/plugin/src/status-bar.js b/plugin/src/status-bar.js new file mode 100644 index 0000000..f93b387 --- /dev/null +++ b/plugin/src/status-bar.js @@ -0,0 +1,48 @@ +function getWsStatus() { + const ws = window.__ignisWs; + + if (!ws) { + return "disconnected"; + } + + switch (ws.readyState) { + case WebSocket.CONNECTING: + return "connecting"; + case WebSocket.OPEN: + return "connected"; + default: + return "disconnected"; + } +} + +const STATUS_LABELS = { + connected: "Ignis server: Connected", + connecting: "Ignis server: Connecting...", + disconnected: "Ignis server: Disconnected", +}; + +function initStatusBar(plugin) { + const item = plugin.addStatusBarItem(); + item.addClass("ignis-statusbar-item"); + + const dot = item.createEl("span", { + cls: "ignis-statusbar-dot", + }); + + item.setAttribute("aria-label", "Ignis: Checking..."); + item.setAttribute("data-tooltip-position", "top"); + + const update = () => { + const status = getWsStatus(); + dot.className = `ignis-statusbar-dot ignis-statusbar-${status}`; + item.setAttribute("aria-label", STATUS_LABELS[status] || "Ignis: Unknown"); + }; + + update(); + + const interval = setInterval(update, 3000); + + return interval; +} + +module.exports = { initStatusBar }; diff --git a/plugin/styles.css b/plugin/styles.css index 0d0bf35..e9eb304 100644 --- a/plugin/styles.css +++ b/plugin/styles.css @@ -105,6 +105,31 @@ color: var(--text-muted); } +.ignis-statusbar-item { + display: flex; + align-items: center; + cursor: default; +} + +.ignis-statusbar-dot { + display: inline-block; + width: 8px; + height: 8px; + border-radius: 50%; +} + +.ignis-statusbar-connected { + background-color: var(--color-green); +} + +.ignis-statusbar-connecting { + background-color: var(--color-yellow); +} + +.ignis-statusbar-disconnected { + background-color: var(--color-red); +} + .ignis-plugins-description { padding: 0 16px; color: var(--text-muted);