diff --git a/firebase-vscode/common/messaging/protocol.ts b/firebase-vscode/common/messaging/protocol.ts index c6cd978cb67..82b17543b09 100644 --- a/firebase-vscode/common/messaging/protocol.ts +++ b/firebase-vscode/common/messaging/protocol.ts @@ -36,6 +36,8 @@ export interface WebviewToExtensionParamsMap { * Ask extension for initial data */ getInitialData: {}; + getInitialHasFdcConfigs: void; + addUser: {}; logout: { email: string }; @@ -183,6 +185,8 @@ export interface ExtensionToWebviewParamsMap { firebaseJson: ValueOrError | undefined; firebaseRC: ValueOrError | undefined; }; + /** Whether any dataconnect.yaml is present */ + notifyHasFdcConfigs: boolean; /** * Return user-selected preview channel name diff --git a/firebase-vscode/src/data-connect/config.ts b/firebase-vscode/src/data-connect/config.ts index 2821ebd1a18..46c324ed6f8 100644 --- a/firebase-vscode/src/data-connect/config.ts +++ b/firebase-vscode/src/data-connect/config.ts @@ -1,8 +1,7 @@ import { isPathInside } from "./file-utils"; import { DeepReadOnly } from "../metaprogramming"; import { ConnectorYaml, DataConnectYaml } from "../dataconnect/types"; -import { Result, ResultError, ResultValue } from "../result"; -import { globalSignal } from "../utils/globals"; +import { Result, ResultValue } from "../result"; import { computed, effect, signal } from "@preact/signals-core"; import { _createWatcher as createWatcher, @@ -17,8 +16,9 @@ import { readFirebaseJson as readFdcFirebaseJson, } from "../../../src/dataconnect/fileUtils"; import { Config } from "../config"; -import { DataConnectConfig, DataConnectMultiple } from "../firebaseConfig"; +import { DataConnectMultiple } from "../firebaseConfig"; import path from "path"; +import { ExtensionBrokerImpl } from "../extension-broker"; export * from "../core/config"; @@ -26,7 +26,9 @@ export const dataConnectConfigs = signal< Result | undefined >(undefined); -export function registerDataConnectConfigs(): vscode.Disposable { +export function registerDataConnectConfigs( + broker: ExtensionBrokerImpl, +): vscode.Disposable { let cancel: () => void | undefined; function handleResult( @@ -62,8 +64,19 @@ export function registerDataConnectConfigs(): vscode.Disposable { dataConnectWatcher?.onDidDelete(() => handleResult(undefined)); // TODO watch connectors + const hasConfigs = computed(() => !!dataConnectConfigs.value?.tryReadValue?.values.length); + + const hasConfigSub = effect(() => { + broker.send("notifyHasFdcConfigs", hasConfigs.value); + }); + const getInitialHasFdcConfigsSub = broker.on("getInitialHasFdcConfigs", () => { + broker.send("notifyHasFdcConfigs", hasConfigs.value); + }); + return vscode.Disposable.from( { dispose: sub }, + { dispose: hasConfigSub }, + { dispose: getInitialHasFdcConfigsSub }, { dispose: () => cancel?.() }, dataConnectWatcher, ); diff --git a/firebase-vscode/src/data-connect/index.ts b/firebase-vscode/src/data-connect/index.ts index 3e55cb2b2c5..aa20a107d93 100644 --- a/firebase-vscode/src/data-connect/index.ts +++ b/firebase-vscode/src/data-connect/index.ts @@ -217,7 +217,7 @@ export function registerFdc( selectedProjectStatus.show(); }), }, - registerDataConnectConfigs(), + registerDataConnectConfigs(broker), registerExecution(context, broker, fdcService, emulatorController), registerExplorer(context, broker, fdcService), registerFirebaseDataConnectView(context, broker, emulatorController), diff --git a/firebase-vscode/src/test/suite/src/dataconnect/config.test.ts b/firebase-vscode/src/test/suite/src/dataconnect/config.test.ts index 5a0ff4c221f..cea57d67e6a 100644 --- a/firebase-vscode/src/test/suite/src/dataconnect/config.test.ts +++ b/firebase-vscode/src/test/suite/src/dataconnect/config.test.ts @@ -18,7 +18,7 @@ firebaseSuite("registerDataConnectConfigs", async () => { firebaseConfig: { emulators: { dataconnect: { port: 9399 } } }, }); - const disposable = registerDataConnectConfigs(); + const disposable = registerDataConnectConfigs(broker); addDisposable(disposable); broker.simulateOn("getInitialData"); @@ -91,7 +91,8 @@ firebaseSuite("registerDataConnectConfigs", async () => { }), ); - const disposable = await registerDataConnectConfigs(); + const broker = createTestBroker(); + const disposable = await registerDataConnectConfigs(broker); addDisposable(disposable); const dataConnectListeners = watcherListeners["**/{dataconnect,connector}.yaml"]!; diff --git a/firebase-vscode/webviews/SidebarApp.tsx b/firebase-vscode/webviews/SidebarApp.tsx index 2351820aeaf..2fa7c2411c0 100644 --- a/firebase-vscode/webviews/SidebarApp.tsx +++ b/firebase-vscode/webviews/SidebarApp.tsx @@ -3,17 +3,13 @@ import { Spacer } from "./components/ui/Spacer"; import { broker, useBroker } from "./globals/html-broker"; import { AccountSection } from "./components/AccountSection"; import { ProjectSection } from "./components/ProjectSection"; -import { DeployPanel } from "./components/DeployPanel"; import { HostingInitState, DeployState } from "./webview-types"; -import { EmulatorPanel } from "./components/EmulatorPanel"; import { webLogger } from "./globals/web-logger"; -import { InitFirebasePanel } from "./components/InitPanel"; import { ValueOrError } from "./messaging/protocol"; import { FirebaseConfig } from "../../src/firebaseConfig"; import { RCData } from "../../src/rc"; import { VSCodeButton } from "@vscode/webview-ui-toolkit/react"; -import { ServiceAccountUser } from "../common/types"; export function SidebarApp() { const env = useBroker("notifyEnv")?.env; @@ -28,6 +24,10 @@ export function SidebarApp() { const configs = useBroker("notifyFirebaseConfig", { initialRequest: "getInitialData", }); + const hasFdcConfigs = + useBroker("notifyHasFdcConfigs", { + initialRequest: "getInitialHasFdcConfigs", + }) ?? false; const accountSection = ( ); } - if (!configs?.firebaseJson) { + if (!configs?.firebaseJson?.value || !hasFdcConfigs) { + const configLabel = !hasFdcConfigs ? "dataconnect.yaml" : "firebase.json"; + return ( <> {accountSection}

- No firebase.json detected in this project + No {configLabel} detected in this project


{ @@ -159,10 +161,15 @@ function SidebarContent(props: { {accountSection} {!!user && ( - + )} - { // TODO: disable hosting completely - /* {hostingInitState === "success" && + { + // TODO: disable hosting completely + /* {hostingInitState === "success" && !!user && !!projectId && env?.isMonospace && ( @@ -186,7 +193,8 @@ function SidebarContent(props: { hostingInitState={hostingInitState} setHostingInitState={setHostingInitState} /> - )} */} + )} */ + } { // disable emulator panel for now, as we have an individual emulator panel in the FDC section }