ridereceipts/ridereceipts

View on GitHub
src/main/index.js

Summary

Maintainability
D
2 days
Test Coverage
'use strict'

import { app, BrowserWindow, ipcMain, Menu, session, shell } from 'electron'
import Store from 'electron-store'
import jetpack from 'fs-jetpack'
import fs from 'fs'
import path from 'path'
import { enforceMacOSAppLocation } from 'electron-util'
import { autoUpdateApp, checkForUpdates } from './updater.js'

import 'electron-context-menu'

const log = require('electron-log')

// let myWindow = null
const store = new Store()

/**
 * Set `__static` path to static files in production
 * https://simulatedgreg.gitbooks.io/electron-vue/content/en/using-static-assets.html
 */
if (process.env.NODE_ENV !== 'development') {
  global.__static = require('path').join(__dirname, '/static').replace(/\\/g, '\\\\')
}

let mainWindow
let logsWindow
const winURL = process.env.NODE_ENV === 'development'
  ? 'http://localhost:9080'
  : `file://${__dirname}/index.html`

const openAboutWindow = require('about-window').default

function createWindow () {
  /**
   * Initial window options
   */
  mainWindow = new BrowserWindow({
    height: 650,
    useContentSize: true,
    width: 960,
    minWidth: 900,
    minHeight: 600,
    resizable: false,
    webPreferences: {
      nodeIntegration: true,
      nodeIntegrationInWorker: true,
      webSecurity: false
    }
  })

  mainWindow.loadURL(winURL)

  mainWindow.on('closed', () => {
    mainWindow = null
  })

  // Create the Application's main menu
  const template = [
    {
      label: 'Edit',
      submenu: [
        { role: 'undo' },
        { role: 'redo' },
        { type: 'separator' },
        { role: 'cut' },
        { role: 'copy' },
        { role: 'paste' },
        { role: 'pasteandmatchstyle' },
        { role: 'delete' },
        { role: 'selectall' }
      ]
    },
    {
      role: 'window',
      submenu: [
        { role: 'minimize' },
        { role: 'close' }
      ]
    }
  ]

  const version = app.getVersion()

  if (process.platform === 'win32') {
    template.unshift({
      label: 'Ride Receipts',
      submenu: [
        {
          label: 'About',
          click: () =>
            openAboutWindow({
              icon_path: path.join(__static, '/256x256.png'),
              copyright: 'Copyright (c) 2018 Hello Efficiency Inc.',
              open_devtools: process.env.NODE_ENV !== 'production',
              homepage: 'https:/ridereceipts.io',
              product_name: 'Ride Receipts',
              package_json_dir: path.join(__dirname, '../..'),
              use_version_info: false
            })
        },
        {
          label: 'Check for update',
          click: function (menuItem, browserWindow, event) {
            checkForUpdates(menuItem, browserWindow, event)
          }
        },
        {
          label: 'View license',
          click: () => shell.openExternal('https://ridereceipts.io/license-agreement/')
        },
        {
          label: `Version ${version}`,
          enabled: false
        },
        {
          label: 'View logs',
          click: function () {
            if (typeof logsWindow === 'undefined' || logsWindow === null || logsWindow.isDestroyed()) {
              const modalPath = process.env.NODE_ENV === 'development' ? 'http://localhost:9080/#/view-logs' : `file://${__dirname}/index.html#view-logs`
              logsWindow = new BrowserWindow({
                width: 860,
                height: 600,
                useContentSize: false,
                resizable: false,
                webPreferences: {
                  nodeIntegration: true,
                  nodeIntegrationInWorker: true,
                  webSecurity: false
                }
              })
              logsWindow.setTitle('Logs')
              logsWindow.loadURL(modalPath)
            } else {
              logsWindow.show()
            }
          }
        },
        { type: 'separator' },
        { role: 'hide' },
        { role: 'hideothers' },
        { role: 'unhide' },
        { type: 'separator' },
        { role: 'quit' }
      ]
    })
  }

  if (process.platform === 'darwin') {
    template.unshift({
      label: 'Ride Receipts',
      submenu: [
        { role: 'about' },
        {
          label: 'View license',
          click: () => shell.openExternal('https://ridereceipts.io/license-agreement/')
        },
        {
          label: 'Check for update',
          click: function (menuItem, browserWindow, event) {
            checkForUpdates(menuItem, browserWindow, event)
          }
        },
        {
          label: `Version ${version}`,
          enabled: false
        },
        {
          label: 'View logs',
          click: function () {
            if (typeof logsWindow === 'undefined' || logsWindow === null || logsWindow.isDestroyed()) {
              const modalPath = process.env.NODE_ENV === 'development' ? 'http://localhost:9080/#/view-logs' : `file://${__dirname}/index.html#view-logs`
              logsWindow = new BrowserWindow({
                width: 860,
                height: 600,
                useContentSize: false,
                resizable: false,
                webPreferences: {
                  nodeIntegration: true,
                  nodeIntegrationInWorker: true,
                  webSecurity: false
                }
              })
              logsWindow.setTitle('Logs')
              logsWindow.loadURL(modalPath)
            } else {
              logsWindow.show()
            }
          }
        },
        { type: 'separator' },
        { role: 'services' },
        { type: 'separator' },
        { role: 'hide' },
        { role: 'hideothers' },
        { role: 'unhide' },
        { type: 'separator' },
        { role: 'quit' }
      ]
    })
  }

  Menu.setApplicationMenu(Menu.buildFromTemplate(template))
}
// Allow only one instance
app.requestSingleInstanceLock()
app.on('second-instance', function (event, argv, cwd) {
  app.quit()
})

app.commandLine.appendSwitch('disable-renderer-backgrounding')
app.on('ready', () => {
  createWindow()
  // Move to Application folder on MacOS
  enforceMacOSAppLocation()
  if (process.env.NODE_ENV === 'production') {
    autoUpdateApp()
  }
})

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('quit', () => {
  session.defaultSession.clearStorageData()
})

app.on('activate', () => {
  if (mainWindow === null) {
    createWindow()
  }
})

ipcMain.on('online-status-changed', (event, status) => {
  event.sender.send('onlinestatus', status)
})

// Download PDF
ipcMain.on('downloadPDF', (event, data) => {
  const documentDir = jetpack.cwd(store.get('invoicePath'))
  const rideDirectory = data.rideType
  const cancelled = data.cancelled ? data.cancelled : false
  var invoiceDate = data.invoiceDate
  var folderPath
  if (cancelled) {
    folderPath = `${documentDir.path()}/${data.email}/${rideDirectory}/Cancelled/${data.year}/`
  } else {
    folderPath = `${documentDir.path()}/${data.email}/${rideDirectory}/${data.year}/`
  }

  if (!jetpack.exists(documentDir.path(folderPath))) {
    jetpack.dir(documentDir.path(folderPath))
  }

  const pdfBrowser = new BrowserWindow({
    show: false,
    webPreferences: {
      devTools: false,
      nodeIntegration: true
    }
  })
  pdfBrowser.loadURL(data.html)
  pdfBrowser.webContents.on('did-finish-load', async () => {
    const htmldata = await pdfBrowser.webContents.printToPDF({
      marginsType: 1,
      pageSize: 'A4',
      printBackground: true
    })
    fs.writeFile(`${folderPath}/${rideDirectory}-${invoiceDate}.pdf`, htmldata, (error) => {
      if (error) {
        log.error(error)
      }
      log.info('Write PDF successfully.')
      pdfBrowser.close()
    })
  })
})