<commit_before>import path from 'path';
import NylasStore from 'nylas-store';
import {remote, ipcRenderer} from 'electron';
import {UnreadBadgeStore, CanvasUtils} from 'nylas-exports';
const NativeImage = remote.require('native-image');
const Menu = remote.require('menu');
const {canvasWithSystemTrayIconAndText} = CanvasUtils;

// Must be absolute real system path
// https://github.com/atom/electron/issues/1299
const BASE_ICON_PATH = path.join(__dirname, '..', 'assets', process.platform, 'ic-systemtray-nylas.png');
const UNREAD_ICON_PATH = path.join(__dirname, '..', 'assets', process.platform, 'ic-systemtray-nylas-unread.png');

const _menuTemplate = [
  {
    label: 'New Message',
    click: ()=> ipcRenderer.send('command', 'application:new-message'),
  },
  {
    label: 'Preferences',
    click: ()=> ipcRenderer.send('command', 'application:open-preferences'),
  },
  {
    type: 'separator',
  },
  {
    label: 'Quit N1',
    click: ()=> ipcRenderer.send('command', 'application:quit'),
  },
];

if (process.platform !== 'win32') {
  _menuTemplate.unshift({
    label: 'Open Inbox',
    click: ()=> ipcRenderer.send('command', 'application:show-main-window'),
  });
}

const _buildMenu = ()=> {
  return Menu.buildFromTemplate(_menuTemplate);
};

class TrayStore extends NylasStore {

  constructor(platform) {
    super();
    this._platform = platform;

    this._unreadIcon = NativeImage.createFromPath(UNREAD_ICON_PATH);
    this._baseIcon = NativeImage.createFromPath(BASE_ICON_PATH);
    this._unreadCount = UnreadBadgeStore.count() || 0;
    this._menu = _buildMenu(platform);
    this._icon = this._getIconImg();
    this.listenTo(UnreadBadgeStore, this._onUnreadCountChanged);
  }

  unreadCount() {
    return this._unreadCount;
  }

  icon() {
    return this._icon;
  }

  tooltip() {
    return `${this._unreadCount} unread messages`;
  }

  menu() {
    return this._menu;
  }

  _getIconImg(platform = this._platform, unreadCount = this._unreadCount) {
    const imgHandlers = {
      'darwin': ()=> {
        const img = new Image();
        // toDataUrl always returns the @1x image data, so the assets/darwin/
        // contains an "@2x" image /without/ the @2x extension
        img.src = this._baseIcon.toDataURL();
        const count = this._unreadCount || '';
        const canvas = canvasWithSystemTrayIconAndText(img, count.toString());
        const pngData = NativeImage.createFromDataURL(canvas.toDataURL()).toPng();

        // creating from a buffer allows us to specify that the image is @2x
        const out2x = NativeImage.createFromBuffer(pngData, 2);
        out2x.setTemplateImage(true);
        return out2x;
      },
      'default': ()=> {
        return unreadCount > 0 ? this._unreadIcon : this._baseIcon;
      },
    };

    return imgHandlers[platform in imgHandlers ? platform : 'default']();
  }

  _onUnreadCountChanged() {
    this._unreadCount = UnreadBadgeStore.count();
    this._icon = this._getIconImg();
    this.trigger();
  }
}

export default TrayStore;<commit_msg>💄(tray): Use locale string so unread count uses comma notation<commit_after>import path from 'path';
import NylasStore from 'nylas-store';
import {remote, ipcRenderer} from 'electron';
import {UnreadBadgeStore, CanvasUtils} from 'nylas-exports';
const NativeImage = remote.require('native-image');
const Menu = remote.require('menu');
const {canvasWithSystemTrayIconAndText} = CanvasUtils;

// Must be absolute real system path
// https://github.com/atom/electron/issues/1299
const BASE_ICON_PATH = path.join(__dirname, '..', 'assets', process.platform, 'ic-systemtray-nylas.png');
const UNREAD_ICON_PATH = path.join(__dirname, '..', 'assets', process.platform, 'ic-systemtray-nylas-unread.png');

const _menuTemplate = [
  {
    label: 'New Message',
    click: ()=> ipcRenderer.send('command', 'application:new-message'),
  },
  {
    label: 'Preferences',
    click: ()=> ipcRenderer.send('command', 'application:open-preferences'),
  },
  {
    type: 'separator',
  },
  {
    label: 'Quit N1',
    click: ()=> ipcRenderer.send('command', 'application:quit'),
  },
];

if (process.platform !== 'win32') {
  _menuTemplate.unshift({
    label: 'Open Inbox',
    click: ()=> ipcRenderer.send('command', 'application:show-main-window'),
  });
}

const _buildMenu = ()=> {
  return Menu.buildFromTemplate(_menuTemplate);
};

class TrayStore extends NylasStore {

  constructor(platform) {
    super();
    this._platform = platform;

    this._unreadIcon = NativeImage.createFromPath(UNREAD_ICON_PATH);
    this._baseIcon = NativeImage.createFromPath(BASE_ICON_PATH);
    this._menu = _buildMenu();
    this._icon = this._getIconImg();

    this._unreadString = new Number(UnreadBadgeStore.count()).toLocaleString();
    this.listenTo(UnreadBadgeStore, this._onUnreadCountChanged);
  }

  icon() {
    return this._icon;
  }

  tooltip() {
    return `${this._unreadString} unread messages`;
  }

  menu() {
    return this._menu;
  }

  _getIconImg() {
    const imgHandlers = {
      'darwin': ()=> {
        const img = new Image();
        // toDataUrl always returns the @1x image data, so the assets/darwin/
        // contains an "@2x" image /without/ the @2x extension
        img.src = this._baseIcon.toDataURL();
        const canvas = canvasWithSystemTrayIconAndText(img, this._unreadString);
        const pngData = NativeImage.createFromDataURL(canvas.toDataURL()).toPng();

        // creating from a buffer allows us to specify that the image is @2x
        const out2x = NativeImage.createFromBuffer(pngData, 2);
        out2x.setTemplateImage(true);
        return out2x;
      },
      'default': ()=> {
        return this._unreadString != '0' ? this._unreadIcon : this._baseIcon;
      },
    };

    return imgHandlers[this._platform in imgHandlers ? this._platform : 'default']();
  }

  _onUnreadCountChanged() {
    this._unreadString = new Number(UnreadBadgeStore.count()).toLocaleString();
    this._icon = this._getIconImg();
    this.trigger();
  }
}

export default TrayStore;
{'fraction_non_alphanumeric': 0.1442753143613501, 'fraction_numerical': 0.0054599602911978825, 'mean_word_length': 3.6392939370683037, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 18, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1782777', 'n_tokens_mistral': 1955, 'n_tokens_neox': 1937, 'n_words': 396}