From 82b452f35240435e784e45a7054ec0f80f37e728 Mon Sep 17 00:00:00 2001 From: Beatrix Date: Wed, 6 Mar 2024 23:32:47 -0800 Subject: [PATCH] display auth-based support item in status bar --- vscode/src/main.ts | 7 +++++-- vscode/src/services/FeedbackOptions.ts | 18 ++++++++++++++---- vscode/src/services/StatusBar.ts | 18 +++++++++++++++--- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/vscode/src/main.ts b/vscode/src/main.ts index a41f6177ab0..433c729fb58 100644 --- a/vscode/src/main.ts +++ b/vscode/src/main.ts @@ -276,6 +276,8 @@ const register = async ( ) } + const statusBar = createStatusBar() + // Adds a change listener to the auth provider that syncs the auth status authProvider.addChangeListener(async (authStatus: AuthStatus) => { // Chat Manager uses Simple Context Provider @@ -299,10 +301,13 @@ const register = async ( parallelPromises.push(setupAutocomplete()) await Promise.all(parallelPromises) + statusBar.syncAuthStatus(authStatus) }) + // Sync initial auth status await chatManager.syncAuthStatus(authProvider.getAuthStatus()) ModelProvider.onConfigChange(initialConfig.experimentalOllamaChat) + statusBar.syncAuthStatus(authProvider.getAuthStatus()) const commandsManager = platform.createCommandsProvider?.() setCommandController(commandsManager) @@ -349,8 +354,6 @@ const register = async ( vscode.commands.registerCommand('cody.command.explain-output', a => executeExplainOutput(a)) ) - const statusBar = createStatusBar() - disposables.push( // Tests // Access token - this is only used in configuration tests diff --git a/vscode/src/services/FeedbackOptions.ts b/vscode/src/services/FeedbackOptions.ts index 051430cb7d3..dc7dcff19ae 100644 --- a/vscode/src/services/FeedbackOptions.ts +++ b/vscode/src/services/FeedbackOptions.ts @@ -1,20 +1,30 @@ import * as vscode from 'vscode' -import { CODY_DOC_URL, CODY_FEEDBACK_URL, DISCORD_URL } from '../chat/protocol' +import { CODY_DOC_URL, CODY_FEEDBACK_URL, CODY_SUPPORT_URL, DISCORD_URL } from '../chat/protocol' -export const FeedbackOptionItems = [ +// Support items for paid users (e.g Enterprise Users and Cody Pro Users) +export const PremiumSupportItems = [ { - label: '$(feedback) Cody Feedback', + label: '$(question) Cody Support', async onSelect(): Promise { - await vscode.env.openExternal(vscode.Uri.parse(CODY_FEEDBACK_URL.href)) + await vscode.env.openExternal(vscode.Uri.parse(CODY_SUPPORT_URL.href)) }, }, +] + +export const FeedbackOptionItems = [ { label: '$(remote-explorer-documentation) Cody Documentation', async onSelect(): Promise { await vscode.env.openExternal(vscode.Uri.parse(CODY_DOC_URL.href)) }, }, + { + label: '$(feedback) Cody Feedback', + async onSelect(): Promise { + await vscode.env.openExternal(vscode.Uri.parse(CODY_FEEDBACK_URL.href)) + }, + }, { label: '$(organization) Cody Discord Channel', async onSelect(): Promise { diff --git a/vscode/src/services/StatusBar.ts b/vscode/src/services/StatusBar.ts index 8de9b1b7f92..b861a39afec 100644 --- a/vscode/src/services/StatusBar.ts +++ b/vscode/src/services/StatusBar.ts @@ -1,11 +1,11 @@ import * as vscode from 'vscode' -import { type Configuration, isCodyIgnoredFile } from '@sourcegraph/cody-shared' +import { type AuthStatus, type Configuration, isCodyIgnoredFile } from '@sourcegraph/cody-shared' import { getConfiguration } from '../configuration' import { getGhostHintEnablement } from '../commands/GhostHintDecorator' -import { FeedbackOptionItems } from './FeedbackOptions' +import { FeedbackOptionItems, PremiumSupportItems } from './FeedbackOptions' interface StatusBarError { title: string @@ -26,6 +26,7 @@ export interface CodyStatusBar { ): () => void addError(error: StatusBarError): () => void hasError(error: StatusBarErrorName): boolean + syncAuthStatus(newStatus: AuthStatus): void } const DEFAULT_TEXT = '$(cody-logo-heavy)' @@ -49,6 +50,7 @@ export function createStatusBar(): CodyStatusBar { statusBarItem.command = 'cody.status-bar.interacted' statusBarItem.show() + let authStatus: AuthStatus | undefined const command = vscode.commands.registerCommand(statusBarItem.command, async () => { const workspaceConfig = vscode.workspace.getConfiguration() const config = getConfiguration(workspaceConfig) @@ -85,6 +87,13 @@ export function createStatusBar(): CodyStatusBar { } } + function createFeedbackAndSupportItems(): StatusBarItem[] { + const isPaidUser = authStatus?.isLoggedIn && !authStatus?.userCanUpgrade + const paidSupportItems = isPaidUser ? PremiumSupportItems : [] + // Display to paid users (e.g. Enterprise users or Cody Pro uers) only + return [...paidSupportItems, ...FeedbackOptionItems] + } + if (errors.length > 0) { errors.map(error => error.error.onShow?.()) } @@ -178,7 +187,7 @@ export function createStatusBar(): CodyStatusBar { }, }, { label: 'feedback & support', kind: vscode.QuickPickItemKind.Separator }, - ...FeedbackOptionItems, + ...createFeedbackAndSupportItems(), ] quickPick.title = 'Cody Settings' quickPick.placeholder = 'Choose an option' @@ -294,6 +303,9 @@ export function createStatusBar(): CodyStatusBar { hasError(errorName: StatusBarErrorName): boolean { return errors.some(e => e.error.errorType === errorName) }, + syncAuthStatus(newStatus: AuthStatus) { + authStatus = newStatus + }, dispose() { statusBarItem.dispose() command.dispose()