import { Logger } from '../common/logger'; export interface IContextMenuAction { runContextMenuAction(): void; createContextMenuItem(): void; } export interface MenuAction { id: string; title: string; actionDispatcher: IContextMenuAction; } export class ContextMenuBuilder { private static instance: ContextMenuBuilder; private menuActions: MenuAction[] = []; private logger = Logger.getInstance(); private constructor() { this.addEventHandlers(); } public static getInstance(): ContextMenuBuilder { if (!this.instance) { this.instance = new ContextMenuBuilder(); } return this.instance; } public addContextMenuAction(itemTitle: string, iContextMenuAction: IContextMenuAction) { const menuAction = this.menuActions.find((ma) => ma.id === this.getItemId(itemTitle)); if (menuAction) { this.logger.logWarning('The context menu item [' + itemTitle + '] has already been added!'); return; } const menuActionDispatcher: MenuAction = { id: chrome.runtime.id + '_' + itemTitle, title: itemTitle, actionDispatcher: iContextMenuAction }; this.menuActions.push(menuActionDispatcher); chrome.contextMenus.create( { id: menuActionDispatcher.id, title: menuActionDispatcher.title, contexts: ['launcher'] }, function () { if (chrome.runtime.lastError) Logger.getInstance().logError('context error:' + chrome.runtime.lastError); } ); } public removeContextMenuItem(title: string) { const menuAction = this.menuActions.find((ma) => ma.id === this.getItemId(title)); if (menuAction) { chrome.contextMenus.remove(menuAction.id); } } private addEventHandlers() { chrome.contextMenus.onClicked.addListener((data) => { const menuAction = this.menuActions.find((ma) => ma.id === data.menuItemId); if (menuAction) { menuAction.actionDispatcher.runContextMenuAction(); } }); } private getItemId(title: string): string { return chrome.runtime.id + '_' + title; } }