|
|
- import type { CancellationTokenSource, Extension, ExtensionContext, Uri } from 'vscode';
- import { extensions } from 'vscode';
- import type { ActionContext, HoverCommandsActionContext } from './api/gitlens';
- import type { InviteToLiveShareCommandArgs } from './commands';
- import { Commands, CoreCommands } from './constants';
- import { Container } from './container';
- import { executeCommand, executeCoreCommand } from './system/command';
- import type { ContactPresence } from './vsls/vsls';
-
- export async function installExtension<T>(
- extensionId: string,
- tokenSource: CancellationTokenSource,
- timeout: number,
- vsix?: Uri,
- ): Promise<Extension<T> | undefined> {
- try {
- let timer: ReturnType<typeof setTimeout> | undefined = undefined;
- const extension = new Promise<Extension<any> | undefined>(resolve => {
- const disposable = extensions.onDidChange(() => {
- const extension = extensions.getExtension(extensionId);
- if (extension != null) {
- if (timer != null) {
- clearTimeout(timer);
- timer = undefined;
- }
- disposable.dispose();
-
- resolve(extension);
- }
- });
-
- tokenSource.token.onCancellationRequested(() => {
- disposable.dispose();
-
- resolve(undefined);
- });
- });
-
- await executeCoreCommand(CoreCommands.InstallExtension, vsix ?? extensionId);
- // Wait for extension activation until timeout expires
- timer = setTimeout(() => {
- timer = undefined;
- tokenSource.cancel();
- }, timeout);
-
- return extension;
- } catch {
- tokenSource.cancel();
- return undefined;
- }
- }
-
- export function registerPartnerActionRunners(context: ExtensionContext): void {
- registerLiveShare(context);
- }
-
- function registerLiveShare(context: ExtensionContext) {
- context.subscriptions.push(
- Container.instance.actionRunners.registerBuiltInPartner<HoverCommandsActionContext>(
- 'liveshare',
- 'hover.commands',
- {
- name: 'Live Share',
- label: (context: ActionContext) => {
- if (context.type === 'hover.commands') {
- if (context.commit.author.name !== 'You') {
- return `$(live-share) Invite ${context.commit.author.name}${
- (context.commit.author.presence as ContactPresence)?.statusText
- ? ` (${(context.commit.author.presence as ContactPresence)?.statusText})`
- : ''
- } to a Live Share Session`;
- }
- }
-
- return '$(live-share) Start a Live Share Session';
- },
- run: async (context: ActionContext) => {
- if (context.type !== 'hover.commands' || context.commit.author.name === 'You') {
- await executeCommand<InviteToLiveShareCommandArgs>(Commands.InviteToLiveShare, {});
-
- return;
- }
-
- await executeCommand<InviteToLiveShareCommandArgs>(Commands.InviteToLiveShare, {
- email: context.commit.author.email,
- });
- },
- },
- ),
- );
- }
|