split tabs into separate mod, add opt for default page, load default settings when store()-ing another mod id

This commit is contained in:
dragonwocky 2020-10-12 21:44:12 +11:00
parent 22b4153703
commit ee88c63f38
6 changed files with 129 additions and 41 deletions

View File

@ -15,7 +15,7 @@ module.exports = (store) => {
buttons = { buttons = {
element: helpers.createElement('<div class="window-buttons-area"></div>'), element: helpers.createElement('<div class="window-buttons-area"></div>'),
insert: [ insert: [
...((store('mods', {})['72886371-dada-49a7-9afc-9f275ecf29d3'] || {}) ...((store('mods')['72886371-dada-49a7-9afc-9f275ecf29d3'] || {})
.enabled .enabled
? ['alwaysontop'] ? ['alwaysontop']
: []), : []),

View File

@ -19,12 +19,16 @@ module.exports = (store, __exports) => {
// additional hotkeys // additional hotkeys
document.defaultView.addEventListener('keyup', (event) => { document.defaultView.addEventListener('keyup', (event) => {
if (event.code === 'F5') location.reload(); if (event.code === 'F5') location.reload();
// open menu on hotkey toggle if (
const hotkey = toKeyEvent(store().menu_toggle); !(store('mods')['e1692c29-475e-437b-b7ff-3eee872e1a42'] || {}).enabled
let triggered = true; ) {
for (let prop in hotkey) // open menu on hotkey toggle
if (hotkey[prop] !== event[prop]) triggered = false; const hotkey = toKeyEvent(store().menu_toggle);
if (triggered) electron.ipcRenderer.send('enhancer:open-menu'); let triggered = true;
for (let prop in hotkey)
if (hotkey[prop] !== event[prop]) triggered = false;
if (triggered) electron.ipcRenderer.send('enhancer:open-menu');
}
}); });
const attempt_interval = setInterval(enhance, 500); const attempt_interval = setInterval(enhance, 500);
@ -43,7 +47,11 @@ module.exports = (store, __exports) => {
document.body.classList.add('snappy-transitions'); document.body.classList.add('snappy-transitions');
// frameless // frameless
if (store().frameless && !store().tiling_mode && !store().tabs) { if (
store().frameless &&
!store().tiling_mode &&
!(store('mods')['e1692c29-475e-437b-b7ff-3eee872e1a42'] || {}).enabled
) {
document.body.classList.add('frameless'); document.body.classList.add('frameless');
// draggable area // draggable area
document document
@ -56,7 +64,9 @@ module.exports = (store, __exports) => {
} }
// window buttons // window buttons
if (!store().tabs) { if (
!(store('mods')['e1692c29-475e-437b-b7ff-3eee872e1a42'] || {}).enabled
) {
const buttons = require('./buttons.js')(store); const buttons = require('./buttons.js')(store);
document document
.querySelector('.notion-topbar > div[style*="display: flex"]') .querySelector('.notion-topbar > div[style*="display: flex"]')
@ -153,7 +163,9 @@ module.exports = (store, __exports) => {
'--theme--code_inline-background', '--theme--code_inline-background',
].map((rule) => [rule, getStyle(rule)]) ].map((rule) => [rule, getStyle(rule)])
); );
if (store().tabs) { if (
(store('mods')['e1692c29-475e-437b-b7ff-3eee872e1a42'] || {}).enabled
) {
electron.ipcRenderer.sendToHost( electron.ipcRenderer.sendToHost(
'enhancer:set-tab-theme', 'enhancer:set-tab-theme',
[ [
@ -179,7 +191,7 @@ module.exports = (store, __exports) => {
); );
electron.ipcRenderer.on('enhancer:get-menu-theme', setThemeVars); electron.ipcRenderer.on('enhancer:get-menu-theme', setThemeVars);
if (store().tabs) { if ((store('mods')['e1692c29-475e-437b-b7ff-3eee872e1a42'] || {}).enabled) {
let tab_title = ''; let tab_title = '';
__electronApi.setWindowTitle = (title) => { __electronApi.setWindowTitle = (title) => {
if (tab_title !== title) { if (tab_title !== title) {

View File

@ -426,11 +426,13 @@ window['__start'] = async () => {
}; };
mod.elem = helpers.createElement(` mod.elem = helpers.createElement(`
<section class="${ <section class="${
mod.tags.includes('core') || enabled ? 'enabled' : 'disabled' mod.id === '0f0bf8b6-eae6-4273-b307-8fc43f2ee082' || enabled
? 'enabled'
: 'disabled'
}" id="${mod.id}"> }" id="${mod.id}">
<div class="meta"> <div class="meta">
<h3 ${ <h3 ${
mod.tags.includes('core') mod.id === '0f0bf8b6-eae6-4273-b307-8fc43f2ee082'
? `>${mod.name}` ? `>${mod.name}`
: `class="toggle"> : `class="toggle">
<input type="checkbox" id="enable_${mod.id}" <input type="checkbox" id="enable_${mod.id}"

View File

@ -14,12 +14,6 @@ module.exports = {
version: require('../../package.json').version, version: require('../../package.json').version,
author: 'dragonwocky', author: 'dragonwocky',
options: [ options: [
{
key: 'tabs',
label: 'tabbable windows',
type: 'toggle',
value: false,
},
{ {
key: 'openhidden', key: 'openhidden',
label: 'hide app on open', label: 'hide app on open',
@ -80,6 +74,12 @@ module.exports = {
type: 'input', type: 'input',
value: 'Alt+E', value: 'Alt+E',
}, },
{
key: 'default_page',
label: 'open to default page id:',
type: 'input',
value: '',
},
], ],
hacks: { hacks: {
'main/main.js': require('./tray.js'), 'main/main.js': require('./tray.js'),

View File

@ -18,7 +18,8 @@ const url = require('url'),
koMessages = require(`${__notion}/app/i18n/ko_KR/messages.json`), koMessages = require(`${__notion}/app/i18n/ko_KR/messages.json`),
schemeHelpers = require(`${__notion}/app/shared/schemeHelpers.js`), schemeHelpers = require(`${__notion}/app/shared/schemeHelpers.js`),
React = require(`${__notion}/app/node_modules/react/index.js`), React = require(`${__notion}/app/node_modules/react/index.js`),
ReactDOM = require(`${__notion}/app/node_modules/react-dom/index.js`); ReactDOM = require(`${__notion}/app/node_modules/react-dom/index.js`),
{ toKeyEvent } = require('keyboardevent-from-electron-accelerator');
const insertCSP = ` const insertCSP = `
const csp = document.createElement('meta'); const csp = document.createElement('meta');
@ -28,7 +29,7 @@ const insertCSP = `
`; `;
module.exports = (store, __exports) => { module.exports = (store, __exports) => {
if (store().tabs) { if ((store('mods')['e1692c29-475e-437b-b7ff-3eee872e1a42'] || {}).enabled) {
class Index extends React.PureComponent { class Index extends React.PureComponent {
constructor() { constructor() {
super(...arguments); super(...arguments);
@ -156,22 +157,44 @@ module.exports = (store, __exports) => {
const list = new Map(this.state.tabs); const list = new Map(this.state.tabs);
while (this.state.tabs.get(id)) id++; while (this.state.tabs.get(id)) id++;
list.delete(id); list.delete(id);
if (this.views.html[id]) { console.log(
this.views.html[id].style.opacity = '0'; store().default_page
let unhide; ? `notion://www.notion.so/${store().default_page}`
unhide = () => { : this.views.current.$el().src
this.views.html[id].style.opacity = ''; );
this.views.html[id].removeEventListener('did-stop-loading', unhide); this.openTab(id, list, true);
};
this.views.html[id].addEventListener('did-stop-loading', unhide);
this.views.html[id].loadURL(this.views.current.$el().src);
}
this.openTab(id, list);
} }
openTab(id, state = new Map(this.state.tabs)) { openTab(id, state = new Map(this.state.tabs), load) {
if (!id && id !== 0) return; if (!id && id !== 0) return;
this.views.current.id = id; this.views.current.id = id;
this.setState({ tabs: state.set(id, true) }, this.focusTab.bind(this)); this.setState({ tabs: state.set(id, true) }, async () => {
this.focusTab();
if (load) {
await new Promise((res, rej) => {
let attempt;
attempt = setInterval(() => {
if (!document.body.contains(this.views.html[id])) return;
clearInterval(attempt);
res();
}, 50);
});
this.views.html[id].style.opacity = '0';
let unhide;
unhide = () => {
this.views.html[id].style.opacity = '';
this.views.html[id].removeEventListener(
'did-stop-loading',
unhide
);
};
this.views.html[id].addEventListener('did-stop-loading', unhide);
this.views.html[id].loadURL(
store().default_page
? `notion://www.notion.so/${store().default_page}`
: this.views.current.$el().src
);
}
});
} }
closeTab(id) { closeTab(id) {
if ((!id && id !== 0) || !this.state.tabs.get(id)) return; if ((!id && id !== 0) || !this.state.tabs.get(id)) return;
@ -733,16 +756,28 @@ module.exports = (store, __exports) => {
window['__start'] = () => { window['__start'] = () => {
document.head.innerHTML += `<link rel="stylesheet" href="${__dirname}/css/tabs.css" />`; document.head.innerHTML += `<link rel="stylesheet" href="${__dirname}/css/tabs.css" />`;
// open menu on hotkey toggle
document.addEventListener('keyup', (event) => {
const hotkey = toKeyEvent(store().menu_toggle);
let triggered = true;
for (let prop in hotkey)
if (hotkey[prop] !== event[prop]) triggered = false;
if (triggered) electron.ipcRenderer.send('enhancer:open-menu');
});
const parsed = url.parse(window.location.href, true), const parsed = url.parse(window.location.href, true),
notionUrl = notionUrl = store().default_page
parsed.query.path || ? `notion://www.notion.so/${store().default_page}`
schemeHelpers.getSchemeUrl({ : parsed.query.path ||
httpUrl: config.default.baseURL, schemeHelpers.getSchemeUrl({
protocol: config.default.protocol, httpUrl: config.default.baseURL,
}); protocol: config.default.protocol,
});
delete parsed.search; delete parsed.search;
delete parsed.query; delete parsed.query;
const plainUrl = url.format(parsed); const plainUrl = store().default_page
? `notion://www.notion.so/${store().default_page}`
: url.format(parsed);
window.history.replaceState(undefined, undefined, plainUrl); window.history.replaceState(undefined, undefined, plainUrl);
document.title = localizationHelper document.title = localizationHelper
@ -769,6 +804,26 @@ module.exports = (store, __exports) => {
const __start = window['__start']; const __start = window['__start'];
window['__start'] = () => { window['__start'] = () => {
__start(); __start();
if (store().default_page) {
new Promise((res, rej) => {
let attempt;
attempt = setInterval(() => {
if (
!document.getElementById('notion') ||
!document.getElementById('notion').loadURL
)
return;
clearInterval(attempt);
res();
}, 50);
}).then(() => {
document
.getElementById('notion')
.loadURL(`notion://www.notion.so/${store().default_page}`);
});
}
const dragarea = document.querySelector( const dragarea = document.querySelector(
'#root [style*="-webkit-app-region: drag"]' '#root [style*="-webkit-app-region: drag"]'
), ),

19
repo/tabs/mod.js Normal file
View File

@ -0,0 +1,19 @@
/*
* tabs
* (c) 2020 dragonwocky <thedragonring.bod@gmail.com> (https://dragonwocky.me/)
* under the MIT license
*/
'use strict';
// this is just a pseudo mod to "separate" the options
// from the core module - the core still handles actually
// making it work.
module.exports = {
id: 'e1692c29-475e-437b-b7ff-3eee872e1a42',
tags: ['core', 'extension'],
name: 'tabs',
desc: 'have multiple notion pages open in a single window.',
version: '0.1.0',
author: 'dragonwocky',
};