diff --git a/ext-src/commands/DetailDocument.ts b/ext-src/commands/DetailDocument.ts index dd56889..7943b8d 100644 --- a/ext-src/commands/DetailDocument.ts +++ b/ext-src/commands/DetailDocument.ts @@ -33,6 +33,13 @@ export function activateDetailSuggestionCommand(context: vscode.ExtensionContext } if (!sessionToken || !analyzeStateValue) { + getExtensionEventEmitter().fire({ + type: 'CURRENT_PROJECT', + data: { + name: currentWorkSpaceFolder + }, + }); + extensionEventEmitter.fire({ type: 'CURRENT_FILE', data: { ...documentMetaData.editor.document }, diff --git a/ext-src/extension.ts b/ext-src/extension.ts index cb19cce..3c55a32 100644 --- a/ext-src/extension.ts +++ b/ext-src/extension.ts @@ -196,7 +196,7 @@ export function activate(context: vscode.ExtensionContext): void { const isValidEditor = Util.isValidDocument(editor.document); if (isValidEditor) { - getExtensionEventEmitter().fire({ + extensionEventEmitter.fire({ type: 'Analysis_Completed', data: { shouldResetRecomendation: true, shouldMoveToAnalyzePage: true, ...analyzeValue }, }); @@ -216,19 +216,10 @@ export function activate(context: vscode.ExtensionContext): void { context.subscriptions.push( vscode.workspace.onDidOpenTextDocument((e: vscode.TextDocument) => { - const currentWorkSpaceFolder = Util.getRootFolderName(); - const documentMetaData = Util.extractMetaDataFromDocument(e); - if (!documentMetaData.fileName) { - debugChannel.appendLine( - 'onDidOpenTextDocument: fileName is undefined. ' + - '\n' + - documentMetaData.relativePath + - '\n' + - documentMetaData.filePath, - ); - return; - } - + const bufferedEParam: vscode.TextDocument = { + ...e, + fileName: e.fileName.replace('.git', ''), + }; const analyzeState = new Analyze(context); const analyzeValue = analyzeState.get()?.value; if (!analyzeValue) { @@ -237,10 +228,55 @@ export function activate(context: vscode.ExtensionContext): void { return; } - const results: Problem[] | undefined = Util.getCurrentEditorProblems( - analyzeValue, - documentMetaData.fileName, + const activeTextEditor = vscode.window.activeTextEditor; + if (!activeTextEditor) { + debugChannel.appendLine('onDidOpenTextDocument: activeTextEditor is undefined '); + + return; + } + + if (activeTextEditor.document.fileName !== bufferedEParam.fileName) { + debugChannel.appendLine( + 'onDidOpenTextDocument: activeTextEditor.document.fileName ' + + activeTextEditor.document.fileName + + ' e.fileName ' + + e.fileName, + ); + + return; + } + + const currentWorkSpaceFolder = Util.getRootFolderName(); + debugChannel.appendLine( + 'onDidOpenTextDocument: currentWorkSpaceFolder ' + currentWorkSpaceFolder, ); + const documentMetaData = Util.extractMetaDataFromDocument(bufferedEParam); + let fileName: string | undefined = undefined; + + if (documentMetaData.fileName) { + debugChannel.appendLine( + 'onDidOpenTextDocument: documentMetaData.fileName: ' + documentMetaData.fileName, + ); + fileName = documentMetaData.fileName; + } + + if (!fileName && documentMetaData.filePath) { + const splitKey: string | undefined = documentMetaData.filePath + .split('/') + .pop() + ?.replace('.git', ''); + if (splitKey) { + fileName = splitKey; + } + } + debugChannel.appendLine('onDidOpenTextDocument: fileName: ' + fileName); + + if (!fileName) { + debugChannel.appendLine('onDidOpenTextDocument: fileName is undefined. ' + fileName); + return; + } + + const results: Problem[] | undefined = Util.getCurrentEditorProblems(analyzeValue, fileName); if (!results) { debugChannel.appendLine('onDidOpenTextDocument: results is undefined'); @@ -256,14 +292,9 @@ export function activate(context: vscode.ExtensionContext): void { }, }); - getExtensionEventEmitter().fire({ - type: 'Analysis_Completed', - data: { shouldResetRecomendation: true, shouldMoveToAnalyzePage: true, ...analyzeValue }, - }); - extensionEventEmitter.fire({ type: 'CURRENT_FILE', - data: { ...e }, + data: { ...activeTextEditor.document }, }); extensionEventEmitter.fire({ @@ -272,6 +303,17 @@ export function activate(context: vscode.ExtensionContext): void { name: currentWorkSpaceFolder, }, }); + + extensionEventEmitter.fire({ + type: 'onDiscardSuggestionClicked:Success', + data: {}, + }); + + extensionEventEmitter.fire({ + type: 'Analysis_Completed', + data: { shouldResetRecomendation: true, shouldMoveToAnalyzePage: true, ...analyzeValue }, + }); + debugChannel.appendLine( 'onDidOpenTextDocument: results have zero length. ' + documentMetaData.fileName, ); @@ -279,15 +321,11 @@ export function activate(context: vscode.ExtensionContext): void { return; } - const activeTextEditor = vscode.window.activeTextEditor; - if (!activeTextEditor) return; - if (activeTextEditor.document.fileName !== e.fileName) return; - Util.decorateCurrentEditorWithHighlights(results, activeTextEditor); extensionEventEmitter.fire({ type: 'CURRENT_FILE', - data: { ...e }, + data: { ...activeTextEditor.document }, }); extensionEventEmitter.fire({ @@ -298,9 +336,9 @@ export function activate(context: vscode.ExtensionContext): void { }, }); - getExtensionEventEmitter().fire({ - type: 'Analysis_Completed', - data: { shouldResetRecomendation: true, shouldMoveToAnalyzePage: true, ...analyzeValue }, + extensionEventEmitter.fire({ + type: 'onDiscardSuggestionClicked:Success', + data: {}, }); extensionEventEmitter.fire({ @@ -309,6 +347,11 @@ export function activate(context: vscode.ExtensionContext): void { name: currentWorkSpaceFolder, }, }); + + extensionEventEmitter.fire({ + type: 'Analysis_Completed', + data: { shouldResetRecomendation: true, shouldMoveToAnalyzePage: true, ...analyzeValue }, + }); }), ); @@ -351,10 +394,6 @@ export function activate(context: vscode.ExtensionContext): void { hasWorkSpaceFolders: true, }, }); - getExtensionEventEmitter().fire({ - type: 'Analysis_Completed', - data: { shouldResetRecomendation: true, shouldMoveToAnalyzePage: true, ...analyzeValue }, - }); extensionEventEmitter.fire({ type: 'CURRENT_FILE', @@ -368,6 +407,16 @@ export function activate(context: vscode.ExtensionContext): void { }, }); + extensionEventEmitter.fire({ + type: 'onDiscardSuggestionClicked:Success', + data: {}, + }); + + extensionEventEmitter.fire({ + type: 'Analysis_Completed', + data: { shouldResetRecomendation: true, shouldMoveToAnalyzePage: true, ...analyzeValue }, + }); + debugChannel.appendLine( 'onDidChangeActiveTextEditor: results array has zero length. ' + fileName, ); @@ -385,11 +434,6 @@ export function activate(context: vscode.ExtensionContext): void { }, }); - getExtensionEventEmitter().fire({ - type: 'Analysis_Completed', - data: { shouldResetRecomendation: true, shouldMoveToAnalyzePage: true, ...analyzeValue }, - }); - extensionEventEmitter.fire({ type: 'CURRENT_FILE', data: { ...e.document }, @@ -402,6 +446,16 @@ export function activate(context: vscode.ExtensionContext): void { }, }); + extensionEventEmitter.fire({ + type: 'onDiscardSuggestionClicked:Success', + data: {}, + }); + + extensionEventEmitter.fire({ + type: 'Analysis_Completed', + data: { shouldResetRecomendation: true, shouldMoveToAnalyzePage: true, ...analyzeValue }, + }); + previousEditor = e; }), ); diff --git a/ext-src/providers/recommendation.provider.ts b/ext-src/providers/recommendation.provider.ts index 11420c3..4008468 100644 --- a/ext-src/providers/recommendation.provider.ts +++ b/ext-src/providers/recommendation.provider.ts @@ -23,7 +23,6 @@ import { BackendService, GetChatGPTToken } from '../config'; import { DiscardCommandHandler, EndorseCommandHandler } from '../commands'; import CONSTANTS from '../constants'; import Util from '../utils'; -import debugChannel from '../debug'; import { AnalysisEvents } from '../events'; import { Problem } from '../types'; @@ -34,6 +33,7 @@ export class RecommendationWebView implements WebviewViewProvider { private readonly extensionContext: ExtensionContext; private extensionEventEmitter: EventEmitter; private eventEmitterQueue: Array = []; + private interval: NodeJS.Timeout | undefined = undefined; constructor( extensionPath: string, @@ -44,7 +44,6 @@ export class RecommendationWebView implements WebviewViewProvider { this.extensionPath = extensionPath; this.extensionURI = extensionURI; this.extensionContext = context; - this.extensionEventEmitter = extensionEventEmitter; } @@ -76,42 +75,83 @@ export class RecommendationWebView implements WebviewViewProvider { this._view = webviewView; this.activateWebviewMessageListener(); this.activateExtensionEventListener(); + this.sendDefaultEvents(); + } + + sendDefaultEvents() { + const getanalyzeState = new Analyze(this.extensionContext).get()?.value; + if (!getanalyzeState) return; + const editor = window.activeTextEditor; + if (!editor) return; + const currentWorkSpaceFolder = Util.getRootFolderName(); + + if (this._view?.visible === true) { + setTimeout(() => { + this.extensionEventEmitter.fire({ + type: 'CURRENT_FILE', + data: { ...editor.document }, + }); + + this.extensionEventEmitter.fire({ + type: 'CURRENT_PROJECT', + data: { + name: currentWorkSpaceFolder, + }, + }); + + this.extensionEventEmitter.fire({ + type: 'onDiscardSuggestionClicked:Success', + data: {}, + }); + + this.extensionEventEmitter.fire({ + type: 'Analysis_Completed', + data: { + shouldResetRecomendation: true, + shouldMoveToAnalyzePage: true, + ...getanalyzeState, + }, + }); + }, 500); + } + } + + intervalHandler() { + if (this?._view === null || this?._view === undefined || !this?._view.webview) { + return; + } + + if (!this._view.visible) { + return; + } + + for (let i = 0; i < this.eventEmitterQueue.length; i++) { + const event = this.eventEmitterQueue[i]; + if (event) { + this?._view?.webview?.postMessage(event); + } + } + + clearInterval(this.interval); } activateExtensionEventListener(): void { + const self = this; this.extensionEventEmitter.event(event => { if (this?._view === null || this?._view === undefined || !this?._view.webview) { - debugChannel.appendLine( - `Metabob: this.view.webview is undefined and got event ${JSON.stringify(event)}`, - ); return; } - let interval: NodeJS.Timeout | undefined = undefined; - - if (!this._view.visible) { + if (this._view.visible === false) { this.eventEmitterQueue.push(event); - interval = setInterval(() => { - if (this?._view === null || this?._view === undefined || !this?._view.webview) { - return; - } - - if (!this._view.visible) { - return; - } - - const latestEvent = this.eventEmitterQueue.pop(); - if (latestEvent) { - this?._view?.webview?.postMessage(latestEvent); - } - - clearInterval(interval); - this.eventEmitterQueue = []; - }, 500); + if (this.interval !== undefined) { + this.interval = setInterval(this.intervalHandler.bind(self), 300); + } return; } + this.eventEmitterQueue = []; this._view.webview.postMessage(event); }); } @@ -319,13 +359,14 @@ export class RecommendationWebView implements WebviewViewProvider { postInitData(): void { const getanalyzeState = new Analyze(this.extensionContext).get()?.value; const currentEditor = window.activeTextEditor; + const currentWorkSpaceFolder = Util.getRootFolderName(); if ( this._view === null || this._view === undefined || this._view.webview === undefined || - !currentEditor || - this._view.visible === false + currentEditor === undefined || + currentWorkSpaceFolder === undefined ) { return; } @@ -334,16 +375,30 @@ export class RecommendationWebView implements WebviewViewProvider { initData?: any; hasOpenTextDocuments?: boolean; hasWorkSpaceFolders?: boolean; + currentWorkSpaceFolder?: string + currentFile?: any } = {}; if (getanalyzeState) { initPayload.initData = { ...getanalyzeState }; } + if (currentWorkSpaceFolder) { + initPayload.currentWorkSpaceFolder = currentWorkSpaceFolder + } + + if (currentEditor) { + initPayload.currentFile = { ...currentEditor.document } + } + initPayload.hasOpenTextDocuments = Util.hasOpenTextDocuments(); initPayload.hasWorkSpaceFolders = Util.hasWorkspaceFolder(); + this._view.webview.postMessage({ + type: 'initData', + data: { ...initPayload }, + }); - this.extensionEventEmitter.fire({ + this._view.webview.postMessage({ type: 'INIT_DATA_UPON_NEW_FILE_OPEN', data: { hasOpenTextDocuments: true, @@ -351,24 +406,22 @@ export class RecommendationWebView implements WebviewViewProvider { }, }); - this.extensionEventEmitter.fire({ - type: 'Analysis_Completed', - data: { shouldResetRecomendation: false, shouldMoveToAnalyzePage: false, ...getanalyzeState }, + this._view.webview.postMessage({ + type: 'CURRENT_PROJECT', + data: { + name: currentWorkSpaceFolder, + }, }); - this.extensionEventEmitter.fire({ + this._view.webview.postMessage({ type: 'CURRENT_FILE', data: { ...currentEditor.document }, }); - this._view.webview - .postMessage({ - type: 'initData', - data: { ...initPayload }, - }) - .then(undefined, err => { - window.showErrorMessage(err); - }); + this._view.webview.postMessage({ + type: 'Analysis_Completed', + data: { shouldResetRecomendation: true, shouldMoveToAnalyzePage: true, ...getanalyzeState }, + }); } async handleApplyRecommendation(input: string, initData: CurrentQuestionState) { @@ -401,7 +454,10 @@ export class RecommendationWebView implements WebviewViewProvider { throw new Error('handleApplyRecommendation: Results are undefined'); } - const isCurrentFileDecorated = Util.decorateCurrentEditorWithHighlights(results, documentMetadata.editor) + const isCurrentFileDecorated = Util.decorateCurrentEditorWithHighlights( + results, + documentMetadata.editor, + ); if (!isCurrentFileDecorated) { throw new Error('handleApplyRecommendation: could not decorate current file'); diff --git a/ext-src/utils.ts b/ext-src/utils.ts index 2f967f1..eb4d0f7 100644 --- a/ext-src/utils.ts +++ b/ext-src/utils.ts @@ -66,9 +66,19 @@ export default class Utils { static sleep = (ms: number): Promise => new Promise(res => setTimeout(res, ms)); static getWorkspacePath(): string | undefined { - const folders = workspace.workspaceFolders; + let folders = workspace.workspaceFolders; + let path = folders ? folders![0].uri.fsPath : undefined; + if (path === undefined) { + return undefined + } + + const splitPath: string | undefined = path.split('/').pop()?.replace('.git', ''); + + if (splitPath === undefined) { + return undefined + } - return folders ? folders![0].uri.fsPath : undefined; + return splitPath } static getResource(rel: string): string { diff --git a/src/components/Analyze/index.tsx b/src/components/Analyze/index.tsx index e4db65d..b75652c 100644 --- a/src/components/Analyze/index.tsx +++ b/src/components/Analyze/index.tsx @@ -38,6 +38,9 @@ export const AnalyzePage = ({ return false; } + console.log('problem.fullFilePath: ', problem.fullFilePath); + console.log('currentWorkSpaceProject: ', currentWorkSpaceProject); + if (problem.fullFilePath === currentWorkSpaceProject) { return true; } @@ -52,6 +55,9 @@ export const AnalyzePage = ({ return false; } + console.log('currentEditor: ', currentEditor); + console.log('splitString: ', splitString); + if (splitString !== currentEditor && problem.isDiscarded === false) { return true; } diff --git a/src/context/UserContext.tsx b/src/context/UserContext.tsx index df612e6..8fe050a 100644 --- a/src/context/UserContext.tsx +++ b/src/context/UserContext.tsx @@ -53,7 +53,9 @@ const AccountSettingProvider = ({ children }: Props): JSX.Element => { break; case EventDataType.ANALYSIS_COMPLETED: const { shouldResetRecomendation, shouldMoveToAnalyzePage, ...problem } = payload; - setIdentifiedProblems(problem as AnalyzeState); + if (problem) { + setIdentifiedProblems(problem as AnalyzeState); + } if (shouldMoveToAnalyzePage) { setIdentifiedSuggestion(undefined); setApplicationState(ApplicationWebviewState.ANALYZE_MODE); @@ -78,7 +80,17 @@ const AccountSettingProvider = ({ children }: Props): JSX.Element => { } break; case EventDataType.INIT_DATA: - const { hasOpenTextDocuments, hasWorkSpaceFolders } = payload; + const { + hasOpenTextDocuments, + hasWorkSpaceFolders, + initData, + currentWorkSpaceFolder, + currentFile, + } = payload; + + console.log('INIT_DATA: ', payload); + + setApplicationState(ApplicationWebviewState.ANALYZE_MODE); if (hasOpenTextDocuments) { setHasOpenTextDocuments(hasOpenTextDocuments); @@ -87,6 +99,28 @@ const AccountSettingProvider = ({ children }: Props): JSX.Element => { if (hasWorkSpaceFolders) { setHasWorkSpaceFolders(hasWorkSpaceFolders); } + + if (initData) { + setIdentifiedProblems(initData as AnalyzeState); + } + + if (currentWorkSpaceFolder) { + setCurrentWorkSpaceProject(currentWorkSpaceFolder); + } + + if (currentFile) { + const filename: string | undefined = currentFile.fileName + .split('/') + .pop() + ?.replace('.git', ''); + + if (!filename) { + setCurrentEditor(undefined); + + return; + } + setCurrentEditor(filename); + } break; case EventDataType.GENERATE_CLICKED_GPT_RESPONSE: setIdentifiedRecommendation(prev => { @@ -129,10 +163,15 @@ const AccountSettingProvider = ({ children }: Props): JSX.Element => { } break; case EventDataType.CURRENT_FILE: - const filename: string | undefined = payload.fileName.split('/').pop(); + const filename: string | undefined = payload.fileName + .split('/') + .pop() + ?.replace('.git', ''); + if (!filename) { setCurrentEditor(undefined); - break; + + return; } setCurrentEditor(filename); break; diff --git a/src/state/atoms/index.ts b/src/state/atoms/index.ts index 56de965..9a121f6 100644 --- a/src/state/atoms/index.ts +++ b/src/state/atoms/index.ts @@ -56,10 +56,10 @@ export const identifiedProblems = atom({ export const currentEditor = atom({ default: undefined, - key: 'Metabob:currentEditor' + key: 'Metabob:currentEditor', }) export const currentWorkSpaceProject = atom({ default: undefined, - key: 'Metabob:currentWorkSpaceProject' + key: 'Metabob:currentWorkSpaceProject', }) \ No newline at end of file