Merge branch 'main' into export-v2

This commit is contained in:
Abhinav 2021-12-19 11:56:14 +05:30
commit bde85721ff
8 changed files with 208 additions and 170 deletions

6
.prettierrc.json Normal file
View file

@ -0,0 +1,6 @@
{
"tabWidth": 4,
"trailingComma": "es5",
"singleQuote": true,
"bracketSameLine": true
}

View file

@ -52,6 +52,7 @@
"electron-builder-notarize": "^1.2.0",
"electron-download": "^4.1.1",
"eslint": "^7.23.0",
"prettier": "2.5.1",
"typescript": "^4.2.3"
},
"dependencies": {

View file

@ -1,11 +1,4 @@
import {
app,
BrowserWindow,
Menu,
Tray,
dialog,
nativeImage,
} from 'electron';
import { app, BrowserWindow, Menu, Tray, dialog, nativeImage } from 'electron';
import * as path from 'path';
import * as isDev from 'electron-is-dev';
import AppUpdater from './utils/appUpdater';
@ -14,7 +7,6 @@ import setupIpcComs from './utils/ipcComms';
import { buildContextMenu, buildMenuBar } from './utils/menuUtil';
import initSentry from './utils/sentry';
let tray: Tray;
let mainWindow: BrowserWindow;
@ -24,49 +16,46 @@ let updateIsAvailable = false;
export const isAppQuitting = (): boolean => {
return appIsQuitting;
}
};
export const setIsAppQuitting = (value: boolean): void => {
appIsQuitting = value;
}
};
export const isUpdateAvailable = (): boolean => {
return updateIsAvailable;
}
};
export const setIsUpdateAvailable = (value: boolean): void => {
updateIsAvailable = value;
}
};
// Disable error dialogs by overriding
dialog.showErrorBox = function (title, content) {
console.log(`${title}\n${content}`);
};
const gotTheLock = app.requestSingleInstanceLock();
if (!gotTheLock) {
app.quit();
}
else {
} else {
app.on('second-instance', () => {
// Someone tried to run a second instance, we should focus our window.
if (mainWindow) {
mainWindow.show();
if (mainWindow.isMinimized()) {
mainWindow.restore()
mainWindow.restore();
}
mainWindow.focus()
mainWindow.focus();
}
})
});
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', () => {
initSentry();
setIsUpdateAvailable(false)
setIsUpdateAvailable(false);
mainWindow = createWindow();
Menu.setApplicationMenu(buildMenuBar())
Menu.setApplicationMenu(buildMenuBar());
app.on('activate', function () {
// On macOS it's common to re-create a window in the app when the
@ -87,8 +76,4 @@ else {
AppUpdater.checkForUpdate(tray, mainWindow);
}
});
}

View file

@ -1,37 +1,39 @@
import { BrowserWindow, dialog, Tray } from "electron"
import { autoUpdater } from "electron-updater"
import log from "electron-log"
import { setIsAppQuitting, setIsUpdateAvailable } from "../main";
import { buildContextMenu } from "./menuUtil";
import { BrowserWindow, dialog, Tray } from 'electron';
import { autoUpdater } from 'electron-updater';
import log from 'electron-log';
import { setIsAppQuitting, setIsUpdateAvailable } from '../main';
import { buildContextMenu } from './menuUtil';
class AppUpdater {
constructor() {
log.transports.file.level = "debug"
autoUpdater.logger = log;
}
constructor() {
log.transports.file.level = 'debug';
autoUpdater.logger = log;
}
async checkForUpdate(tray: Tray, mainWindow: BrowserWindow) {
await autoUpdater.checkForUpdatesAndNotify()
autoUpdater.on('update-downloaded', () => {
showUpdateDialog();
setIsUpdateAvailable(true);
tray.setContextMenu(buildContextMenu(mainWindow));
})
}
async checkForUpdate(tray: Tray, mainWindow: BrowserWindow) {
await autoUpdater.checkForUpdatesAndNotify();
autoUpdater.on('update-downloaded', () => {
showUpdateDialog();
setIsUpdateAvailable(true);
tray.setContextMenu(buildContextMenu(mainWindow));
});
}
}
export default new AppUpdater();
export const showUpdateDialog = ():void => {
dialog.showMessageBox({
type: 'info',
title: 'install update',
message: 'restart to update to the latest version of ente',
buttons: ['later', 'restart now']
}).then((buttonIndex) => {
if (buttonIndex.response === 1) {
setIsAppQuitting(true); autoUpdater.quitAndInstall()
}
})
}
export const showUpdateDialog = (): void => {
dialog
.showMessageBox({
type: 'info',
title: 'install update',
message: 'restart to update to the latest version of ente',
buttons: ['later', 'restart now'],
})
.then((buttonIndex) => {
if (buttonIndex.response === 1) {
setIsAppQuitting(true);
autoUpdater.quitAndInstall();
}
});
};

