refactor: Simplify topic interaction in UI

- Remove topic-related views, commands, and handlers from the codebase
- Refactor code to align with the new unified topic interaction method
- Streamline UI by eliminating unnecessary elements and consolidating views
This commit is contained in:
bobo.yang 2024-02-05 11:19:01 +08:00
parent 5b11ba4a13
commit 81c0e8be73
7 changed files with 2 additions and 235 deletions

View File

@ -548,39 +548,10 @@
"type": "webview", "type": "webview",
"id": "devchat-view", "id": "devchat-view",
"name": "DevChat" "name": "DevChat"
},
{
"type": "tree",
"id": "devchat-topicview",
"name": "DevChat-Topic"
} }
] ]
}, },
"commands": [ "commands": [
{
"command": "devchat-topicview.reloadTopic",
"title": "Reload Topics",
"icon": "$(refresh)"
},
{
"command": "devchat-topicview.selectTopic",
"title": "Select Topic",
"icon": "$(add)"
},
{
"command": "devchat-topicview.addTopic",
"title": "Add Topic",
"icon": "$(add)"
},
{
"command": "devchat-topicview.deleteSelectedTopic",
"title": "Delete Selected Topic",
"icon": "$(trash)"
},
{
"command": "devchat-topicview.deleteTopic",
"title": "Delete topic"
},
{ {
"command": "devchat.applyDiffResult", "command": "devchat.applyDiffResult",
"title": "Apply Diff", "title": "Apply Diff",
@ -655,30 +626,6 @@
} }
], ],
"menus": { "menus": {
"view/item/context": [
{
"command": "devchat-topicview.deleteTopic",
"when": "view == devchat-topicview",
"group": "1_modification"
}
],
"view/title": [
{
"command": "devchat-topicview.addTopic",
"when": "view == devchat-topicview",
"group": "navigation"
},
{
"command": "devchat-topicview.deleteSelectedTopic",
"when": "view == devchat-topicview",
"group": "navigation"
},
{
"command": "devchat-topicview.reloadTopic",
"when": "view == devchat-topicview",
"group": "navigation"
}
],
"editor/title": [ "editor/title": [
{ {
"command": "devchat.applyDiffResult", "command": "devchat.applyDiffResult",
@ -687,26 +634,6 @@
} }
], ],
"commandPalette": [ "commandPalette": [
{
"command": "devchat-topicview.reloadTopic",
"when": "false"
},
{
"command": "devchat-topicview.selectTopic",
"when": "false"
},
{
"command": "devchat-topicview.addTopic",
"when": "false"
},
{
"command": "devchat-topicview.deleteSelectedTopic",
"when": "false"
},
{
"command": "devchat-topicview.deleteTopic",
"when": "false"
},
{ {
"command": "devchat.applyDiffResult", "command": "devchat.applyDiffResult",
"when": "false" "when": "false"

View File

@ -162,67 +162,6 @@ export function registerStatusBarItemClickCommand(context: vscode.ExtensionConte
); );
} }
const topicDeleteCallback = async (item: TopicTreeItem) => {
const confirm = 'Delete';
const label = typeof item.label === 'string' ? item.label : item.label!.label;
const truncatedLabel = label.substring(0, 20) + (label.length > 20 ? '...' : '');
const result = await vscode.window.showWarningMessage(
`Are you sure you want to delete the topic "${truncatedLabel}"?`,
{ modal: true },
confirm
);
if (result === confirm) {
TopicManager.getInstance().deleteTopic(item.id);
}
};
export function regTopicDeleteCommand(context: vscode.ExtensionContext) {
context.subscriptions.push(
vscode.commands.registerCommand('devchat-topicview.deleteTopic', topicDeleteCallback)
);
}
export function regAddTopicCommand(context: vscode.ExtensionContext) {
context.subscriptions.push(
vscode.commands.registerCommand('devchat-topicview.addTopic', () => {
const topic = TopicManager.getInstance().createTopic();
TopicManager.getInstance().setCurrentTopic(topic.topicId);
})
);
}
export function regDeleteSelectTopicCommand(context: vscode.ExtensionContext) {
context.subscriptions.push(
vscode.commands.registerCommand('devchat-topicview.deleteSelectedTopic', () => {
const selectedItem = TopicTreeDataProvider.getInstance().selectedItem;
if (selectedItem) {
topicDeleteCallback(selectedItem);
} else {
vscode.window.showErrorMessage('No item selected');
}
})
);
}
export function regSelectTopicCommand(context: vscode.ExtensionContext) {
context.subscriptions.push(
vscode.commands.registerCommand('devchat-topicview.selectTopic', (item: TopicTreeItem) => {
TopicTreeDataProvider.getInstance().setSelectedItem(item);
TopicManager.getInstance().setCurrentTopic(item.id);
})
);
}
export function regReloadTopicCommand(context: vscode.ExtensionContext) {
context.subscriptions.push(
vscode.commands.registerCommand('devchat-topicview.reloadTopic', async () => {
TopicManager.getInstance().loadTopics();
})
);
}
export function regPythonPathCommand(context: vscode.ExtensionContext) { export function regPythonPathCommand(context: vscode.ExtensionContext) {
context.subscriptions.push( context.subscriptions.push(
vscode.commands.registerCommand('devchat.PythonPath', async () => { vscode.commands.registerCommand('devchat.PythonPath', async () => {

View File

@ -12,10 +12,3 @@ export function regDevChatView(context: vscode.ExtensionContext) {
}) })
); );
} }
export function regTopicView(context: vscode.ExtensionContext) {
const yourTreeView = vscode.window.createTreeView('devchat-topicview', {
treeDataProvider: TopicTreeDataProvider.getInstance(),
});
context.subscriptions.push(yourTreeView);
}

View File

@ -6,11 +6,6 @@ import {
registerAskForCodeCommand, registerAskForCodeCommand,
registerAskForFileCommand, registerAskForFileCommand,
registerAccessKeySettingCommand, registerAccessKeySettingCommand,
regTopicDeleteCommand,
regAddTopicCommand,
regDeleteSelectTopicCommand,
regSelectTopicCommand,
regReloadTopicCommand,
regApplyDiffResultCommand, regApplyDiffResultCommand,
registerStatusBarItemClickCommand, registerStatusBarItemClickCommand,
regPythonPathCommand, regPythonPathCommand,
@ -21,7 +16,7 @@ import {
registerHandleUri, registerHandleUri,
} from './contributes/commands'; } from './contributes/commands';
import { regLanguageContext } from './contributes/context'; import { regLanguageContext } from './contributes/context';
import { regDevChatView, regTopicView } from './contributes/views'; import { regDevChatView } from './contributes/views';
import { ExtensionContextHolder } from './util/extensionContext'; import { ExtensionContextHolder } from './util/extensionContext';
import { logger } from './util/logger'; import { logger } from './util/logger';
@ -294,7 +289,6 @@ async function activate(context: vscode.ExtensionContext) {
regLanguageContext(); regLanguageContext();
regDevChatView(context); regDevChatView(context);
regTopicView(context);
registerAccessKeySettingCommand(context); registerAccessKeySettingCommand(context);
registerOpenChatPanelCommand(context); registerOpenChatPanelCommand(context);
@ -309,11 +303,6 @@ async function activate(context: vscode.ExtensionContext) {
createStatusBarItem(context); createStatusBarItem(context);
regTopicDeleteCommand(context);
regAddTopicCommand(context);
regDeleteSelectTopicCommand(context);
regSelectTopicCommand(context);
regReloadTopicCommand(context);
regApplyDiffResultCommand(context); regApplyDiffResultCommand(context);
regPythonPathCommand(context); regPythonPathCommand(context);

View File

@ -5,57 +5,6 @@ import { TopicManager } from '../topic/topicManager';
import { assertValue } from '../util/check'; import { assertValue } from '../util/check';
/**
* Class to handle topic updates.
*/
export class TopicUpdateHandler {
/**
* Flag to indicate if the topic is being updated from the webview.
*/
private static isTopicUpdatingFromWebview: boolean = false;
/**
* Checks if the topic change was triggered by the webview.
*
* @returns {boolean} - Returns true if the topic change was triggered by the webview, false otherwise.
*/
public static isTopicChangeTriggeredByWebview(): boolean {
return TopicUpdateHandler.isTopicUpdatingFromWebview;
}
/**
* Processes the topic change after a chat.
*
* @param {string | undefined} parentHash - The hash of the parent message, if any.
* @param {any} message - The message object.
* @param {ChatResponse} chatResponse - The chat response object.
* @returns {Promise<void>} - A Promise that resolves when the topic change has been processed.
*/
public static async processTopicChangeAfterChat(parentHash:string | undefined, message: any, chatResponse: ChatResponse): Promise<void> {
TopicUpdateHandler.isTopicUpdatingFromWebview = true;
try {
if (!chatResponse.isError) {
let topicId = TopicManager.getInstance().currentTopicId;
if (!topicId) {
// create new topic
const topic = TopicManager.getInstance().createTopic();
topicId = topic.topicId;
}
TopicManager.getInstance().updateTopic(
topicId!,
chatResponse['prompt-hash'],
parseDateStringToTimestamp(chatResponse.date),
message.text,
chatResponse.response
);
}
} finally {
TopicUpdateHandler.isTopicUpdatingFromWebview = false;
}
}
}
/** /**
* Class to handle user interaction stop events. * Class to handle user interaction stop events.
*/ */
@ -232,7 +181,6 @@ export async function sendMessageBase(message: any, handlePartialData: (data: {
assertValue(UserStopHandler.isUserInteractionStopped(), "User Stopped"); assertValue(UserStopHandler.isUserInteractionStopped(), "User Stopped");
await addMessageToHistory(message, chatResponse, message.parent_hash); await addMessageToHistory(message, chatResponse, message.parent_hash);
await TopicUpdateHandler.processTopicChangeAfterChat(message.parent_hash, message, chatResponse);
return { return {
command: 'receiveMessage', command: 'receiveMessage',

View File

@ -9,7 +9,6 @@ import { ExtensionContextHolder } from '../util/extensionContext';
import { TopicManager } from '../topic/topicManager'; import { TopicManager } from '../topic/topicManager';
import { UiUtilWrapper } from '../util/uiUtil'; import { UiUtilWrapper } from '../util/uiUtil';
import { ChatContextManager } from '../context/contextManager'; import { ChatContextManager } from '../context/contextManager';
import { TopicUpdateHandler } from '../handler/sendMessageBase';
export class DevChatViewProvider implements vscode.WebviewViewProvider { export class DevChatViewProvider implements vscode.WebviewViewProvider {
@ -64,13 +63,6 @@ export class DevChatViewProvider implements vscode.WebviewViewProvider {
null, null,
this._context.subscriptions this._context.subscriptions
); );
TopicManager.getInstance().addOnCurrentTopicIdChangeListener((topicId) => {
if (topicId && TopicUpdateHandler.isTopicChangeTriggeredByWebview()) {
return;
}
this.reloadWebview();
});
} }
private onDidChangeWorkspaceFolders(event: vscode.WorkspaceFoldersChangeEvent): void { private onDidChangeWorkspaceFolders(event: vscode.WorkspaceFoldersChangeEvent): void {

View File

@ -2,7 +2,7 @@ import { expect } from 'chai';
import { describe, it } from 'mocha'; import { describe, it } from 'mocha';
import sinon from 'sinon'; import sinon from 'sinon';
import * as path from 'path'; import * as path from 'path';
import { parseMessage, parseMessageAndSetOptions, TopicUpdateHandler, processChatResponse, sendMessageBase, stopDevChatBase } from '../../src/handler/sendMessageBase'; import { parseMessage, parseMessageAndSetOptions, processChatResponse, sendMessageBase, stopDevChatBase } from '../../src/handler/sendMessageBase';
import { ChatResponse } from '../../src/toolwrapper/devchat'; import { ChatResponse } from '../../src/toolwrapper/devchat';
import { UiUtilWrapper } from '../../src/util/uiUtil'; import { UiUtilWrapper } from '../../src/util/uiUtil';
@ -56,27 +56,6 @@ describe('sendMessageBase', () => {
}); });
}); });
describe('TopicUpdateHandler.processTopicChangeAfterChat', () => {
it('should handle topic correctly', async () => {
const parentHash = 'somehash';
const message = {
text: 'Hello, world!'
};
const chatResponse: ChatResponse = {
"finish_reason": "",
response: 'Hello, user!',
isError: false,
user: 'user',
date: '2022-01-01T00:00:00.000Z',
'prompt-hash': 'responsehash'
};
await TopicUpdateHandler.processTopicChangeAfterChat(parentHash, message, chatResponse);
// Check if the topic was updated correctly
});
});
describe('processChatResponse', () => { describe('processChatResponse', () => {
it('should handle response text correctly when isError is false', async () => { it('should handle response text correctly when isError is false', async () => {
const partialDataText = 'Partial data'; const partialDataText = 'Partial data';