Electron 11
This commit is contained in:
parent
1f065ce53e
commit
4321f76b0f
|
@ -56,7 +56,9 @@
|
||||||
CharacterPreviewHelper, RenderStyle
|
CharacterPreviewHelper, RenderStyle
|
||||||
} from './helper';
|
} from './helper';
|
||||||
|
|
||||||
import {Point, WebviewTag, remote} from 'electron';
|
import {Point, WebviewTag} from 'electron';
|
||||||
|
import * as remote from '@electron/remote';
|
||||||
|
|
||||||
import Timer = NodeJS.Timer;
|
import Timer = NodeJS.Timer;
|
||||||
import IpcMessageEvent = Electron.IpcMessageEvent;
|
import IpcMessageEvent = Electron.IpcMessageEvent;
|
||||||
import CharacterPreview from './CharacterPreview.vue';
|
import CharacterPreview from './CharacterPreview.vue';
|
||||||
|
|
|
@ -110,6 +110,7 @@
|
||||||
import { Component, Hook, Watch } from '@f-list/vue-ts';
|
import { Component, Hook, Watch } from '@f-list/vue-ts';
|
||||||
import Axios from 'axios';
|
import Axios from 'axios';
|
||||||
import * as electron from 'electron';
|
import * as electron from 'electron';
|
||||||
|
import * as remote from '@electron/remote';
|
||||||
import log from 'electron-log'; //tslint:disable-line:match-default-export-name
|
import log from 'electron-log'; //tslint:disable-line:match-default-export-name
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
|
@ -143,11 +144,11 @@
|
||||||
// import Connection from '../fchat/connection';
|
// import Connection from '../fchat/connection';
|
||||||
// import Notifications from './notifications';
|
// import Notifications from './notifications';
|
||||||
|
|
||||||
const webContents = electron.remote.getCurrentWebContents();
|
const webContents = remote.getCurrentWebContents();
|
||||||
const parent = electron.remote.getCurrentWindow().webContents;
|
const parent = remote.getCurrentWindow().webContents;
|
||||||
|
|
||||||
// Allow requests to imgur.com
|
// Allow requests to imgur.com
|
||||||
const session = electron.remote.session;
|
const session = remote.session;
|
||||||
|
|
||||||
/* tslint:disable:no-unsafe-any no-any no-unnecessary-type-assertion */
|
/* tslint:disable:no-unsafe-any no-any no-unnecessary-type-assertion */
|
||||||
session!.defaultSession!.webRequest!.onBeforeSendHeaders(
|
session!.defaultSession!.webRequest!.onBeforeSendHeaders(
|
||||||
|
@ -453,7 +454,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
async openProfileInBrowser(): Promise<void> {
|
async openProfileInBrowser(): Promise<void> {
|
||||||
await electron.remote.shell.openExternal(`https://www.f-list.net/c/${this.profileName}`);
|
await remote.shell.openExternal(`https://www.f-list.net/c/${this.profileName}`);
|
||||||
|
|
||||||
// tslint:disable-next-line: no-any no-unsafe-any
|
// tslint:disable-next-line: no-any no-unsafe-any
|
||||||
(this.$refs.profileViewer as any).hide();
|
(this.$refs.profileViewer as any).hide();
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
<i class="fa fa-cog"></i>
|
<i class="fa fa-cog"></i>
|
||||||
</div>
|
</div>
|
||||||
<ul class="nav nav-tabs" style="border-bottom:0;margin-bottom:-1px;margin-top:1px" ref="tabs">
|
<ul class="nav nav-tabs" style="border-bottom:0;margin-bottom:-1px;margin-top:1px" ref="tabs">
|
||||||
<li v-for="tab in tabs" :key="tab.view.id" class="nav-item" @click.middle="remove(tab)">
|
<li v-for="(tab,index) in tabs" :key="'tab-' + index" class="nav-item" @click.middle="remove(tab)">
|
||||||
<a href="#" @click.prevent="show(tab)" class="nav-link tab"
|
<a href="#" @click.prevent="show(tab)" class="nav-link tab"
|
||||||
:class="{active: tab === activeTab, hasNew: tab.hasNew && tab !== activeTab}">
|
:class="{active: tab === activeTab, hasNew: tab.hasNew && tab !== activeTab}">
|
||||||
<img v-if="tab.user" :src="'https://static.f-list.net/images/avatar/' + tab.user.toLowerCase() + '.png'"/>
|
<img v-if="tab.user" :src="'https://static.f-list.net/images/avatar/' + tab.user.toLowerCase() + '.png'"/>
|
||||||
|
@ -38,6 +38,7 @@
|
||||||
|
|
||||||
import {Component, Hook} from '@f-list/vue-ts';
|
import {Component, Hook} from '@f-list/vue-ts';
|
||||||
import * as electron from 'electron';
|
import * as electron from 'electron';
|
||||||
|
import * as remote from '@electron/remote';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as url from 'url';
|
import * as url from 'url';
|
||||||
|
@ -47,7 +48,7 @@
|
||||||
import { getSafeLanguages, updateSupportedLanguages } from './language';
|
import { getSafeLanguages, updateSupportedLanguages } from './language';
|
||||||
import log from 'electron-log'; // tslint:disable-line: match-default-export-name
|
import log from 'electron-log'; // tslint:disable-line: match-default-export-name
|
||||||
|
|
||||||
const browserWindow = electron.remote.getCurrentWindow();
|
const browserWindow = remote.getCurrentWindow();
|
||||||
|
|
||||||
// void browserWindow.webContents.setVisualZoomLevelLimits(1, 5);
|
// void browserWindow.webContents.setVisualZoomLevelLimits(1, 5);
|
||||||
|
|
||||||
|
@ -60,7 +61,43 @@
|
||||||
function destroyTab(tab: Tab): void {
|
function destroyTab(tab: Tab): void {
|
||||||
if(tab.user !== undefined) electron.ipcRenderer.send('disconnect', tab.user);
|
if(tab.user !== undefined) electron.ipcRenderer.send('disconnect', tab.user);
|
||||||
tab.tray.destroy();
|
tab.tray.destroy();
|
||||||
tab.view.destroy();
|
|
||||||
|
tab.view.webContents.stop();
|
||||||
|
tab.view.webContents.stopPainting();
|
||||||
|
|
||||||
|
try {
|
||||||
|
if ((tab.view.webContents as any).destroy) {
|
||||||
|
(tab.view.webContents as any).destroy();
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if ((tab.view.webContents as any).close) {
|
||||||
|
(tab.view.webContents as any).close();
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if ((tab.view as any).destroy) {
|
||||||
|
(tab.view as any).destroy();
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if ((tab.view as any).close) {
|
||||||
|
(tab.view as any).close();
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
// tab.view.destroy();
|
||||||
electron.ipcRenderer.send('tab-closed');
|
electron.ipcRenderer.send('tab-closed');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,7 +182,7 @@
|
||||||
tab.tray.setToolTip(`${l('title')} - ${tab.user}`);
|
tab.tray.setToolTip(`${l('title')} - ${tab.user}`);
|
||||||
const menu = this.createTrayMenu(tab);
|
const menu = this.createTrayMenu(tab);
|
||||||
menu.unshift({label: tab.user, enabled: false}, {type: 'separator'});
|
menu.unshift({label: tab.user, enabled: false}, {type: 'separator'});
|
||||||
tab.tray.setContextMenu(electron.remote.Menu.buildFromTemplate(menu));
|
tab.tray.setContextMenu(remote.Menu.buildFromTemplate(menu));
|
||||||
});
|
});
|
||||||
electron.ipcRenderer.on('disconnect', (_e: Event, id: number) => {
|
electron.ipcRenderer.on('disconnect', (_e: Event, id: number) => {
|
||||||
const tab = this.tabMap[id];
|
const tab = this.tabMap[id];
|
||||||
|
@ -155,7 +192,7 @@
|
||||||
}
|
}
|
||||||
tab.user = undefined;
|
tab.user = undefined;
|
||||||
tab.tray.setToolTip(l('title'));
|
tab.tray.setToolTip(l('title'));
|
||||||
tab.tray.setContextMenu(electron.remote.Menu.buildFromTemplate(this.createTrayMenu(tab)));
|
tab.tray.setContextMenu(remote.Menu.buildFromTemplate(this.createTrayMenu(tab)));
|
||||||
});
|
});
|
||||||
electron.ipcRenderer.on('has-new', (_e: Event, id: number, hasNew: boolean) => {
|
electron.ipcRenderer.on('has-new', (_e: Event, id: number, hasNew: boolean) => {
|
||||||
const tab = this.tabMap[id];
|
const tab = this.tabMap[id];
|
||||||
|
@ -252,11 +289,11 @@
|
||||||
|
|
||||||
async addTab(): Promise<void> {
|
async addTab(): Promise<void> {
|
||||||
if(this.lockTab) return;
|
if(this.lockTab) return;
|
||||||
const tray = new electron.remote.Tray(trayIcon);
|
const tray = new remote.Tray(trayIcon);
|
||||||
tray.setToolTip(l('title'));
|
tray.setToolTip(l('title'));
|
||||||
tray.on('click', (_e) => this.trayClicked(tab));
|
tray.on('click', (_e) => this.trayClicked(tab));
|
||||||
|
|
||||||
const view = new electron.remote.BrowserView(
|
const view = new remote.BrowserView(
|
||||||
{
|
{
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
webviewTag: true,
|
webviewTag: true,
|
||||||
|
@ -277,7 +314,7 @@
|
||||||
view.setAutoResize({width: true, height: true});
|
view.setAutoResize({width: true, height: true});
|
||||||
electron.ipcRenderer.send('tab-added', view.webContents.id);
|
electron.ipcRenderer.send('tab-added', view.webContents.id);
|
||||||
const tab = {active: false, view, user: undefined, hasNew: false, tray};
|
const tab = {active: false, view, user: undefined, hasNew: false, tray};
|
||||||
tray.setContextMenu(electron.remote.Menu.buildFromTemplate(this.createTrayMenu(tab)));
|
tray.setContextMenu(remote.Menu.buildFromTemplate(this.createTrayMenu(tab)));
|
||||||
this.tabs.push(tab);
|
this.tabs.push(tab);
|
||||||
this.tabMap[view.webContents.id] = tab;
|
this.tabMap[view.webContents.id] = tab;
|
||||||
this.show(tab);
|
this.show(tab);
|
||||||
|
@ -332,7 +369,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
openMenu(): void {
|
openMenu(): void {
|
||||||
electron.remote.Menu.getApplicationMenu()!.popup({});
|
remote.Menu.getApplicationMenu()!.popup({});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -30,6 +30,9 @@
|
||||||
* @see {@link https://github.com/f-list/exported|GitHub repo}
|
* @see {@link https://github.com/f-list/exported|GitHub repo}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// tslint:disable-next-line:no-submodule-imports no-import-side-effect
|
||||||
|
import 'core-js/es7/global';
|
||||||
|
|
||||||
// import { DebugLogger } from './debug-logger';
|
// import { DebugLogger } from './debug-logger';
|
||||||
// // @ts-ignore
|
// // @ts-ignore
|
||||||
// const dl = new DebugLogger('chat');
|
// const dl = new DebugLogger('chat');
|
||||||
|
@ -37,6 +40,7 @@
|
||||||
import Axios from 'axios';
|
import Axios from 'axios';
|
||||||
import {exec, execSync} from 'child_process';
|
import {exec, execSync} from 'child_process';
|
||||||
import * as electron from 'electron';
|
import * as electron from 'electron';
|
||||||
|
import * as remote from '@electron/remote';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as qs from 'querystring';
|
import * as qs from 'querystring';
|
||||||
import {getKey} from '../chat/common';
|
import {getKey} from '../chat/common';
|
||||||
|
@ -60,7 +64,7 @@ log.debug('init.chat');
|
||||||
|
|
||||||
document.addEventListener('keydown', (e: KeyboardEvent) => {
|
document.addEventListener('keydown', (e: KeyboardEvent) => {
|
||||||
if(e.ctrlKey && e.shiftKey && getKey(e) === Keys.KeyI)
|
if(e.ctrlKey && e.shiftKey && getKey(e) === Keys.KeyI)
|
||||||
electron.remote.getCurrentWebContents().toggleDevTools();
|
remote.getCurrentWebContents().toggleDevTools();
|
||||||
});
|
});
|
||||||
|
|
||||||
/* process.env.SPELLCHECKER_PREFER_HUNSPELL = '1';
|
/* process.env.SPELLCHECKER_PREFER_HUNSPELL = '1';
|
||||||
|
@ -76,12 +80,12 @@ const sc = nativeRequire<{
|
||||||
const spellchecker = new sc.Spellchecker();*/
|
const spellchecker = new sc.Spellchecker();*/
|
||||||
|
|
||||||
|
|
||||||
Axios.defaults.params = {__fchat: `desktop/${electron.remote.app.getVersion()}`};
|
Axios.defaults.params = {__fchat: `desktop/${remote.app.getVersion()}`};
|
||||||
|
|
||||||
if(process.env.NODE_ENV === 'production') {
|
if(process.env.NODE_ENV === 'production') {
|
||||||
// setupRaven('https://a9239b17b0a14f72ba85e8729b9d1612@sentry.f-list.net/2', electron.remote.app.getVersion());
|
// setupRaven('https://a9239b17b0a14f72ba85e8729b9d1612@sentry.f-list.net/2', remote.app.getVersion());
|
||||||
|
|
||||||
electron.remote.getCurrentWebContents().on('devtools-opened', () => {
|
remote.getCurrentWebContents().on('devtools-opened', () => {
|
||||||
console.log(`%c${l('consoleWarning.head')}`, 'background: red; color: yellow; font-size: 30pt');
|
console.log(`%c${l('consoleWarning.head')}`, 'background: red; color: yellow; font-size: 30pt');
|
||||||
console.log(`%c${l('consoleWarning.body')}`, 'font-size: 16pt; color:red');
|
console.log(`%c${l('consoleWarning.body')}`, 'font-size: 16pt; color:red');
|
||||||
});
|
});
|
||||||
|
@ -106,7 +110,7 @@ function openIncognito(url: string): void {
|
||||||
exec(`start ${start} ${url}`);
|
exec(`start ${start} ${url}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const webContents = electron.remote.getCurrentWebContents();
|
const webContents = remote.getCurrentWebContents();
|
||||||
const wordPosSearch = new WordPosSearch();
|
const wordPosSearch = new WordPosSearch();
|
||||||
|
|
||||||
webContents.on('context-menu', (_, props) => {
|
webContents.on('context-menu', (_, props) => {
|
||||||
|
@ -200,12 +204,12 @@ webContents.on('context-menu', (_, props) => {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(menuTemplate.length > 0) electron.remote.Menu.buildFromTemplate(menuTemplate).popup({});
|
if(menuTemplate.length > 0) remote.Menu.buildFromTemplate(menuTemplate).popup({});
|
||||||
|
|
||||||
log.debug('context.text', { linkText: props.linkText, misspelledWord: props.misspelledWord, selectionText: props.selectionText, titleText: props.titleText });
|
log.debug('context.text', { linkText: props.linkText, misspelledWord: props.misspelledWord, selectionText: props.selectionText, titleText: props.titleText });
|
||||||
});
|
});
|
||||||
|
|
||||||
let dictDir = path.join(electron.remote.app.getPath('userData'), 'spellchecker');
|
let dictDir = path.join(remote.app.getPath('userData'), 'spellchecker');
|
||||||
|
|
||||||
if(process.platform === 'win32') //get the path in DOS (8-character) format as special characters cause problems otherwise
|
if(process.platform === 'win32') //get the path in DOS (8-character) format as special characters cause problems otherwise
|
||||||
exec(`for /d %I in ("${dictDir}") do @echo %~sI`, (_, stdout) => dictDir = stdout.trim());
|
exec(`for /d %I in ("${dictDir}") do @echo %~sI`, (_, stdout) => dictDir = stdout.trim());
|
||||||
|
@ -244,7 +248,7 @@ onSettings(settings);
|
||||||
|
|
||||||
log.debug('init.chat.core');
|
log.debug('init.chat.core');
|
||||||
|
|
||||||
const connection = new Connection(`F-Chat 3.0 (${process.platform})`, electron.remote.app.getVersion(), Socket);
|
const connection = new Connection(`F-Chat 3.0 (${process.platform})`, remote.app.getVersion(), Socket);
|
||||||
initCore(connection, settings, Logs, SettingsStore, Notifications);
|
initCore(connection, settings, Logs, SettingsStore, Notifications);
|
||||||
|
|
||||||
log.debug('init.chat.vue');
|
log.debug('init.chat.vue');
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// tslint:disable-next-line:no-submodule-imports no-import-side-effect
|
||||||
|
import 'core-js/es7/global';
|
||||||
|
|
||||||
import * as electron from 'electron';
|
import * as electron from 'electron';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import * as electron from 'electron';
|
import * as remote from '@electron/remote';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import {promisify} from 'util';
|
import {promisify} from 'util';
|
||||||
|
@ -17,12 +17,12 @@ declare module '../chat/interfaces' {
|
||||||
const dayMs = 86400000;
|
const dayMs = 86400000;
|
||||||
const read = promisify(fs.read);
|
const read = promisify(fs.read);
|
||||||
|
|
||||||
function writeFile(p: fs.PathLike | number, data: string | object | number,
|
function writeFile(p: fs.PathLike | number, data: string | NodeJS.ArrayBufferView,
|
||||||
options?: {encoding?: string | null; mode?: number | string; flag?: string} | string | null): void {
|
options?: fs.WriteFileOptions): void {
|
||||||
try {
|
try {
|
||||||
fs.writeFileSync(p, data, options);
|
fs.writeFileSync(p, data, options);
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
electron.remote.dialog.showErrorBox(l('fs.error'), (<Error>e).message);
|
remote.dialog.showErrorBox(l('fs.error'), (<Error>e).message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,8 @@
|
||||||
// const dl = new DebugLogger('main');
|
// const dl = new DebugLogger('main');
|
||||||
|
|
||||||
import * as electron from 'electron';
|
import * as electron from 'electron';
|
||||||
|
import * as remoteMain from '@electron/remote/main';
|
||||||
|
|
||||||
import log from 'electron-log'; //tslint:disable-line:match-default-export-name
|
import log from 'electron-log'; //tslint:disable-line:match-default-export-name
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
|
@ -43,13 +45,13 @@ import l from '../chat/localize';
|
||||||
import {defaultHost, GeneralSettings} from './common';
|
import {defaultHost, GeneralSettings} from './common';
|
||||||
import { getSafeLanguages, knownLanguageNames, updateSupportedLanguages } from './language';
|
import { getSafeLanguages, knownLanguageNames, updateSupportedLanguages } from './language';
|
||||||
import * as windowState from './window_state';
|
import * as windowState from './window_state';
|
||||||
import BrowserWindow = Electron.BrowserWindow;
|
// import BrowserWindow = electron.BrowserWindow;
|
||||||
import MenuItem = Electron.MenuItem;
|
import MenuItem = electron.MenuItem;
|
||||||
import { ElectronBlocker } from '@cliqz/adblocker-electron';
|
import { ElectronBlocker } from '@cliqz/adblocker-electron';
|
||||||
import fetch from 'node-fetch';
|
import fetch from 'node-fetch';
|
||||||
import MenuItemConstructorOptions = Electron.MenuItemConstructorOptions;
|
import MenuItemConstructorOptions = electron.MenuItemConstructorOptions;
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import DownloadItem = Electron.DownloadItem;
|
import DownloadItem = electron.DownloadItem;
|
||||||
import { AdCoordinatorHost } from '../chat/ads/ad-coordinator-host';
|
import { AdCoordinatorHost } from '../chat/ads/ad-coordinator-host';
|
||||||
import { IpcMainEvent } from 'electron';
|
import { IpcMainEvent } from 'electron';
|
||||||
|
|
||||||
|
@ -59,9 +61,11 @@ const pck = require('./package.json');
|
||||||
// Module to control application life.
|
// Module to control application life.
|
||||||
const app = electron.app;
|
const app = electron.app;
|
||||||
|
|
||||||
|
remoteMain.initialize();
|
||||||
|
|
||||||
// Keep a global reference of the window object, if you don't, the window will
|
// Keep a global reference of the window object, if you don't, the window will
|
||||||
// be closed automatically when the JavaScript object is garbage collected.
|
// be closed automatically when the JavaScript object is garbage collected.
|
||||||
const windows: Electron.BrowserWindow[] = [];
|
const windows: electron.BrowserWindow[] = [];
|
||||||
const characters: string[] = [];
|
const characters: string[] = [];
|
||||||
let tabCount = 0;
|
let tabCount = 0;
|
||||||
|
|
||||||
|
@ -141,7 +145,7 @@ function setGeneralSettings(value: GeneralSettings): void {
|
||||||
log.transports.console.level = settings.risingSystemLogLevel;
|
log.transports.console.level = settings.risingSystemLogLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function addSpellcheckerItems(menu: Electron.Menu): Promise<void> {
|
async function addSpellcheckerItems(menu: electron.Menu): Promise<void> {
|
||||||
const selected = getSafeLanguages(settings.spellcheckLang);
|
const selected = getSafeLanguages(settings.spellcheckLang);
|
||||||
const langs = electron.session.defaultSession.availableSpellCheckerLanguages;
|
const langs = electron.session.defaultSession.availableSpellCheckerLanguages;
|
||||||
|
|
||||||
|
@ -162,7 +166,7 @@ async function addSpellcheckerItems(menu: Electron.Menu): Promise<void> {
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
function setUpWebContents(webContents: Electron.WebContents): void {
|
function setUpWebContents(webContents: electron.WebContents): void {
|
||||||
const openLinkExternally = (e: Event, linkUrl: string) => {
|
const openLinkExternally = (e: Event, linkUrl: string) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
const profileMatch = linkUrl.match(/^https?:\/\/(www\.)?f-list.net\/c\/([^/#]+)\/?#?/);
|
const profileMatch = linkUrl.match(/^https?:\/\/(www\.)?f-list.net\/c\/([^/#]+)\/?#?/);
|
||||||
|
@ -177,12 +181,16 @@ function setUpWebContents(webContents: Electron.WebContents): void {
|
||||||
webContents.on('new-window', openLinkExternally);
|
webContents.on('new-window', openLinkExternally);
|
||||||
}
|
}
|
||||||
|
|
||||||
function createWindow(): Electron.BrowserWindow | undefined {
|
function createWindow(): electron.BrowserWindow | undefined {
|
||||||
if(tabCount >= 3) return;
|
if(tabCount >= 3) return;
|
||||||
const lastState = windowState.getSavedWindowState();
|
const lastState = windowState.getSavedWindowState();
|
||||||
const windowProperties: Electron.BrowserWindowConstructorOptions & {maximized: boolean} = {
|
|
||||||
|
const windowProperties: electron.BrowserWindowConstructorOptions & {maximized: boolean} = {
|
||||||
...lastState, center: lastState.x === undefined, show: false,
|
...lastState, center: lastState.x === undefined, show: false,
|
||||||
webPreferences: { webviewTag: true, nodeIntegration: true, nodeIntegrationInWorker: true, spellcheck: true, enableRemoteModule: true }
|
webPreferences: {
|
||||||
|
webviewTag: true, nodeIntegration: true, nodeIntegrationInWorker: true, spellcheck: true,
|
||||||
|
enableRemoteModule: true, contextIsolation: false
|
||||||
|
} as any
|
||||||
};
|
};
|
||||||
|
|
||||||
if(process.platform === 'darwin') {
|
if(process.platform === 'darwin') {
|
||||||
|
@ -416,11 +424,11 @@ function onReady(): void {
|
||||||
|
|
||||||
const viewItem = {
|
const viewItem = {
|
||||||
label: `&${l('action.view')}`,
|
label: `&${l('action.view')}`,
|
||||||
submenu: <Electron.MenuItemConstructorOptions[]>[
|
submenu: <electron.MenuItemConstructorOptions[]>[
|
||||||
// {role: 'resetZoom'},
|
// {role: 'resetZoom'},
|
||||||
{
|
{
|
||||||
label: 'Reset Zoom',
|
label: 'Reset Zoom',
|
||||||
click: (_m: Electron.MenuItem, _w: Electron.BrowserWindow) => {
|
click: (_m: electron.MenuItem, _w: electron.BrowserWindow) => {
|
||||||
// log.info('MENU ZOOM0');
|
// log.info('MENU ZOOM0');
|
||||||
// w.webContents.setZoomLevel(0);
|
// w.webContents.setZoomLevel(0);
|
||||||
|
|
||||||
|
@ -434,7 +442,7 @@ function onReady(): void {
|
||||||
{
|
{
|
||||||
// role: 'zoomIn',
|
// role: 'zoomIn',
|
||||||
label: 'Zoom In',
|
label: 'Zoom In',
|
||||||
click: (_m: Electron.MenuItem, w: Electron.BrowserWindow) => {
|
click: (_m: electron.MenuItem, w: electron.BrowserWindow) => {
|
||||||
|
|
||||||
// log.info('MENU ZOOM+');
|
// log.info('MENU ZOOM+');
|
||||||
zoomLevel = Math.min(zoomLevel + w.webContents.getZoomFactor()/2, 6);
|
zoomLevel = Math.min(zoomLevel + w.webContents.getZoomFactor()/2, 6);
|
||||||
|
@ -448,7 +456,7 @@ function onReady(): void {
|
||||||
{
|
{
|
||||||
// role: 'zoomIn',
|
// role: 'zoomIn',
|
||||||
label: 'Zoom Out',
|
label: 'Zoom Out',
|
||||||
click: (_m: Electron.MenuItem, w: Electron.BrowserWindow) => {
|
click: (_m: electron.MenuItem, w: electron.BrowserWindow) => {
|
||||||
// log.info('MENU ZOOM-');
|
// log.info('MENU ZOOM-');
|
||||||
zoomLevel = Math.max(0, zoomLevel - w.webContents.getZoomFactor()/2);
|
zoomLevel = Math.max(0, zoomLevel - w.webContents.getZoomFactor()/2);
|
||||||
|
|
||||||
|
@ -493,14 +501,14 @@ function onReady(): void {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: l('action.newTab'),
|
label: l('action.newTab'),
|
||||||
click: (_m: Electron.MenuItem, w: Electron.BrowserWindow) => {
|
click: (_m: electron.MenuItem, w: electron.BrowserWindow) => {
|
||||||
if((hasCompletedUpgrades) && (tabCount < 3)) w.webContents.send('open-tab');
|
if((hasCompletedUpgrades) && (tabCount < 3)) w.webContents.send('open-tab');
|
||||||
},
|
},
|
||||||
accelerator: 'CmdOrCtrl+t'
|
accelerator: 'CmdOrCtrl+t'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: l('settings.logDir'),
|
label: l('settings.logDir'),
|
||||||
click: (_m, window: BrowserWindow) => {
|
click: (_m, window: electron.BrowserWindow) => {
|
||||||
const dir = electron.dialog.showOpenDialogSync(
|
const dir = electron.dialog.showOpenDialogSync(
|
||||||
{defaultPath: settings.logDirectory, properties: ['openDirectory']});
|
{defaultPath: settings.logDirectory, properties: ['openDirectory']});
|
||||||
if(dir !== undefined) {
|
if(dir !== undefined) {
|
||||||
|
@ -522,13 +530,13 @@ function onReady(): void {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: l('settings.closeToTray'), type: 'checkbox', checked: settings.closeToTray,
|
label: l('settings.closeToTray'), type: 'checkbox', checked: settings.closeToTray,
|
||||||
click: (item: Electron.MenuItem) => {
|
click: (item: electron.MenuItem) => {
|
||||||
settings.closeToTray = item.checked;
|
settings.closeToTray = item.checked;
|
||||||
setGeneralSettings(settings);
|
setGeneralSettings(settings);
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
label: l('settings.profileViewer'), type: 'checkbox', checked: settings.profileViewer,
|
label: l('settings.profileViewer'), type: 'checkbox', checked: settings.profileViewer,
|
||||||
click: (item: Electron.MenuItem) => {
|
click: (item: electron.MenuItem) => {
|
||||||
settings.profileViewer = item.checked;
|
settings.profileViewer = item.checked;
|
||||||
setGeneralSettings(settings);
|
setGeneralSettings(settings);
|
||||||
}
|
}
|
||||||
|
@ -544,7 +552,7 @@ function onReady(): void {
|
||||||
}))
|
}))
|
||||||
}, {
|
}, {
|
||||||
label: l('settings.hwAcceleration'), type: 'checkbox', checked: settings.hwAcceleration,
|
label: l('settings.hwAcceleration'), type: 'checkbox', checked: settings.hwAcceleration,
|
||||||
click: (item: Electron.MenuItem) => {
|
click: (item: electron.MenuItem) => {
|
||||||
settings.hwAcceleration = item.checked;
|
settings.hwAcceleration = item.checked;
|
||||||
setGeneralSettings(settings);
|
setGeneralSettings(settings);
|
||||||
}
|
}
|
||||||
|
@ -552,7 +560,7 @@ function onReady(): void {
|
||||||
|
|
||||||
// {
|
// {
|
||||||
// label: l('settings.beta'), type: 'checkbox', checked: settings.beta,
|
// label: l('settings.beta'), type: 'checkbox', checked: settings.beta,
|
||||||
// click: async(item: Electron.MenuItem) => {
|
// click: async(item: electron.MenuItem) => {
|
||||||
// settings.beta = item.checked;
|
// settings.beta = item.checked;
|
||||||
// setGeneralSettings(settings);
|
// setGeneralSettings(settings);
|
||||||
// // electron.autoUpdater.setFeedURL({url: updaterUrl+(item.checked ? '?channel=beta' : ''), serverType: 'json'});
|
// // electron.autoUpdater.setFeedURL({url: updaterUrl+(item.checked ? '?channel=beta' : ''), serverType: 'json'});
|
||||||
|
@ -561,7 +569,7 @@ function onReady(): void {
|
||||||
// },
|
// },
|
||||||
{
|
{
|
||||||
label: l('fixLogs.action'),
|
label: l('fixLogs.action'),
|
||||||
click: (_m, window: BrowserWindow) => window.webContents.send('fix-logs')
|
click: (_m, window: electron.BrowserWindow) => window.webContents.send('fix-logs')
|
||||||
},
|
},
|
||||||
|
|
||||||
{type: 'separator'},
|
{type: 'separator'},
|
||||||
|
@ -583,7 +591,7 @@ function onReady(): void {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Show/hide current profile',
|
label: 'Show/hide current profile',
|
||||||
click: (_m: Electron.MenuItem, w: Electron.BrowserWindow) => {
|
click: (_m: electron.MenuItem, w: electron.BrowserWindow) => {
|
||||||
w.webContents.send('reopen-profile');
|
w.webContents.send('reopen-profile');
|
||||||
},
|
},
|
||||||
accelerator: 'CmdOrCtrl+p'
|
accelerator: 'CmdOrCtrl+p'
|
||||||
|
@ -595,7 +603,7 @@ function onReady(): void {
|
||||||
{
|
{
|
||||||
accelerator: process.platform === 'darwin' ? 'Cmd+Q' : undefined,
|
accelerator: process.platform === 'darwin' ? 'Cmd+Q' : undefined,
|
||||||
label: l('action.quit'),
|
label: l('action.quit'),
|
||||||
click(_m: Electron.MenuItem, window: Electron.BrowserWindow): void {
|
click(_m: electron.MenuItem, window: electron.BrowserWindow): void {
|
||||||
if(characters.length === 0) return app.quit();
|
if(characters.length === 0) return app.quit();
|
||||||
const button = electron.dialog.showMessageBoxSync(window, {
|
const button = electron.dialog.showMessageBoxSync(window, {
|
||||||
message: l('chat.confirmLeave'),
|
message: l('chat.confirmLeave'),
|
||||||
|
@ -663,7 +671,7 @@ function onReady(): void {
|
||||||
settings.host = host;
|
settings.host = host;
|
||||||
setGeneralSettings(settings);
|
setGeneralSettings(settings);
|
||||||
});
|
});
|
||||||
electron.ipcMain.on('connect', (e: Event & {sender: Electron.WebContents}, character: string) => {
|
electron.ipcMain.on('connect', (e: Event & {sender: electron.WebContents}, character: string) => {
|
||||||
if(characters.indexOf(character) !== -1) return e.returnValue = false;
|
if(characters.indexOf(character) !== -1) return e.returnValue = false;
|
||||||
characters.push(character);
|
characters.push(character);
|
||||||
e.returnValue = true;
|
e.returnValue = true;
|
||||||
|
@ -695,9 +703,9 @@ function onReady(): void {
|
||||||
path.join(__dirname, <string>require('./build/badge.png').default)
|
path.join(__dirname, <string>require('./build/badge.png').default)
|
||||||
);
|
);
|
||||||
|
|
||||||
electron.ipcMain.on('has-new', (e: Event & {sender: Electron.WebContents}, hasNew: boolean) => {
|
electron.ipcMain.on('has-new', (e: Event & {sender: electron.WebContents}, hasNew: boolean) => {
|
||||||
if(process.platform === 'darwin') app.dock.setBadge(hasNew ? '!' : '');
|
if(process.platform === 'darwin') app.dock.setBadge(hasNew ? '!' : '');
|
||||||
const window = electron.BrowserWindow.fromWebContents(e.sender) as BrowserWindow | undefined;
|
const window = electron.BrowserWindow.fromWebContents(e.sender) as electron.BrowserWindow | undefined;
|
||||||
if(window !== undefined) window.setOverlayIcon(hasNew ? badge : emptyBadge, hasNew ? 'New messages' : '');
|
if(window !== undefined) window.setOverlayIcon(hasNew ? badge : emptyBadge, hasNew ? 'New messages' : '');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -707,9 +715,9 @@ function onReady(): void {
|
||||||
for(const w of electron.webContents.getAllWebContents()) w.send('rising-upgrade-complete');
|
for(const w of electron.webContents.getAllWebContents()) w.send('rising-upgrade-complete');
|
||||||
});
|
});
|
||||||
|
|
||||||
electron.ipcMain.on('update-zoom', (_e, zoomLevel: number) => {
|
electron.ipcMain.on('update-zoom', (_e, zl: number) => {
|
||||||
// log.info('MENU ZOOM UPDATE', zoomLevel);
|
// log.info('MENU ZOOM UPDATE', zoomLevel);
|
||||||
for(const w of electron.webContents.getAllWebContents()) w.send('update-zoom', zoomLevel);
|
for(const w of electron.webContents.getAllWebContents()) w.send('update-zoom', zl);
|
||||||
});
|
});
|
||||||
|
|
||||||
createWindow();
|
createWindow();
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import {remote} from 'electron';
|
import * as remote from '@electron/remote';
|
||||||
import core from '../chat/core';
|
import core from '../chat/core';
|
||||||
import {Conversation} from '../chat/interfaces';
|
import {Conversation} from '../chat/interfaces';
|
||||||
//tslint:disable-next-line:match-default-export-name
|
//tslint:disable-next-line:match-default-export-name
|
||||||
|
@ -21,4 +21,4 @@ export default class Notifications extends BaseNotifications {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,8 @@ const mainConfig = {
|
||||||
entry: [path.join(__dirname, 'main.ts'), path.join(__dirname, 'package.json')],
|
entry: [path.join(__dirname, 'main.ts'), path.join(__dirname, 'package.json')],
|
||||||
output: {
|
output: {
|
||||||
path: __dirname + '/app',
|
path: __dirname + '/app',
|
||||||
filename: 'main.js'
|
filename: 'main.js',
|
||||||
|
globalObject: 'global'
|
||||||
},
|
},
|
||||||
context: __dirname,
|
context: __dirname,
|
||||||
target: 'electron-main',
|
target: 'electron-main',
|
||||||
|
@ -31,6 +32,7 @@ const mainConfig = {
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
node: {
|
node: {
|
||||||
|
global: true,
|
||||||
__dirname: false,
|
__dirname: false,
|
||||||
__filename: false
|
__filename: false
|
||||||
},
|
},
|
||||||
|
@ -104,6 +106,7 @@ const mainConfig = {
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
node: {
|
node: {
|
||||||
|
global: true,
|
||||||
__dirname: false,
|
__dirname: false,
|
||||||
__filename: false
|
__filename: false
|
||||||
},
|
},
|
||||||
|
@ -156,8 +159,13 @@ const storeWorkerEndpointConfig = _.assign(
|
||||||
filename: 'storeWorkerEndpoint.js',
|
filename: 'storeWorkerEndpoint.js',
|
||||||
globalObject: 'this'
|
globalObject: 'this'
|
||||||
},
|
},
|
||||||
|
|
||||||
target: 'electron-renderer',
|
target: 'electron-renderer',
|
||||||
|
|
||||||
|
node: {
|
||||||
|
global: true,
|
||||||
|
},
|
||||||
|
|
||||||
module: {
|
module: {
|
||||||
rules: [
|
rules: [
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// tslint:disable-next-line:no-submodule-imports no-import-side-effect
|
||||||
|
import 'core-js/es7/global';
|
||||||
|
|
||||||
import * as qs from 'querystring';
|
import * as qs from 'querystring';
|
||||||
import log from 'electron-log'; //tslint:disable-line:match-default-export-name
|
import log from 'electron-log'; //tslint:disable-line:match-default-export-name
|
||||||
|
|
||||||
|
@ -18,7 +21,7 @@ log.transports.file.maxSize = 5 * 1024 * 1024;
|
||||||
log.info('init.window.vue');
|
log.info('init.window.vue');
|
||||||
|
|
||||||
//tslint:disable-next-line:no-unused-expression
|
//tslint:disable-next-line:no-unused-expression
|
||||||
new Window({
|
export default new Window({
|
||||||
el: '#app',
|
el: '#app',
|
||||||
data: {settings}
|
data: {settings}
|
||||||
});
|
});
|
||||||
|
|
17
package.json
17
package.json
|
@ -5,12 +5,13 @@
|
||||||
"description": "A heavily modded F-Chat 3.0 client for F-List",
|
"description": "A heavily modded F-Chat 3.0 client for F-List",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@electron/remote": "^1.2.1",
|
||||||
"@f-list/fork-ts-checker-webpack-plugin": "^3.1.1",
|
"@f-list/fork-ts-checker-webpack-plugin": "^3.1.1",
|
||||||
"@f-list/vue-ts": "^1.0.3",
|
"@f-list/vue-ts": "^1.0.3",
|
||||||
"@fortawesome/fontawesome-free": "^5.15.1",
|
"@fortawesome/fontawesome-free": "^5.15.1",
|
||||||
"@types/bluebird": "^3.5.33",
|
"@types/bluebird": "^3.5.33",
|
||||||
"@types/lodash": "^4.14.164",
|
"@types/lodash": "^4.14.164",
|
||||||
"@types/node": "^12.12.47",
|
"@types/node": "^14.17.0",
|
||||||
"@types/node-fetch": "^2.5.12",
|
"@types/node-fetch": "^2.5.12",
|
||||||
"@types/qs": "^6.9.5",
|
"@types/qs": "^6.9.5",
|
||||||
"@types/request-promise": "^4.1.46",
|
"@types/request-promise": "^4.1.46",
|
||||||
|
@ -24,10 +25,10 @@
|
||||||
"copy-webpack-plugin": "^6.2.1",
|
"copy-webpack-plugin": "^6.2.1",
|
||||||
"css-loader": "^5.0.0",
|
"css-loader": "^5.0.0",
|
||||||
"date-fns": "^2.16.1",
|
"date-fns": "^2.16.1",
|
||||||
"electron": "^10.1.5",
|
"electron": "^11.5.0",
|
||||||
"electron-log": "^4.2.4",
|
"electron-log": "^4.4.1",
|
||||||
"electron-packager": "^15.1.0",
|
"electron-packager": "~15.1.0",
|
||||||
"electron-rebuild": "^2.3.2",
|
"electron-rebuild": "^3.2.3",
|
||||||
"extract-loader": "^5.1.0",
|
"extract-loader": "^5.1.0",
|
||||||
"file-loader": "^6.2.0",
|
"file-loader": "^6.2.0",
|
||||||
"lodash": "^4.17.20",
|
"lodash": "^4.17.20",
|
||||||
|
@ -49,10 +50,10 @@
|
||||||
"vue": "2.6.12",
|
"vue": "2.6.12",
|
||||||
"vue-loader": "^15.9.8",
|
"vue-loader": "^15.9.8",
|
||||||
"vue-template-compiler": "2.6.12",
|
"vue-template-compiler": "2.6.12",
|
||||||
"webpack": "^5.3.2"
|
"webpack": "5.8.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@cliqz/adblocker-electron": "^1.20.5",
|
"@cliqz/adblocker-electron": "^1.22.5",
|
||||||
"jquery": "^3.6.0",
|
"jquery": "^3.6.0",
|
||||||
"keytar": "~7.5.0",
|
"keytar": "~7.5.0",
|
||||||
"node-fetch": "^2.6.2"
|
"node-fetch": "^2.6.2"
|
||||||
|
@ -60,7 +61,7 @@
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"appdmg": "^0.6.0",
|
"appdmg": "^0.6.0",
|
||||||
"electron-squirrel-startup": "^1.0.0",
|
"electron-squirrel-startup": "^1.0.0",
|
||||||
"electron-winstaller": "^4.0.1"
|
"electron-winstaller": "^5.0.0"
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"vue": "2.6.12",
|
"vue": "2.6.12",
|
||||||
|
|
Loading…
Reference in New Issue