Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityActions.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 { alert } from '../../../../../base/browser/ui/aria/aria.js';
7
import { localize } from '../../../../../nls.js';
8
import { Action2, registerAction2 } from '../../../../../platform/actions/common/actions.js';
9
import { ServicesAccessor } from '../../../../../platform/instantiation/common/instantiation.js';
10
import { KeybindingWeight } from '../../../../../platform/keybinding/common/keybindingsRegistry.js';
11
import { KeyCode, KeyMod } from '../../../../../base/common/keyCodes.js';
12
import { IChatWidgetService } from '../chat.js';
13
import { ChatContextKeys } from '../../common/chatContextKeys.js';
14
import { isResponseVM } from '../../common/chatViewModel.js';
15
import { CONTEXT_ACCESSIBILITY_MODE_ENABLED } from '../../../../../platform/accessibility/common/accessibility.js';
16
17
export const ACTION_ID_FOCUS_CHAT_CONFIRMATION = 'workbench.action.chat.focusConfirmation';
18
19
class AnnounceChatConfirmationAction extends Action2 {
20
constructor() {
21
super({
22
id: ACTION_ID_FOCUS_CHAT_CONFIRMATION,
23
title: { value: localize('focusChatConfirmation', 'Focus Chat Confirmation'), original: 'Focus Chat Confirmation' },
24
category: { value: localize('chat.category', 'Chat'), original: 'Chat' },
25
precondition: ChatContextKeys.enabled,
26
f1: true,
27
keybinding: {
28
weight: KeybindingWeight.WorkbenchContrib,
29
primary: KeyMod.CtrlCmd | KeyCode.KeyA | KeyMod.Shift,
30
when: CONTEXT_ACCESSIBILITY_MODE_ENABLED
31
}
32
});
33
}
34
35
async run(accessor: ServicesAccessor): Promise<void> {
36
const chatWidgetService = accessor.get(IChatWidgetService);
37
const lastFocusedWidget = chatWidgetService.lastFocusedWidget;
38
39
if (!lastFocusedWidget) {
40
alert(localize('noChatSession', 'No active chat session found.'));
41
return;
42
}
43
44
const viewModel = lastFocusedWidget.viewModel;
45
if (!viewModel) {
46
alert(localize('chatNotReady', 'Chat interface not ready.'));
47
return;
48
}
49
50
// Check for active confirmations in the chat responses
51
let firstConfirmationElement: HTMLElement | undefined;
52
53
const lastResponse = viewModel.getItems()[viewModel.getItems().length - 1];
54
if (isResponseVM(lastResponse)) {
55
const confirmationWidgets = lastFocusedWidget.domNode.querySelectorAll('.chat-confirmation-widget-container');
56
if (confirmationWidgets.length > 0) {
57
firstConfirmationElement = confirmationWidgets[0] as HTMLElement;
58
}
59
}
60
61
if (firstConfirmationElement) {
62
firstConfirmationElement.focus();
63
} else {
64
alert(localize('noConfirmationRequired', 'No chat confirmation required'));
65
}
66
}
67
}
68
69
export function registerChatAccessibilityActions(): void {
70
registerAction2(AnnounceChatConfirmationAction);
71
}
72
73