From fee31979f59d46be79ca516da31047c385da4a68 Mon Sep 17 00:00:00 2001 From: TJ Lavelle Date: Mon, 16 Dec 2024 16:52:17 -0500 Subject: [PATCH] Pull out session panel into its own registration function --- firebase-vscode/package.json | 2 +- firebase-vscode/src/core/index.ts | 20 +----- firebase-vscode/src/core/studio-provider.ts | 66 ------------------- firebase-vscode/src/extension.ts | 7 +- firebase-vscode/src/session/index.ts | 25 +++++++ .../src/session/session-provider.ts | 47 +++++++++++++ 6 files changed, 77 insertions(+), 90 deletions(-) delete mode 100644 firebase-vscode/src/core/studio-provider.ts create mode 100644 firebase-vscode/src/session/index.ts create mode 100644 firebase-vscode/src/session/session-provider.ts diff --git a/firebase-vscode/package.json b/firebase-vscode/package.json index 63fdf553ddc..6d3fd9f15fe 100644 --- a/firebase-vscode/package.json +++ b/firebase-vscode/package.json @@ -128,7 +128,7 @@ "initialSize": 1 }, { - "id": "firebase.studio", + "id": "firebase.session", "name": "Account and Project", "initialSize": 1 }, diff --git a/firebase-vscode/src/core/index.ts b/firebase-vscode/src/core/index.ts index ae546ab867f..67a0139e282 100644 --- a/firebase-vscode/src/core/index.ts +++ b/firebase-vscode/src/core/index.ts @@ -6,7 +6,7 @@ import { registerEnv } from "./env"; import { pluginLogger, LogLevel } from "../logger-wrapper"; import { getSettings } from "../utils/settings"; import { setEnabled } from "../../../src/experiments"; -import { currentUser, registerUser } from "./user"; +import { registerUser } from "./user"; import { currentProjectId, registerProject } from "./project"; import { registerQuickstart } from "./quickstart"; import { registerOptions } from "../options"; @@ -15,10 +15,7 @@ import { registerWebhooks } from "./webhook"; import { createE2eMockable } from "../utils/test_hooks"; import { runTerminalTask } from "../data-connect/terminal"; import { AnalyticsLogger } from "../analytics"; -import { StudioItem, StudioProvider } from "./studio-provider"; -import { login } from "../cli"; import { EmulatorsProvider } from "./emulators-provider"; -import { effect } from "@preact/signals-core"; export async function registerCore( broker: ExtensionBrokerImpl, @@ -99,8 +96,6 @@ export async function registerCore( }, ); - const studioTree = new StudioProvider(currentUser, currentProjectId); - return [ emulatorsController, Disposable.from( @@ -108,19 +103,6 @@ export async function registerCore( refreshCmd, emulatorsController, initSpy, - { - dispose: effect(() => { - studioTree.updateUser(currentUser.value ?? undefined); - }), - }, - { - dispose: effect(() => { - studioTree.updateProject(currentProjectId.value); - }), - }, - vscode.window.createTreeView("firebase.studio", { - treeDataProvider: studioTree, - }), vscode.window.createTreeView("firebase.emulators", { treeDataProvider: new EmulatorsProvider(), }), diff --git a/firebase-vscode/src/core/studio-provider.ts b/firebase-vscode/src/core/studio-provider.ts deleted file mode 100644 index 6e68a55228b..00000000000 --- a/firebase-vscode/src/core/studio-provider.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { effect, Signal, ReadonlySignal } from "@preact/signals-core"; -import * as vscode from "vscode"; -import { User } from "./user"; - -export class StudioProvider - implements vscode.TreeDataProvider -{ - private readonly userItem = new UserItem(); - private readonly projectItem = new ProjectItem(); - - constructor( - public readonly currentUser: Signal, - public readonly currentProjectId: ReadonlySignal, - ) {} - - getTreeItem(element: StudioItem | UserItem): vscode.TreeItem { - return element; - } - - getChildren( - element?: vscode.TreeItem, - ): Array { - return [this.userItem, this.projectItem]; - } - - _onDidChangeTreeData: vscode.EventEmitter = - new vscode.EventEmitter(); - onDidChangeTreeData = this._onDidChangeTreeData.event; - - updateUser(user?: User) { - this.userItem.label = user?.email ?? "Not logged in"; - this._onDidChangeTreeData.fire(this.userItem); - } - - updateProject(projectId?: string) { - this.projectItem.label = projectId ?? "No project selected"; - this._onDidChangeTreeData.fire(this.projectItem); - } -} - -export class StudioItem extends vscode.TreeItem { - constructor( - public readonly label: string, - public readonly collapsibleState: vscode.TreeItemCollapsibleState, - ) { - super(label, collapsibleState); - } - - iconPath = new vscode.ThemeIcon("account"); -} - -class UserItem extends vscode.TreeItem { - constructor() { - super("", vscode.TreeItemCollapsibleState.None); - } - - iconPath = new vscode.ThemeIcon("account"); -} - -class ProjectItem extends vscode.TreeItem { - constructor() { - super("", vscode.TreeItemCollapsibleState.None); - } - - iconPath = new vscode.ThemeIcon("project"); -} diff --git a/firebase-vscode/src/extension.ts b/firebase-vscode/src/extension.ts index d74ef6f6831..b1908aee1a8 100644 --- a/firebase-vscode/src/extension.ts +++ b/firebase-vscode/src/extension.ts @@ -18,13 +18,11 @@ import { } from "./utils/settings"; import { registerFdc } from "./data-connect"; import { AuthService } from "./auth/service"; -import { - AnalyticsLogger, - IDX_METRIC_NOTICE, -} from "./analytics"; +import { AnalyticsLogger, IDX_METRIC_NOTICE } from "./analytics"; import { env } from "./core/env"; import { suggestGraphqlSyntaxExtension } from "./data-connect/graphql-syntax-highlighter"; +import { registerSession } from "./session"; // This method is called when your extension is activated export async function activate(context: vscode.ExtensionContext) { @@ -72,6 +70,7 @@ export async function activate(context: vscode.ExtensionContext) { context, }), authService, + registerSession(), registerFdc( context, broker, diff --git a/firebase-vscode/src/session/index.ts b/firebase-vscode/src/session/index.ts new file mode 100644 index 00000000000..ba83e15d4d7 --- /dev/null +++ b/firebase-vscode/src/session/index.ts @@ -0,0 +1,25 @@ +import { effect } from "@preact/signals-core"; +import * as vscode from "vscode"; +import { SessionProvider } from "./session-provider"; +import { currentUser } from "../core/user"; +import { currentProjectId } from "../core/project"; + +export function registerSession(): vscode.Disposable { + const sessionProvider = new SessionProvider(); + + return vscode.Disposable.from( + { + dispose: effect(() => { + sessionProvider.updateEmail(currentUser.value?.email); + }), + }, + { + dispose: effect(() => { + sessionProvider.updateProjectId(currentProjectId.value); + }), + }, + vscode.window.createTreeView("firebase.session", { + treeDataProvider: sessionProvider, + }), + ); +} diff --git a/firebase-vscode/src/session/session-provider.ts b/firebase-vscode/src/session/session-provider.ts new file mode 100644 index 00000000000..0ca84476407 --- /dev/null +++ b/firebase-vscode/src/session/session-provider.ts @@ -0,0 +1,47 @@ +import * as vscode from "vscode"; + +export class SessionProvider implements vscode.TreeDataProvider { + private readonly userItem = new UserItem(); + private readonly projectItem = new ProjectItem(); + + constructor() {} + + getTreeItem(element: SessionItem): vscode.TreeItem { + return element; + } + + getChildren(): SessionItem[] { + return [this.userItem, this.projectItem]; + } + + _onDidChangeTreeData = new vscode.EventEmitter(); + onDidChangeTreeData = this._onDidChangeTreeData.event; + + updateEmail(email?: string) { + this.userItem.label = email ?? "Not logged in"; + this._onDidChangeTreeData.fire(this.userItem); + } + + updateProjectId(projectId?: string) { + this.projectItem.label = projectId ?? "No project selected"; + this._onDidChangeTreeData.fire(this.projectItem); + } +} + +type SessionItem = UserItem | ProjectItem; + +class UserItem extends vscode.TreeItem { + constructor() { + super("", vscode.TreeItemCollapsibleState.None); + } + + iconPath = new vscode.ThemeIcon("account"); +} + +class ProjectItem extends vscode.TreeItem { + constructor() { + super("", vscode.TreeItemCollapsibleState.None); + } + + iconPath = new vscode.ThemeIcon("project"); +}