import * as vscode from "vscode"; import { healthClient } from "../../client"; import { ext } from "../../extensionVariables"; import { HealthTreeItem } from "./HealthTreeItem"; import * as dayjs from "dayjs"; import * as localizedFormat from "dayjs/plugin/localizedFormat"; import { healthTooltips } from "../../appwrite/Health"; import { AppwriteHealth } from "../../appwrite"; import { promiseWithTimeout } from "../../utils/promiseWithTimeout"; // dayjs.extend(relativeTime); dayjs.extend(localizedFormat); export class HealthTreeItemProvider implements vscode.TreeDataProvider { private _onDidChangeTreeData: vscode.EventEmitter = new vscode.EventEmitter< HealthTreeItem | undefined | void >(); private lastChecked: Date = new Date(); readonly onDidChangeTreeData: vscode.Event = this._onDidChangeTreeData.event; refresh(): void { this._onDidChangeTreeData.fire(); } getTreeItem(element: HealthTreeItem): vscode.TreeItem { return element; } async getChildren(element?: HealthTreeItem): Promise { if (healthClient === undefined) { return []; } // get children for root if (element === undefined) { try { const health = await promiseWithTimeout( 10000, async () => { try { return await healthClient?.checkup(); } catch (e) { vscode.window.showErrorMessage('Could not connect to Appwrite project'); } }, "Health request timed out" ); if (health === undefined) { return []; } ext.outputChannel?.append(JSON.stringify(health, null, 4)); const healthItems = Object.entries(health).map(([service, status]) => { return new HealthTreeItem(service, status, healthTooltips[service as keyof AppwriteHealth]); }); this.lastChecked = new Date(); return [ { label: `Updated at ${dayjs(this.lastChecked).format("LTS")}`, }, ...healthItems, ]; } catch (e) { // } } return []; } }