From 22ac7f71b1af3548320edbfd939549c4c2839f69 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 4 Feb 2016 17:12:22 +0100 Subject: [PATCH] remember what extension were proposed to avoid spamming the user we remember what extension in what version trigger the status bar indication. that combination won't trigger again for 28dys --- .../electron-browser/extensionsWidgets.ts | 32 ++++++++++++++----- .../extensionsWorkbenchExtension.ts | 4 ++- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsWidgets.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsWidgets.ts index 7fec6debf32..5603f5a5971 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsWidgets.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsWidgets.ts @@ -5,6 +5,7 @@ import nls = require('vs/nls'); import Severity from 'vs/base/common/severity'; +import {forEach} from 'vs/base/common/collections'; import errors = require('vs/base/common/errors'); import dom = require('vs/base/browser/dom'); import lifecycle = require('vs/base/common/lifecycle'); @@ -13,6 +14,7 @@ import statusbar = require('vs/workbench/browser/parts/statusbar/statusbar'); import { IPluginService, IPluginStatus } from 'vs/platform/plugins/common/plugins'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IMessageService, CloseAction } from 'vs/platform/message/common/message'; +import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { UninstallAction } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions'; import { IQuickOpenService } from 'vs/workbench/services/quickopen/common/quickOpenService'; import { IExtensionsService, IGalleryService, IExtension, IExtensionTipsService } from 'vs/workbench/parts/extensions/common/extensions'; @@ -87,15 +89,31 @@ export class ExtensionsStatusbarItem implements statusbar.IStatusbarItem { export class ExtensionTipsStatusbarItem implements statusbar.IStatusbarItem { + private static _dontSuggestAgainTimeout = 1000 * 60 * 60 * 24 * 28; // 4 wks + private _domNode: HTMLElement; private _label: OcticonLabel; - private _prevTips: IExtension[] = []; constructor( @IQuickOpenService private _quickOpenService: IQuickOpenService, - @IExtensionTipsService private _extensionTipsService: IExtensionTipsService + @IExtensionTipsService private _extensionTipsService: IExtensionTipsService, + @IStorageService private _storageService: IStorageService ) { + const previousTips = <{ [id: string]: number }>JSON.parse(this._storageService.get('extensionsAssistant/tips', StorageScope.GLOBAL, '{}')); + + // forget previous tips after 28 days + const now = Date.now(); + forEach(previousTips, (entry, rm) => { + if (now - entry.value > ExtensionTipsStatusbarItem._dontSuggestAgainTimeout) { + rm(); + } + }); + + function extid(ext: IExtension): string { + return `${ext.publisher}.${ext.name}@${ext.version}`; + }; + this._extensionTipsService.onDidChangeTips(tips => { if (tips.length === 0) { @@ -106,17 +124,15 @@ export class ExtensionTipsStatusbarItem implements statusbar.IStatusbarItem { // check for new tips let hasNewTips = false; for (let tip of tips) { - if (this._prevTips.indexOf(tip) < 0) { - this._prevTips.push(tip); + const id = extid(tip); + if (!previousTips[id]) { + previousTips[id] = Date.now(); hasNewTips = true; } } if (hasNewTips) { dom.addClass(this._domNode, 'active'); - } - // only keep 10 tips - while (this._prevTips.length > 10) { - this._prevTips.shift(); + this._storageService.store('extensionsAssistant/tips', JSON.stringify(previousTips), StorageScope.GLOBAL); } }); } diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchExtension.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchExtension.ts index 057e5fd05f3..e42d5724ad3 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchExtension.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchExtension.ts @@ -43,6 +43,9 @@ export class ExtensionsWorkbenchExtension implements IWorkbenchContribution { this.install(options.extensionsToInstall).done(null, errors.onUnexpectedError); } + // add service + instantiationService.addSingleton(IExtensionTipsService, this.instantiationService.createInstance(ExtensionTipsService)); + const extensionsCategory = nls.localize('extensionsCategory', "Extensions"); const actionRegistry = ( platform.Registry.as(wbaregistry.Extensions.WorkbenchActions)); actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ListExtensionsAction, ListExtensionsAction.ID, ListExtensionsAction.LABEL), extensionsCategory); @@ -82,7 +85,6 @@ export class ExtensionsWorkbenchExtension implements IWorkbenchContribution { ); // add extension tips services - instantiationService.addSingleton(IExtensionTipsService, this.instantiationService.createInstance(ExtensionTipsService)); actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ListSuggestedExtensionsAction, ListSuggestedExtensionsAction.ID, ListSuggestedExtensionsAction.LABEL), extensionsCategory); (platform.Registry.as(Extensions.Quickopen)).registerQuickOpenHandler( -- GitLab