init: async()

in src/js/background/context-menu.js [91:209]


  init: async (currentWebsite = null) => {
    if (!browser.contextMenus) {
      throw new Error(`Cannot create browser menus`);
    }

    // Remove the listener so we don't add the same one multiple times
    if (
      browser.storage.onChanged.hasListener(
        relayContextMenus.listeners.onLocalStorageChange
      )
    ) {
      await browser.storage.onChanged.removeListener(
        relayContextMenus.listeners.onLocalStorageChange
      );
    }

    const userApiToken = await browser.storage.local.get("apiToken");
    const apiKeyInStorage = Object.prototype.hasOwnProperty.call(
      userApiToken,
      "apiToken"
    );

    if (!apiKeyInStorage) {
      // User is not logged in. Do not do anything.
      return;
    }

    // Reset any previously created menus
    await browser.contextMenus.removeAll();

    // Generate aliases menu item
    // If a user is maxed out/not premium, the generate item will be disabled.
    const canUserGenerateAliases =
      await relayContextMenus.utils.getUserStatus.canGenerateMoreAliases();
    const menuData = canUserGenerateAliases
      ? staticMenuData.generateAliasEnabled
      : staticMenuData.generateAliasDisabled;
    relayContextMenus.menus.create(menuData);

    // COMPATIBILITY NOTE: Chrome uses the contextMenus API to create menus. Firefox built their own API, menus, based on it. It has additional features that are only available in Firefox. Anything wrapped in a (browser.menus) check is only executed in a browser that supports it.
    if (browser.menus) {
      const userHasSomeAliasesCreated =
        (await relayContextMenus.utils.getUserStatus.getNumberOfAliases()) > 0;

      const aliases = await relayContextMenus.utils.getAliases();

      const masksWereGeneratedOrUsedOnCurrentWebsite =
        await relayContextMenus.utils.checkIfAnyMasksWereGeneratedOrUsedOnCurrentWebsite(
          currentWebsite
        );

      // Create Use Existing Alias submenu
      if (
        currentWebsite &&
        masksWereGeneratedOrUsedOnCurrentWebsite &&
        userHasSomeAliasesCreated
      ) {
        await relayContextMenus.menus.create(
          staticMenuData.existingAlias,
          {
            createExistingAliases: true,
            parentMenu: staticMenuData.useExistingAliasFromWebsite,
            exisitingSite: true,
            currentWebsite,
          },
          aliases
        );
      }

      // Create "Recent Aliases…" menu
      if (userHasSomeAliasesCreated) {
        await relayContextMenus.menus.create(
          staticMenuData.existingAlias,
          {
            createExistingAliases: true,
            parentMenu: staticMenuData.useExistingAlias,
            exisitingSite: false,
            currentWebsite,
          },
          aliases
        );
      }
    }

    const phoneMask = await relayContextMenus.utils.getPhoneMask();
    if (phoneMask) {
      await relayContextMenus.menus.create(staticMenuData.insertPhoneMask);
    }

    // Create "Manage all aliases" link
    await relayContextMenus.menus.create(staticMenuData.manageAliases);

    // Generate upgrade menu item for non-premium users
    const canUserUpgradeToPremium =
      await relayContextMenus.utils.getUserStatus.canUpgradeToPremium();
    if (canUserUpgradeToPremium) {
      // COMPATIBILITY NOTE: The Chrome contextMenus API create() argument params do not support icons
      if (browser.menus) {
        staticMenuData.upgradeToPremium.icons = { 32: "/icons/icon_32.png" };
      }

      await relayContextMenus.menus.create(
        staticMenuData.upgradeToPremiumSeperator
      );
      await relayContextMenus.menus.create(staticMenuData.upgradeToPremium);
    }

    // Set listerners
    browser.storage.onChanged.addListener(
      relayContextMenus.listeners.onLocalStorageChange
    );

    // COMPATIBILITY NOTE: Refresh menus (not available on Chrome contextMenus API)
    if (browser.menus) {
      await browser.menus.refresh();
    }

    return Promise.resolve(1);
  },