69 lines
2.5 KiB
TypeScript
69 lines
2.5 KiB
TypeScript
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<vscode.TreeItem> {
|
|
private _onDidChangeTreeData: vscode.EventEmitter<HealthTreeItem | undefined | void> = new vscode.EventEmitter<
|
|
HealthTreeItem | undefined | void
|
|
>();
|
|
|
|
private lastChecked: Date = new Date();
|
|
|
|
readonly onDidChangeTreeData: vscode.Event<HealthTreeItem | undefined | void> = this._onDidChangeTreeData.event;
|
|
|
|
refresh(): void {
|
|
this._onDidChangeTreeData.fire();
|
|
}
|
|
|
|
getTreeItem(element: HealthTreeItem): vscode.TreeItem {
|
|
return element;
|
|
}
|
|
|
|
async getChildren(element?: HealthTreeItem): Promise<vscode.TreeItem[]> {
|
|
if (healthClient === undefined) {
|
|
return [];
|
|
}
|
|
|
|
// get children for root
|
|
if (element === undefined) {
|
|
try {
|
|
const health = await promiseWithTimeout<AppwriteHealth | undefined>(
|
|
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 [];
|
|
}
|
|
}
|