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
This commit is contained in:
Johannes Rieken 2016-02-04 17:12:22 +01:00
parent 244d5b460b
commit 22ac7f71b1
2 changed files with 27 additions and 9 deletions

View file

@ -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);
}
});
}

View file

@ -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 = (<wbaregistry.IWorkbenchActionRegistry> 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);
(<IQuickOpenRegistry>platform.Registry.as(Extensions.Quickopen)).registerQuickOpenHandler(