View file

@ -1,8 +1,11 @@
import { BrowserWindow, dialog, ipcMain, Tray, Notification } from "electron";
import { createWindow } from "./createWindow";
import { buildContextMenu } from "./menuUtil";
import { BrowserWindow, dialog, ipcMain, Tray, Notification } from 'electron';
import { createWindow } from './createWindow';
import { buildContextMenu } from './menuUtil';
export default function setupIpcComs(tray: Tray, mainWindow: BrowserWindow): void {
export default function setupIpcComs(
tray: Tray,
mainWindow: BrowserWindow
): void {
ipcMain.on('select-dir', async (event) => {
const dialogWindow = new BrowserWindow({
width: 800,
@ -17,7 +20,9 @@ export default function setupIpcComs(tray: Tray, mainWindow: BrowserWindow): voi
properties: ['openDirectory'],
});
const dir =
result.filePaths && result.filePaths.length > 0 && result.filePaths[0];
result.filePaths &&
result.filePaths.length > 0 &&
result.filePaths[0];
dialogWindow.close();
event.returnValue = dir;
});

View file

@ -1,66 +1,83 @@
import { Menu, app, shell, BrowserWindow, MenuItemConstructorOptions } from "electron";
import { isUpdateAvailable, setIsAppQuitting } from "../main";
import { showUpdateDialog } from "./appUpdater";
import {
Menu,
app,
shell,
BrowserWindow,
MenuItemConstructorOptions,
} from 'electron';
import { isUpdateAvailable, setIsAppQuitting } from '../main';
import { showUpdateDialog } from './appUpdater';
const isMac = process.platform === 'darwin';
const isMac = process.platform === 'darwin'
export function buildContextMenu(mainWindow: BrowserWindow, args: any = {}): Menu {
const { export_progress, retry_export, paused } = args
export function buildContextMenu(
mainWindow: BrowserWindow,
args: any = {}
): Menu {
const { export_progress, retry_export, paused } = args;
const contextMenu = Menu.buildFromTemplate([
...(isUpdateAvailable() && [{
label: 'update available',
click: () => showUpdateDialog()
}]),
...(isUpdateAvailable() && [
{
label: 'update available',
click: () => showUpdateDialog(),
},
]),
{ type: 'separator' },
...(export_progress
? [
{
label: export_progress,
click: () => mainWindow.show(),
},
...(paused ?
[{
label: 'resume export',
click: () => mainWindow.webContents.send('resume-export'),
}] :
[{
label: 'pause export',
click: () => mainWindow.webContents.send('pause-export'),
},
{
label: 'stop export',
click: () => mainWindow.webContents.send('stop-export'),
}]
)
]
{
label: export_progress,
click: () => mainWindow.show(),
},
...(paused
? [
{
label: 'resume export',
click: () =>
mainWindow.webContents.send(
'resume-export'
),
},
]
: [
{
label: 'pause export',
click: () =>
mainWindow.webContents.send('pause-export'),
},
{
label: 'stop export',
click: () =>
mainWindow.webContents.send('stop-export'),
},
]),
]
: []),
...(retry_export
? [
{
label: 'export failed',
click: null,
},
{
label: 'retry export',
click: () => mainWindow.webContents.send('retry-export'),
},
]
: []
),
{
label: 'export failed',
click: null,
},
{
label: 'retry export',
click: () => mainWindow.webContents.send('retry-export'),
},
]
: []),
{ type: 'separator' },
{
label: 'open ente',
click: function () {
mainWindow.show();
const isMac = process.platform === 'darwin'
const isMac = process.platform === 'darwin';
isMac && app.dock.show();
},
},
{
label: 'quit ente',
click: function () {
setIsAppQuitting(true)
setIsAppQuitting(true);
app.quit();
},
},
@ -69,14 +86,16 @@ export function buildContextMenu(mainWindow: BrowserWindow, args: any = {}): Men
}
export function buildMenuBar(): Menu {
const template: MenuItemConstructorOptions[]=[
const template: MenuItemConstructorOptions[] = [
{
label:app.name,
submenu:[...(isMac &&[
{
label: "about" ,
role: 'about'
}]) as MenuItemConstructorOptions[],
label: app.name,
submenu: [
...((isMac && [
{
label: 'about',
role: 'about',
},
]) as MenuItemConstructorOptions[]),
{
label: 'faq',
click: () => shell.openExternal('https://ente.io/faq/'),
@ -88,68 +107,83 @@ export function buildMenuBar(): Menu {
{
label: 'quit',
accelerator: 'CommandOrControl+Q',
click() { setIsAppQuitting(true); app.quit(); }
}
]
click() {
setIsAppQuitting(true);
app.quit();
},
},
],
},
{
label: 'edit',
submenu: [
{ role: 'undo',label:"undo" },
{ role: 'redo' ,label:"redo"},
{ type: 'separator'},
{ role: 'cut' ,label:"cut"},
{ role: 'copy' ,label:"copy"},
{ role: 'paste' ,label:"paste"},
...(isMac ?[
{ role: 'pasteAndMatchStyle' ,label:"paste and match style"},
{ role: 'delete' ,label:"delete"},
{ role: 'selectAll' ,label:"select all"},
{ type: 'separator'},
{
label: 'speech',
submenu: [
{ role: 'startSpeaking' ,label:"start speaking"},
{ role: 'stopSpeaking' ,label:"stop speaking"}
]
}
] : [
{ role: 'undo', label: 'undo' },
{ role: 'redo', label: 'redo' },
{ type: 'separator' },
{ role: 'selectAll',label:"select all" }
])as MenuItemConstructorOptions[]
]
{ role: 'cut', label: 'cut' },
{ role: 'copy', label: 'copy' },
{ role: 'paste', label: 'paste' },
...((isMac
? [
{
role: 'pasteAndMatchStyle',
label: 'paste and match style',
},
{ role: 'delete', label: 'delete' },
{ role: 'selectAll', label: 'select all' },
{ type: 'separator' },
{
label: 'speech',
submenu: [
{
role: 'startSpeaking',
label: 'start speaking',
},
{
role: 'stopSpeaking',
label: 'stop speaking',
},
],
},
]
: [
{ type: 'separator' },
{ role: 'selectAll', label: 'select all' },
]) as MenuItemConstructorOptions[]),
],
},
// { role: 'viewMenu' }
{
// { role: 'viewMenu' }
{
label: 'view',
submenu: [
{ role: 'reload',label:"reload" },
{ role: 'forceReload',label:"force reload" },
{ role: 'toggleDevTools' ,label:"toggle devTools"},
{ type: 'separator' },
{ role: 'resetZoom',label:"reset zoom" },
{ role: 'zoomIn',label:"zoom in" },
{ role: 'zoomOut' ,label:"zoom out"},
{ type: 'separator' },
{ role: 'togglefullscreen' ,label:"toggle fullscreen"}
]
},
// { role: 'windowMenu' }
{
{ role: 'reload', label: 'reload' },
{ role: 'forceReload', label: 'force reload' },
{ role: 'toggleDevTools', label: 'toggle devTools' },
{ type: 'separator' },
{ role: 'resetZoom', label: 'reset zoom' },
{ role: 'zoomIn', label: 'zoom in' },
{ role: 'zoomOut', label: 'zoom out' },
{ type: 'separator' },
{ role: 'togglefullscreen', label: 'toggle fullscreen' },
],
},
// { role: 'windowMenu' }
{
label: 'window',
submenu: [
{ role: 'minimize' ,label:"minimize"},
...(isMac ? [
{ type: 'separator'},
{ role: 'front',label:"front" },
{ type: 'separator' },
{ role: 'window' ,label:"window"}
] : [
{ role: 'close' ,label:"close"}
])as MenuItemConstructorOptions[]
]
},
]
return Menu.buildFromTemplate(template)
{ role: 'minimize', label: 'minimize' },
...((isMac
? [
{ type: 'separator' },
{ role: 'front', label: 'front' },
{ type: 'separator' },
{ role: 'window', label: 'window' },
]
: [
{ role: 'close', label: 'close' },
]) as MenuItemConstructorOptions[]),
],
},
];
return Menu.buildFromTemplate(template);
}

View file

@ -1,12 +1,12 @@
import * as Sentry from "@sentry/electron/dist/main";
import * as Sentry from '@sentry/electron/dist/main';
const SENTRY_DSN="https://e9268b784d1042a7a116f53c58ad2165@sentry.ente.io/5";
const SENTRY_DSN = 'https://e9268b784d1042a7a116f53c58ad2165@sentry.ente.io/5';
// eslint-disable-next-line @typescript-eslint/no-var-requires
const version =require('../../package.json').version;
const version = require('../../package.json').version;
function initSentry():void{
Sentry.init({ dsn: SENTRY_DSN,release:version});
function initSentry(): void {
Sentry.init({ dsn: SENTRY_DSN, release: version });
}
export default initSentry;

View file

@ -2727,6 +2727,11 @@ prepend-http@^2.0.0:
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
prettier@2.5.1:
version "2.5.1"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a"
integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==
pretty-bytes@^1.0.2:
version "1.0.4"
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84"