From 42f3eac3eadbed723ea8b71f49be0040fed3df2c Mon Sep 17 00:00:00 2001 From: Justin Chen <54879025+justschen@users.noreply.github.com> Date: Fri, 24 May 2024 13:10:34 -0700 Subject: [PATCH] issue reporter re-open save state (#213418) if anything is typed and we call open reporter again, saves issue title and data --- .../workbench/contrib/issue/browser/issue.ts | 8 ++++ .../contrib/issue/browser/issueFormService.ts | 48 ++++++++++++++++++- .../issue/browser/issueReporterModel.ts | 11 +++++ 3 files changed, 65 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/issue/browser/issue.ts b/src/vs/workbench/contrib/issue/browser/issue.ts index 8247a81f739..79e44855c34 100644 --- a/src/vs/workbench/contrib/issue/browser/issue.ts +++ b/src/vs/workbench/contrib/issue/browser/issue.ts @@ -336,6 +336,14 @@ export class BaseIssueReporterService extends Disposable { } }); + this.addEventListener('issue-title', 'input', _ => { + const titleElement = this.getElementById('issue-title') as HTMLInputElement; + if (titleElement) { + const title = titleElement.value; + this.issueReporterModel.update({ issueTitle: title }); + } + }); + this.addEventListener('issue-title', 'input', (e: Event) => { const title = (e.target).value; const lengthValidationMessage = this.getElementById('issue-title-length-validation-error'); diff --git a/src/vs/workbench/contrib/issue/browser/issueFormService.ts b/src/vs/workbench/contrib/issue/browser/issueFormService.ts index a880e006d07..ca24026d161 100644 --- a/src/vs/workbench/contrib/issue/browser/issueFormService.ts +++ b/src/vs/workbench/contrib/issue/browser/issueFormService.ts @@ -18,6 +18,11 @@ import product from 'vs/platform/product/common/product'; import { IssueWebReporter } from 'vs/workbench/contrib/issue/browser/issueReporterService'; import { AuxiliaryWindowMode, IAuxiliaryWindowService } from 'vs/workbench/services/auxiliaryWindow/browser/auxiliaryWindowService'; +export interface IssuePassData { + issueTitle: string; + issueBody: string; +} + export class IssueFormService implements IIssueMainService { readonly _serviceBrand: undefined; @@ -71,10 +76,26 @@ export class IssueFormService implements IIssueMainService { } if (this.issueReporterWindow) { + const getModelData = await this.getIssueData(); + if (getModelData) { + const { issueTitle, issueBody } = getModelData; + if (issueTitle || issueBody) { + data.issueTitle = data.issueTitle ?? issueTitle; + data.issueBody = data.issueBody ?? issueBody; + + // close issue reporter and re-open with new data + this.issueReporterWindow.close(); + this.openAuxIssueReporter(data); + return; + } + } this.issueReporterWindow.focus(); return; } + this.openAuxIssueReporter(data); + } + async openAuxIssueReporter(data: IssueReporterData): Promise { const disposables = new DisposableStore(); // Auxiliary Window @@ -82,8 +103,6 @@ export class IssueFormService implements IIssueMainService { this.issueReporterWindow = auxiliaryWindow.window; - - if (auxiliaryWindow) { await auxiliaryWindow.whenStylesHaveLoaded; auxiliaryWindow.window.document.title = 'Issue Reporter'; @@ -174,6 +193,31 @@ export class IssueFormService implements IIssueMainService { return result as IssueReporterData | undefined; } + // Listens to data from the issue reporter model, which is updated regularly + async getIssueData(): Promise { + const sendChannel = `vscode:triggerIssueData`; + mainWindow.postMessage({ sendChannel }, '*'); + + const result = await new Promise((resolve, reject) => { + const timeout = setTimeout(() => { + mainWindow.removeEventListener('message', listener); + reject(new Error('Timeout exceeded')); + }, 5000); // Set the timeout value in milliseconds (e.g., 5000 for 5 seconds) + + const listener = (event: MessageEvent) => { + const replyChannel = `vscode:triggerIssueDataResponse`; + if (event.data && event.data.replyChannel === replyChannel) { + clearTimeout(timeout); + mainWindow.removeEventListener('message', listener); + resolve(event.data.data); + } + }; + mainWindow.addEventListener('message', listener); + }); + + return result as IssuePassData | undefined; + } + async $closeReporter(): Promise { this.issueReporterWindow?.close(); } diff --git a/src/vs/workbench/contrib/issue/browser/issueReporterModel.ts b/src/vs/workbench/contrib/issue/browser/issueReporterModel.ts index 74f5e9859ea..f8274d9e4c0 100644 --- a/src/vs/workbench/contrib/issue/browser/issueReporterModel.ts +++ b/src/vs/workbench/contrib/issue/browser/issueReporterModel.ts @@ -3,12 +3,14 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { mainWindow } from 'vs/base/browser/window'; import { isRemoteDiagnosticError, SystemInfo } from 'vs/platform/diagnostics/common/diagnostics'; import { ISettingSearchResult, IssueReporterExtensionData, IssueType } from 'vs/platform/issue/common/issue'; export interface IssueReporterData { issueType: IssueType; issueDescription?: string; + issueTitle?: string; extensionData?: string; versionInfo?: any; @@ -56,6 +58,15 @@ export class IssueReporterModel { }; this._data = initialData ? Object.assign(defaultData, initialData) : defaultData; + + mainWindow.addEventListener('message', async (event) => { + if (event.data && event.data.sendChannel === 'vscode:triggerIssueData') { + mainWindow.postMessage({ + data: { issueBody: this._data.issueDescription, issueTitle: this._data.issueTitle }, + replyChannel: 'vscode:triggerIssueDataResponse' + }, '*'); + } + }); } getData(): IssueReporterData {