Skip to content

Commit

Permalink
display auth-based support item in status bar
Browse files Browse the repository at this point in the history
  • Loading branch information
abeatrix committed Mar 7, 2024
1 parent 998b646 commit 82b452f
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 9 deletions.
7 changes: 5 additions & 2 deletions vscode/src/main.ts
Expand Up @@ -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
Expand All @@ -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)
Expand Down Expand Up @@ -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
Expand Down
18 changes: 14 additions & 4 deletions 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<void> {
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<void> {
await vscode.env.openExternal(vscode.Uri.parse(CODY_DOC_URL.href))
},
},
{
label: '$(feedback) Cody Feedback',
async onSelect(): Promise<void> {
await vscode.env.openExternal(vscode.Uri.parse(CODY_FEEDBACK_URL.href))
},
},
{
label: '$(organization) Cody Discord Channel',
async onSelect(): Promise<void> {
Expand Down
18 changes: 15 additions & 3 deletions 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
Expand All @@ -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)'
Expand All @@ -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)
Expand Down Expand Up @@ -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?.())
}
Expand Down Expand Up @@ -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'
Expand Down Expand Up @@ -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()
Expand Down

0 comments on commit 82b452f

Please sign in to comment.