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