Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support link for Cody Pro & Enterprise #3330

Merged
merged 11 commits into from Mar 14, 2024
1 change: 1 addition & 0 deletions vscode/src/chat/protocol.ts
Expand Up @@ -186,6 +186,7 @@ export const CODY_DOC_URL = new URL('https://sourcegraph.com/docs/cody')
// Community and support
export const DISCORD_URL = new URL('https://discord.gg/s2qDtYGnAE')
export const CODY_FEEDBACK_URL = new URL('https://github.com/sourcegraph/cody/issues/new/choose')
export const CODY_SUPPORT_URL = new URL('https://help.sourcegraph.com/hc/en-us/requests/new')
// Account
export const ACCOUNT_UPGRADE_URL = new URL('https://sourcegraph.com/cody/subscription')
export const ACCOUNT_USAGE_URL = new URL('https://sourcegraph.com/cody/manage')
Expand Down
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
5 changes: 5 additions & 0 deletions vscode/src/services/SidebarCommands.ts
Expand Up @@ -6,6 +6,7 @@ import {
ACCOUNT_USAGE_URL,
CODY_DOC_URL,
CODY_FEEDBACK_URL,
CODY_SUPPORT_URL,
DISCORD_URL,
} from '../chat/protocol'
import { releaseNotesURL } from '../release'
Expand Down Expand Up @@ -60,6 +61,10 @@ export function registerSidebarCommands(): vscode.Disposable[] {
logSidebarClick('documentation')
void vscode.commands.executeCommand('vscode.open', CODY_DOC_URL.href)
}),
vscode.commands.registerCommand('cody.sidebar.support', () => {
logSidebarClick('support')
void vscode.commands.executeCommand('vscode.open', CODY_SUPPORT_URL.href)
}),
vscode.commands.registerCommand('cody.sidebar.feedback', () => {
logSidebarClick('feedback')
void vscode.commands.executeCommand('vscode.open', CODY_FEEDBACK_URL.href)
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
4 changes: 4 additions & 0 deletions vscode/src/services/tree-views/TreeViewProvider.ts
Expand Up @@ -80,6 +80,10 @@ export class TreeViewProvider implements vscode.TreeDataProvider<vscode.TreeItem
continue
}

if (item.requireNotFree && this.authStatus?.userCanUpgrade === true) {
continue
}

const treeItem = new vscode.TreeItem({ label: item.title })
treeItem.id = item.id
treeItem.iconPath = new vscode.ThemeIcon(item.icon)
Expand Down
7 changes: 7 additions & 0 deletions vscode/src/services/tree-views/treeViewItems.ts
Expand Up @@ -18,6 +18,7 @@ export interface CodySidebarTreeItem {
requireFeature?: FeatureFlag
requireUpgradeAvailable?: boolean
requireDotCom?: boolean
requireNotFree?: boolean
}

/**
Expand Down Expand Up @@ -68,6 +69,12 @@ const supportItems: CodySidebarTreeItem[] = [
icon: 'book',
command: { command: 'cody.sidebar.documentation' },
},
{
title: 'Support',
icon: 'question',
command: { command: 'cody.sidebar.support' },
requireNotFree: true,
toolmantim marked this conversation as resolved.
Show resolved Hide resolved
},
{
title: 'Feedback',
icon: 'feedback',
Expand Down