From ee88c63f382454f3c71358feac5e8ff1b5168193 Mon Sep 17 00:00:00 2001 From: dragonwocky <thedragonring.bod@gmail.com> Date: Mon, 12 Oct 2020 21:44:12 +1100 Subject: [PATCH] split tabs into separate mod, add opt for default page, load default settings when store()-ing another mod id --- repo/core/buttons.js | 2 +- repo/core/client.js | 32 +++++++++----- repo/core/menu.js | 6 ++- repo/core/mod.js | 12 +++--- repo/core/render.js | 99 ++++++++++++++++++++++++++++++++++---------- repo/tabs/mod.js | 19 +++++++++ 6 files changed, 129 insertions(+), 41 deletions(-) create mode 100644 repo/tabs/mod.js diff --git a/repo/core/buttons.js b/repo/core/buttons.js index e50de06..bae94cd 100644 --- a/repo/core/buttons.js +++ b/repo/core/buttons.js @@ -15,7 +15,7 @@ module.exports = (store) => { buttons = { element: helpers.createElement('<div class="window-buttons-area"></div>'), insert: [ - ...((store('mods', {})['72886371-dada-49a7-9afc-9f275ecf29d3'] || {}) + ...((store('mods')['72886371-dada-49a7-9afc-9f275ecf29d3'] || {}) .enabled ? ['alwaysontop'] : []), diff --git a/repo/core/client.js b/repo/core/client.js index 4d683ca..3315093 100644 --- a/repo/core/client.js +++ b/repo/core/client.js @@ -19,12 +19,16 @@ module.exports = (store, __exports) => { // additional hotkeys document.defaultView.addEventListener('keyup', (event) => { if (event.code === 'F5') location.reload(); - // open menu on hotkey toggle - 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'); + if ( + !(store('mods')['e1692c29-475e-437b-b7ff-3eee872e1a42'] || {}).enabled + ) { + // open menu on hotkey toggle + 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 attempt_interval = setInterval(enhance, 500); @@ -43,7 +47,11 @@ module.exports = (store, __exports) => { document.body.classList.add('snappy-transitions'); // 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'); // draggable area document @@ -56,7 +64,9 @@ module.exports = (store, __exports) => { } // window buttons - if (!store().tabs) { + if ( + !(store('mods')['e1692c29-475e-437b-b7ff-3eee872e1a42'] || {}).enabled + ) { const buttons = require('./buttons.js')(store); document .querySelector('.notion-topbar > div[style*="display: flex"]') @@ -153,7 +163,9 @@ module.exports = (store, __exports) => { '--theme--code_inline-background', ].map((rule) => [rule, getStyle(rule)]) ); - if (store().tabs) { + if ( + (store('mods')['e1692c29-475e-437b-b7ff-3eee872e1a42'] || {}).enabled + ) { electron.ipcRenderer.sendToHost( 'enhancer:set-tab-theme', [ @@ -179,7 +191,7 @@ module.exports = (store, __exports) => { ); electron.ipcRenderer.on('enhancer:get-menu-theme', setThemeVars); - if (store().tabs) { + if ((store('mods')['e1692c29-475e-437b-b7ff-3eee872e1a42'] || {}).enabled) { let tab_title = ''; __electronApi.setWindowTitle = (title) => { if (tab_title !== title) { diff --git a/repo/core/menu.js b/repo/core/menu.js index bb5913f..60a0d20 100644 --- a/repo/core/menu.js +++ b/repo/core/menu.js @@ -426,11 +426,13 @@ window['__start'] = async () => { }; mod.elem = helpers.createElement(` <section class="${ - mod.tags.includes('core') || enabled ? 'enabled' : 'disabled' + mod.id === '0f0bf8b6-eae6-4273-b307-8fc43f2ee082' || enabled + ? 'enabled' + : 'disabled' }" id="${mod.id}"> <div class="meta"> <h3 ${ - mod.tags.includes('core') + mod.id === '0f0bf8b6-eae6-4273-b307-8fc43f2ee082' ? `>${mod.name}` : `class="toggle"> <input type="checkbox" id="enable_${mod.id}" diff --git a/repo/core/mod.js b/repo/core/mod.js index 9859812..6311973 100644 --- a/repo/core/mod.js +++ b/repo/core/mod.js @@ -14,12 +14,6 @@ module.exports = { version: require('../../package.json').version, author: 'dragonwocky', options: [ - { - key: 'tabs', - label: 'tabbable windows', - type: 'toggle', - value: false, - }, { key: 'openhidden', label: 'hide app on open', @@ -80,6 +74,12 @@ module.exports = { type: 'input', value: 'Alt+E', }, + { + key: 'default_page', + label: 'open to default page id:', + type: 'input', + value: '', + }, ], hacks: { 'main/main.js': require('./tray.js'), diff --git a/repo/core/render.js b/repo/core/render.js index 32437df..81363be 100644 --- a/repo/core/render.js +++ b/repo/core/render.js @@ -18,7 +18,8 @@ const url = require('url'), koMessages = require(`${__notion}/app/i18n/ko_KR/messages.json`), schemeHelpers = require(`${__notion}/app/shared/schemeHelpers.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 csp = document.createElement('meta'); @@ -28,7 +29,7 @@ const insertCSP = ` `; module.exports = (store, __exports) => { - if (store().tabs) { + if ((store('mods')['e1692c29-475e-437b-b7ff-3eee872e1a42'] || {}).enabled) { class Index extends React.PureComponent { constructor() { super(...arguments); @@ -156,22 +157,44 @@ module.exports = (store, __exports) => { const list = new Map(this.state.tabs); while (this.state.tabs.get(id)) id++; list.delete(id); - if (this.views.html[id]) { - 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(this.views.current.$el().src); - } - this.openTab(id, list); + console.log( + store().default_page + ? `notion://www.notion.so/${store().default_page}` + : this.views.current.$el().src + ); + this.openTab(id, list, true); } - openTab(id, state = new Map(this.state.tabs)) { + openTab(id, state = new Map(this.state.tabs), load) { if (!id && id !== 0) return; 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) { if ((!id && id !== 0) || !this.state.tabs.get(id)) return; @@ -733,16 +756,28 @@ module.exports = (store, __exports) => { window['__start'] = () => { 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), - notionUrl = - parsed.query.path || - schemeHelpers.getSchemeUrl({ - httpUrl: config.default.baseURL, - protocol: config.default.protocol, - }); + notionUrl = store().default_page + ? `notion://www.notion.so/${store().default_page}` + : parsed.query.path || + schemeHelpers.getSchemeUrl({ + httpUrl: config.default.baseURL, + protocol: config.default.protocol, + }); delete parsed.search; 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); document.title = localizationHelper @@ -769,6 +804,26 @@ module.exports = (store, __exports) => { const __start = window['__start']; window['__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( '#root [style*="-webkit-app-region: drag"]' ), diff --git a/repo/tabs/mod.js b/repo/tabs/mod.js new file mode 100644 index 0000000..1585c43 --- /dev/null +++ b/repo/tabs/mod.js @@ -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', +};