Path: blob/main/src/vs/workbench/contrib/chat/browser/chatContentParts/chatExtensionsContentPart.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import './media/chatExtensionsContent.css';6import * as dom from '../../../../../base/browser/dom.js';7import { Emitter, Event } from '../../../../../base/common/event.js';8import { Disposable, IDisposable } from '../../../../../base/common/lifecycle.js';9import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';10import { ExtensionsList, getExtensions } from '../../../extensions/browser/extensionsViewer.js';11import { IExtensionsWorkbenchService } from '../../../extensions/common/extensions.js';12import { IChatExtensionsContent } from '../../common/chatService.js';13import { IChatRendererContent } from '../../common/chatViewModel.js';14import { ChatTreeItem, ChatViewId, IChatCodeBlockInfo } from '../chat.js';15import { IChatContentPart } from './chatContentParts.js';16import { PagedModel } from '../../../../../base/common/paging.js';17import { Codicon } from '../../../../../base/common/codicons.js';18import { ThemeIcon } from '../../../../../base/common/themables.js';19import { localize } from '../../../../../nls.js';2021export class ChatExtensionsContentPart extends Disposable implements IChatContentPart {22public readonly domNode: HTMLElement;2324private _onDidChangeHeight = this._register(new Emitter<void>());25public readonly onDidChangeHeight = this._onDidChangeHeight.event;2627public get codeblocks(): IChatCodeBlockInfo[] {28return [];29}3031public get codeblocksPartId(): string | undefined {32return undefined;33}3435constructor(36private readonly extensionsContent: IChatExtensionsContent,37@IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService,38@IInstantiationService instantiationService: IInstantiationService,39) {40super();4142this.domNode = dom.$('.chat-extensions-content-part');43const loadingElement = dom.append(this.domNode, dom.$('.loading-extensions-element'));44dom.append(loadingElement, dom.$(ThemeIcon.asCSSSelector(ThemeIcon.modify(Codicon.loading, 'spin'))), dom.$('span.loading-message', undefined, localize('chat.extensions.loading', 'Loading extensions...')));4546const extensionsList = dom.append(this.domNode, dom.$('.extensions-list'));47const list = this._register(instantiationService.createInstance(ExtensionsList, extensionsList, ChatViewId, { alwaysConsumeMouseWheel: false }, { onFocus: Event.None, onBlur: Event.None, filters: {} }));48getExtensions(extensionsContent.extensions, extensionsWorkbenchService).then(extensions => {49loadingElement.remove();50if (this._store.isDisposed) {51return;52}53list.setModel(new PagedModel(extensions));54list.layout();55this._onDidChangeHeight.fire();56});57}5859hasSameContent(other: IChatRendererContent, followingContent: IChatRendererContent[], element: ChatTreeItem): boolean {60return other.kind === 'extensions' && other.extensions.length === this.extensionsContent.extensions.length && other.extensions.every(ext => this.extensionsContent.extensions.includes(ext));61}6263addDisposable(disposable: IDisposable): void {64this._register(disposable);65}66}676869