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('
'), 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(`

${mod.name}` : `class="toggle"> { - 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 += ``; + // 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 (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', +};