From b6212f4bfeb5ba65e882c3cf91291a550eb60bd5 Mon Sep 17 00:00:00 2001 From: AWolf81 Date: Fri, 3 May 2019 23:53:00 +0200 Subject: [PATCH 1/9] Update dependencies & change to React-router v5 --- .babelrc | 2 +- browser/lib/CSSModules.js | 2 +- browser/lib/newNote.js | 12 +- browser/main/Detail/MarkdownNoteDetail.js | 12 +- browser/main/Detail/SnippetNoteDetail.js | 13 +- browser/main/Detail/index.js | 7 +- browser/main/Main.js | 14 +- browser/main/NewNoteButton/index.js | 11 +- browser/main/NoteList/index.js | 112 ++-- browser/main/SideNav/StorageItem.js | 7 +- browser/main/SideNav/index.js | 34 +- browser/main/TopBar/index.js | 19 +- browser/main/index.js | 52 +- browser/main/lib/modal.js | 2 +- browser/main/modals/CreateFolderModal.js | 2 +- browser/main/modals/NewNoteModal.js | 7 +- browser/main/modals/PreferencesModal/Blog.js | 2 +- .../modals/PreferencesModal/FolderItem.js | 2 +- .../modals/PreferencesModal/FolderList.js | 2 +- .../main/modals/PreferencesModal/HotkeyTab.js | 2 +- .../main/modals/PreferencesModal/InfoTab.js | 2 +- .../modals/PreferencesModal/StorageItem.js | 2 +- browser/main/modals/PreferencesModal/UiTab.js | 2 +- browser/main/modals/RenameFolderModal.js | 2 +- browser/main/store.js | 20 +- lib/main-window.js | 27 + lib/main.html | 4 +- package.json | 30 +- yarn.lock | 534 ++++++++++++++---- 29 files changed, 668 insertions(+), 271 deletions(-) diff --git a/.babelrc b/.babelrc index 270349d2..3a366286 100644 --- a/.babelrc +++ b/.babelrc @@ -7,7 +7,7 @@ "test": { "presets": ["env" ,"react", "es2015"], "plugins": [ - [ "babel-plugin-webpack-alias", { "config": "${PWD}/webpack.config.js" } ] + [ "babel-plugin-webpack-alias", { "config": "/webpack.config.js" } ] ] } } diff --git a/browser/lib/CSSModules.js b/browser/lib/CSSModules.js index 181274f4..691b44d2 100644 --- a/browser/lib/CSSModules.js +++ b/browser/lib/CSSModules.js @@ -1,5 +1,5 @@ import CSSModules from 'react-css-modules' export default function (component, styles) { - return CSSModules(component, styles, {errorWhenNotFound: false}) + return CSSModules(component, styles, {handleNotFoundStyleName: 'log'}) } diff --git a/browser/lib/newNote.js b/browser/lib/newNote.js index d8ef196f..149961d2 100644 --- a/browser/lib/newNote.js +++ b/browser/lib/newNote.js @@ -1,7 +1,9 @@ -import { hashHistory } from 'react-router' +// import { hashHistory } from 'react-router' +import { history } from 'browser/main/store' import dataApi from 'browser/main/lib/dataApi' import ee from 'browser/main/lib/eventEmitter' import AwsMobileAnalyticsConfig from 'browser/main/lib/AwsMobileAnalyticsConfig' +import queryString from 'query-string' export function createMarkdownNote (storage, folder, dispatch, location, params, config) { AwsMobileAnalyticsConfig.recordDynamicCustomEvent('ADD_MARKDOWN') @@ -28,9 +30,9 @@ export function createMarkdownNote (storage, folder, dispatch, location, params, note: note }) - hashHistory.push({ + history.push({ pathname: location.pathname, - query: { key: noteHash } + search: queryString.stringify({ key: noteHash }) }) ee.emit('list:jump', noteHash) ee.emit('detail:focus') @@ -70,9 +72,9 @@ export function createSnippetNote (storage, folder, dispatch, location, params, type: 'UPDATE_NOTE', note: note }) - hashHistory.push({ + history.push({ pathname: location.pathname, - query: { key: noteHash } + search: queryString.stringify({ key: noteHash }) }) ee.emit('list:jump', noteHash) ee.emit('detail:focus') diff --git a/browser/main/Detail/MarkdownNoteDetail.js b/browser/main/Detail/MarkdownNoteDetail.js index cf3be072..5bd67d72 100755 --- a/browser/main/Detail/MarkdownNoteDetail.js +++ b/browser/main/Detail/MarkdownNoteDetail.js @@ -9,7 +9,8 @@ import StarButton from './StarButton' import TagSelect from './TagSelect' import FolderSelect from './FolderSelect' import dataApi from 'browser/main/lib/dataApi' -import { hashHistory } from 'react-router' +// import { hashHistory } from 'react-router' +import { history } from 'browser/main/store' import ee from 'browser/main/lib/eventEmitter' import markdown from 'browser/lib/markdownTextHelper' import StatusBar from '../StatusBar' @@ -30,6 +31,7 @@ import { getTodoPercentageOfCompleted } from 'browser/lib/getTodoStatus' import striptags from 'striptags' import { confirmDeleteNote } from 'browser/lib/confirmDeleteNote' import markdownToc from 'browser/lib/markdown-toc-generator' +import queryString from 'query-string' class MarkdownNoteDetail extends React.Component { constructor (props) { @@ -159,11 +161,11 @@ class MarkdownNoteDetail extends React.Component { originNote: note, note: newNote }) - hashHistory.replace({ + history.replace({ pathname: location.pathname, - query: { + search: queryString.stringify({ key: newNote.key - } + }) }) this.setState({ isMovingNote: false @@ -491,7 +493,7 @@ class MarkdownNoteDetail extends React.Component { note) const trashedNotes = data.trashedSet.toJS().map(uniqueKey => data.noteMap.get(uniqueKey)) let displayedNotes = allNotes diff --git a/browser/main/Main.js b/browser/main/Main.js index 26fc8377..0742cd03 100644 --- a/browser/main/Main.js +++ b/browser/main/Main.js @@ -12,8 +12,8 @@ import _ from 'lodash' import ConfigManager from 'browser/main/lib/ConfigManager' import mobileAnalytics from 'browser/main/lib/AwsMobileAnalyticsConfig' import eventEmitter from 'browser/main/lib/eventEmitter' -import { hashHistory } from 'react-router' -import store from 'browser/main/store' +// import { hashHistory } from 'react-router' +import { store, history } from 'browser/main/store' import i18n from 'browser/lib/i18n' import { getLocales } from 'browser/lib/Languages' import applyShortcuts from 'browser/main/lib/shortcutManager' @@ -132,7 +132,7 @@ class Main extends React.Component { .then(() => data.storage) }) .then(storage => { - hashHistory.push('/storages/' + storage.key) + history.push('/storages/' + storage.key) }) .catch(err => { throw err @@ -311,7 +311,7 @@ class Main extends React.Component { onMouseUp={e => this.handleMouseUp(e)} > {!config.isSideNavFolded && @@ -341,7 +341,7 @@ class Main extends React.Component { 'dispatch', 'config', 'data', - 'params', + 'match', 'location' ])} /> @@ -351,7 +351,7 @@ class Main extends React.Component { 'dispatch', 'data', 'config', - 'params', + 'match', 'location' ])} /> @@ -373,7 +373,7 @@ class Main extends React.Component { 'dispatch', 'data', 'config', - 'params', + 'match', 'location' ])} ignorePreviewPointerEvents={this.state.isRightSliderFocused} diff --git a/browser/main/NewNoteButton/index.js b/browser/main/NewNoteButton/index.js index c34443be..63dab8d1 100644 --- a/browser/main/NewNoteButton/index.js +++ b/browser/main/NewNoteButton/index.js @@ -21,6 +21,9 @@ class NewNoteButton extends React.Component { this.state = { } + this.handleNewNoteButtonClick = this.handleNewNoteButtonClick.bind(this) + + // why is there a newNoteHandler?! this.newNoteHandler = () => { this.handleNewNoteButtonClick() } @@ -35,9 +38,8 @@ class NewNoteButton extends React.Component { } handleNewNoteButtonClick (e) { - const { location, params, dispatch, config } = this.props + const { location, dispatch, match: { params }, config } = this.props const { storage, folder } = this.resolveTargetFolder() - if (config.ui.defaultNote === 'MARKDOWN_NOTE') { createMarkdownNote(storage.key, folder.key, dispatch, location, params, config) } else if (config.ui.defaultNote === 'SNIPPET_NOTE') { @@ -55,9 +57,8 @@ class NewNoteButton extends React.Component { } resolveTargetFolder () { - const { data, params } = this.props + const { data, match: { params } } = this.props let storage = data.storageMap.get(params.storageKey) - // Find first storage if (storage == null) { for (const kv of data.storageMap) { @@ -93,7 +94,7 @@ class NewNoteButton extends React.Component { >
diff --git a/browser/main/index.js b/browser/main/index.js index 6e8bdcc5..b3a909e5 100644 --- a/browser/main/index.js +++ b/browser/main/index.js @@ -1,11 +1,13 @@ import { Provider } from 'react-redux' import Main from './Main' -import store from './store' -import React from 'react' +import { store, history } from './store' +import React, { Fragment } from 'react' import ReactDOM from 'react-dom' require('!!style!css!stylus?sourceMap!./global.styl') -import { Router, Route, IndexRoute, IndexRedirect, hashHistory } from 'react-router' -import { syncHistoryWithStore } from 'react-router-redux' +import { Route, Switch, Redirect } from 'react-router-dom' +import { ConnectedRouter } from 'connected-react-router' +import DevTools from './DevTools' + require('./lib/ipcClient') require('../lib/customMeta') import i18n from 'browser/lib/i18n' @@ -77,7 +79,6 @@ document.addEventListener('click', function (e) { }) const el = document.getElementById('content') -const history = syncHistoryWithStore(hashHistory, store) function notify (...args) { return new window.Notification(...args) @@ -98,29 +99,24 @@ function updateApp () { ReactDOM.render(( - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + {/* storages */} + + + + + + + ), el, function () { const loadingCover = document.getElementById('loadingCover') diff --git a/browser/main/lib/modal.js b/browser/main/lib/modal.js index 7a7a9c8c..955cb5c8 100644 --- a/browser/main/lib/modal.js +++ b/browser/main/lib/modal.js @@ -1,7 +1,7 @@ import React from 'react' import { Provider } from 'react-redux' import ReactDOM from 'react-dom' -import store from '../store' +import { store } from '../store' class ModalBase extends React.Component { constructor (props) { diff --git a/browser/main/modals/CreateFolderModal.js b/browser/main/modals/CreateFolderModal.js index b061b0f3..b48d6e42 100644 --- a/browser/main/modals/CreateFolderModal.js +++ b/browser/main/modals/CreateFolderModal.js @@ -3,7 +3,7 @@ import React from 'react' import CSSModules from 'browser/lib/CSSModules' import styles from './CreateFolderModal.styl' import dataApi from 'browser/main/lib/dataApi' -import store from 'browser/main/store' +import { store } from 'browser/main/store' import consts from 'browser/lib/consts' import ModalEscButton from 'browser/components/ModalEscButton' import AwsMobileAnalyticsConfig from 'browser/main/lib/AwsMobileAnalyticsConfig' diff --git a/browser/main/modals/NewNoteModal.js b/browser/main/modals/NewNoteModal.js index 41c174cb..a17a36cd 100644 --- a/browser/main/modals/NewNoteModal.js +++ b/browser/main/modals/NewNoteModal.js @@ -4,6 +4,7 @@ import styles from './NewNoteModal.styl' import ModalEscButton from 'browser/components/ModalEscButton' import i18n from 'browser/lib/i18n' import { createMarkdownNote, createSnippetNote } from 'browser/lib/newNote' +import queryString from 'query-string' class NewNoteModal extends React.Component { constructor (props) { @@ -21,7 +22,8 @@ class NewNoteModal extends React.Component { } handleMarkdownNoteButtonClick (e) { - const { storage, folder, dispatch, location, params, config } = this.props + const { storage, folder, dispatch, location, config } = this.props + const params = location.search !== '' && queryString.parse(location.search) if (!this.lock) { this.lock = true createMarkdownNote(storage, folder, dispatch, location, params, config).then(() => { @@ -38,7 +40,8 @@ class NewNoteModal extends React.Component { } handleSnippetNoteButtonClick (e) { - const { storage, folder, dispatch, location, params, config } = this.props + const { storage, folder, dispatch, location, config } = this.props + const params = location.search !== '' && queryString.parse(location.search) if (!this.lock) { this.lock = true createSnippetNote(storage, folder, dispatch, location, params, config).then(() => { diff --git a/browser/main/modals/PreferencesModal/Blog.js b/browser/main/modals/PreferencesModal/Blog.js index 2c93fb29..4d59bea1 100644 --- a/browser/main/modals/PreferencesModal/Blog.js +++ b/browser/main/modals/PreferencesModal/Blog.js @@ -2,7 +2,7 @@ import React from 'react' import CSSModules from 'browser/lib/CSSModules' import styles from './ConfigTab.styl' import ConfigManager from 'browser/main/lib/ConfigManager' -import store from 'browser/main/store' +import { store } from 'browser/main/store' import PropTypes from 'prop-types' import _ from 'lodash' import i18n from 'browser/lib/i18n' diff --git a/browser/main/modals/PreferencesModal/FolderItem.js b/browser/main/modals/PreferencesModal/FolderItem.js index dc9082b9..e6bd1e37 100644 --- a/browser/main/modals/PreferencesModal/FolderItem.js +++ b/browser/main/modals/PreferencesModal/FolderItem.js @@ -4,7 +4,7 @@ import CSSModules from 'browser/lib/CSSModules' import ReactDOM from 'react-dom' import styles from './FolderItem.styl' import dataApi from 'browser/main/lib/dataApi' -import store from 'browser/main/store' +import { store } from 'browser/main/store' import { SketchPicker } from 'react-color' import { SortableElement, SortableHandle } from 'react-sortable-hoc' import i18n from 'browser/lib/i18n' diff --git a/browser/main/modals/PreferencesModal/FolderList.js b/browser/main/modals/PreferencesModal/FolderList.js index e7cc6f94..02f5cee9 100644 --- a/browser/main/modals/PreferencesModal/FolderList.js +++ b/browser/main/modals/PreferencesModal/FolderList.js @@ -3,7 +3,7 @@ import React from 'react' import CSSModules from 'browser/lib/CSSModules' import dataApi from 'browser/main/lib/dataApi' import styles from './FolderList.styl' -import store from 'browser/main/store' +import { store } from 'browser/main/store' import FolderItem from './FolderItem' import { SortableContainer } from 'react-sortable-hoc' import i18n from 'browser/lib/i18n' diff --git a/browser/main/modals/PreferencesModal/HotkeyTab.js b/browser/main/modals/PreferencesModal/HotkeyTab.js index 218a68f6..713f6a65 100644 --- a/browser/main/modals/PreferencesModal/HotkeyTab.js +++ b/browser/main/modals/PreferencesModal/HotkeyTab.js @@ -3,7 +3,7 @@ import React from 'react' import CSSModules from 'browser/lib/CSSModules' import styles from './ConfigTab.styl' import ConfigManager from 'browser/main/lib/ConfigManager' -import store from 'browser/main/store' +import { store } from 'browser/main/store' import _ from 'lodash' import i18n from 'browser/lib/i18n' diff --git a/browser/main/modals/PreferencesModal/InfoTab.js b/browser/main/modals/PreferencesModal/InfoTab.js index 8682f62d..71e99da9 100644 --- a/browser/main/modals/PreferencesModal/InfoTab.js +++ b/browser/main/modals/PreferencesModal/InfoTab.js @@ -2,7 +2,7 @@ import React from 'react' import CSSModules from 'browser/lib/CSSModules' import styles from './InfoTab.styl' import ConfigManager from 'browser/main/lib/ConfigManager' -import store from 'browser/main/store' +import { store } from 'browser/main/store' import AwsMobileAnalyticsConfig from 'browser/main/lib/AwsMobileAnalyticsConfig' import _ from 'lodash' import i18n from 'browser/lib/i18n' diff --git a/browser/main/modals/PreferencesModal/StorageItem.js b/browser/main/modals/PreferencesModal/StorageItem.js index 3a2b075c..9af02962 100644 --- a/browser/main/modals/PreferencesModal/StorageItem.js +++ b/browser/main/modals/PreferencesModal/StorageItem.js @@ -4,7 +4,7 @@ import CSSModules from 'browser/lib/CSSModules' import styles from './StorageItem.styl' import consts from 'browser/lib/consts' import dataApi from 'browser/main/lib/dataApi' -import store from 'browser/main/store' +import { store } from 'browser/main/store' import FolderList from './FolderList' import i18n from 'browser/lib/i18n' diff --git a/browser/main/modals/PreferencesModal/UiTab.js b/browser/main/modals/PreferencesModal/UiTab.js index 5de4b12b..f74dbda5 100644 --- a/browser/main/modals/PreferencesModal/UiTab.js +++ b/browser/main/modals/PreferencesModal/UiTab.js @@ -3,7 +3,7 @@ import React from 'react' import CSSModules from 'browser/lib/CSSModules' import styles from './ConfigTab.styl' import ConfigManager from 'browser/main/lib/ConfigManager' -import store from 'browser/main/store' +import { store } from 'browser/main/store' import consts from 'browser/lib/consts' import ReactCodeMirror from 'react-codemirror' import CodeMirror from 'codemirror' diff --git a/browser/main/modals/RenameFolderModal.js b/browser/main/modals/RenameFolderModal.js index edbcee67..9fdd70c8 100644 --- a/browser/main/modals/RenameFolderModal.js +++ b/browser/main/modals/RenameFolderModal.js @@ -3,7 +3,7 @@ import React from 'react' import CSSModules from 'browser/lib/CSSModules' import styles from './RenameFolderModal.styl' import dataApi from 'browser/main/lib/dataApi' -import store from 'browser/main/store' +import { store } from 'browser/main/store' import ModalEscButton from 'browser/components/ModalEscButton' import i18n from 'browser/lib/i18n' diff --git a/browser/main/store.js b/browser/main/store.js index 5edc115f..91152aff 100644 --- a/browser/main/store.js +++ b/browser/main/store.js @@ -1,8 +1,10 @@ -import { combineReducers, createStore } from 'redux' -import { routerReducer } from 'react-router-redux' +import { combineReducers, createStore, compose, applyMiddleware } from 'redux' +import { connectRouter, routerMiddleware } from 'connected-react-router' +import { createHashHistory as createHistory } from 'history' import ConfigManager from 'browser/main/lib/ConfigManager' import { Map, Set } from 'browser/lib/Mutable' import _ from 'lodash' +import DevTools from './DevTools' function defaultDataMap () { return { @@ -465,13 +467,21 @@ function getOrInitItem (target, key) { return results } +const history = createHistory() + +// Query not available in HashHistory with ReactRouter >= v4 +// Relevant Issue https://github.com/ReactTraining/react-router/issues/4410#issuecomment-293772446 +// --> moved from query to search - so we only need query-string parsing/stringify for noteKey. +// (No need to add query to history with a listener) + const reducer = combineReducers({ data, config, status, - routing: routerReducer + router: connectRouter(history) // I think we could also go with-out connected-router as we're using history with imports directly }) -const store = createStore(reducer) +const store = createStore(reducer, undefined, compose( + applyMiddleware(routerMiddleware(history)), DevTools.instrument())) -export default store +export { store, history } diff --git a/lib/main-window.js b/lib/main-window.js index 418fd442..614127e1 100644 --- a/lib/main-window.js +++ b/lib/main-window.js @@ -6,6 +6,33 @@ const Config = require('electron-config') const config = new Config() const _ = require('lodash') +// set up some chrome extensions +if (process.env.NODE_ENV === 'development') { + const { + default: installExtension, + REACT_DEVELOPER_TOOLS, + REACT_PERF + } = require('electron-devtools-installer') + + require('electron-debug')({ showDevTools: false }) + + const ChromeLens = { + // ID of the extension (https://chrome.google.com/webstore/detail/chromelens/idikgljglpfilbhaboonnpnnincjhjkd) + id: 'idikgljglpfilbhaboonnpnnincjhjkd', + electron: '>=1.2.1' + } + + const extensions = [REACT_DEVELOPER_TOOLS, REACT_PERF, ChromeLens] + + for (const extension of extensions) { + try { + installExtension(extension) + } catch (e) { + console.error(`[ELECTRON] Extension installation failed`, e) + } + } +} + const windowSize = config.get('windowsize') || { x: null, y: null, diff --git a/lib/main.html b/lib/main.html index 0d9feade..38e2cea9 100644 --- a/lib/main.html +++ b/lib/main.html @@ -141,8 +141,8 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 7e8f46c4f318a25b8850d4f02328287401c49837 Mon Sep 17 00:00:00 2001 From: AWolf81 Date: Wed, 8 May 2019 08:53:29 +0200 Subject: [PATCH 5/9] remove commented imports --- browser/lib/newNote.js | 1 - browser/main/Detail/MarkdownNoteDetail.js | 1 - browser/main/SideNav/StorageItem.js | 1 - 3 files changed, 3 deletions(-) diff --git a/browser/lib/newNote.js b/browser/lib/newNote.js index 149961d2..5b5699f5 100644 --- a/browser/lib/newNote.js +++ b/browser/lib/newNote.js @@ -1,4 +1,3 @@ -// import { hashHistory } from 'react-router' import { history } from 'browser/main/store' import dataApi from 'browser/main/lib/dataApi' import ee from 'browser/main/lib/eventEmitter' diff --git a/browser/main/Detail/MarkdownNoteDetail.js b/browser/main/Detail/MarkdownNoteDetail.js index 5bd67d72..dbf51f97 100755 --- a/browser/main/Detail/MarkdownNoteDetail.js +++ b/browser/main/Detail/MarkdownNoteDetail.js @@ -9,7 +9,6 @@ import StarButton from './StarButton' import TagSelect from './TagSelect' import FolderSelect from './FolderSelect' import dataApi from 'browser/main/lib/dataApi' -// import { hashHistory } from 'react-router' import { history } from 'browser/main/store' import ee from 'browser/main/lib/eventEmitter' import markdown from 'browser/lib/markdownTextHelper' diff --git a/browser/main/SideNav/StorageItem.js b/browser/main/SideNav/StorageItem.js index bf04f1cf..8d148cfa 100644 --- a/browser/main/SideNav/StorageItem.js +++ b/browser/main/SideNav/StorageItem.js @@ -2,7 +2,6 @@ import PropTypes from 'prop-types' import React from 'react' import CSSModules from 'browser/lib/CSSModules' import styles from './StorageItem.styl' -// import { hashHistory } from 'react-router' import { history } from 'browser/main/store' import modal from 'browser/main/lib/modal' import CreateFolderModal from 'browser/main/modals/CreateFolderModal' From 3c39dc3cec075a032e3bdd3b813377a32a04ed9d Mon Sep 17 00:00:00 2001 From: AWolf81 Date: Thu, 9 May 2019 07:45:21 +0200 Subject: [PATCH 6/9] change redirecting to connected-react-router --- browser/lib/newNote.js | 10 +++++----- browser/main/Detail/MarkdownNoteDetail.js | 7 ++++--- browser/main/Detail/SnippetNoteDetail.js | 6 +++--- browser/main/Main.js | 5 +++-- browser/main/NoteList/index.js | 11 ++++------- browser/main/SideNav/StorageItem.js | 10 +++++----- 6 files changed, 24 insertions(+), 25 deletions(-) diff --git a/browser/lib/newNote.js b/browser/lib/newNote.js index 5b5699f5..4eec24f1 100644 --- a/browser/lib/newNote.js +++ b/browser/lib/newNote.js @@ -1,8 +1,8 @@ -import { history } from 'browser/main/store' import dataApi from 'browser/main/lib/dataApi' import ee from 'browser/main/lib/eventEmitter' import AwsMobileAnalyticsConfig from 'browser/main/lib/AwsMobileAnalyticsConfig' import queryString from 'query-string' +import { push } from 'connected-react-router' export function createMarkdownNote (storage, folder, dispatch, location, params, config) { AwsMobileAnalyticsConfig.recordDynamicCustomEvent('ADD_MARKDOWN') @@ -29,10 +29,10 @@ export function createMarkdownNote (storage, folder, dispatch, location, params, note: note }) - history.push({ + dispatch(push({ pathname: location.pathname, search: queryString.stringify({ key: noteHash }) - }) + })) ee.emit('list:jump', noteHash) ee.emit('detail:focus') }) @@ -71,10 +71,10 @@ export function createSnippetNote (storage, folder, dispatch, location, params, type: 'UPDATE_NOTE', note: note }) - history.push({ + dispatch(push({ pathname: location.pathname, search: queryString.stringify({ key: noteHash }) - }) + })) ee.emit('list:jump', noteHash) ee.emit('detail:focus') }) diff --git a/browser/main/Detail/MarkdownNoteDetail.js b/browser/main/Detail/MarkdownNoteDetail.js index dbf51f97..06fb91a5 100755 --- a/browser/main/Detail/MarkdownNoteDetail.js +++ b/browser/main/Detail/MarkdownNoteDetail.js @@ -9,7 +9,6 @@ import StarButton from './StarButton' import TagSelect from './TagSelect' import FolderSelect from './FolderSelect' import dataApi from 'browser/main/lib/dataApi' -import { history } from 'browser/main/store' import ee from 'browser/main/lib/eventEmitter' import markdown from 'browser/lib/markdownTextHelper' import StatusBar from '../StatusBar' @@ -31,6 +30,7 @@ import striptags from 'striptags' import { confirmDeleteNote } from 'browser/lib/confirmDeleteNote' import markdownToc from 'browser/lib/markdown-toc-generator' import queryString from 'query-string' +import { replace } from 'connected-react-router' class MarkdownNoteDetail extends React.Component { constructor (props) { @@ -141,6 +141,7 @@ class MarkdownNoteDetail extends React.Component { } handleFolderChange (e) { + const { dispatch } = this.props const { note } = this.state const value = this.refs.folder.value const splitted = value.split('-') @@ -160,12 +161,12 @@ class MarkdownNoteDetail extends React.Component { originNote: note, note: newNote }) - history.replace({ + dispatch(replace({ pathname: location.pathname, search: queryString.stringify({ key: newNote.key }) - }) + })) this.setState({ isMovingNote: false }) diff --git a/browser/main/Detail/SnippetNoteDetail.js b/browser/main/Detail/SnippetNoteDetail.js index 31c6e174..7503addb 100644 --- a/browser/main/Detail/SnippetNoteDetail.js +++ b/browser/main/Detail/SnippetNoteDetail.js @@ -8,7 +8,6 @@ import StarButton from './StarButton' import TagSelect from './TagSelect' import FolderSelect from './FolderSelect' import dataApi from 'browser/main/lib/dataApi' -import { history } from 'browser/main/store' import ee from 'browser/main/lib/eventEmitter' import CodeMirror from 'codemirror' import 'codemirror-mode-elixir' @@ -31,6 +30,7 @@ import i18n from 'browser/lib/i18n' import { confirmDeleteNote } from 'browser/lib/confirmDeleteNote' import markdownToc from 'browser/lib/markdown-toc-generator' import queryString from 'query-string' +import { replace } from 'connected-react-router' const electron = require('electron') const { remote } = electron @@ -166,12 +166,12 @@ class SnippetNoteDetail extends React.Component { originNote: note, note: newNote }) - history.replace({ + dispatch(replace({ pathname: location.pathname, search: queryString.stringify({ key: newNote.key }) - }) + })) this.setState({ isMovingNote: false }) diff --git a/browser/main/Main.js b/browser/main/Main.js index 45e9b795..30bf8e8a 100644 --- a/browser/main/Main.js +++ b/browser/main/Main.js @@ -12,10 +12,11 @@ import _ from 'lodash' import ConfigManager from 'browser/main/lib/ConfigManager' import mobileAnalytics from 'browser/main/lib/AwsMobileAnalyticsConfig' import eventEmitter from 'browser/main/lib/eventEmitter' -import { store, history } from 'browser/main/store' +import { store } from 'browser/main/store' import i18n from 'browser/lib/i18n' import { getLocales } from 'browser/lib/Languages' import applyShortcuts from 'browser/main/lib/shortcutManager' +import { push } from 'connected-react-router' const path = require('path') const electron = require('electron') const { remote } = electron @@ -131,7 +132,7 @@ class Main extends React.Component { .then(() => data.storage) }) .then(storage => { - history.push('/storages/' + storage.key) + store.dispatch(push('/storages/' + storage.key)) }) .catch(err => { throw err diff --git a/browser/main/NoteList/index.js b/browser/main/NoteList/index.js index 16b4ea88..a146cb6c 100644 --- a/browser/main/NoteList/index.js +++ b/browser/main/NoteList/index.js @@ -14,7 +14,6 @@ import NoteItemSimple from 'browser/components/NoteItemSimple' import searchFromNotes from 'browser/lib/search' import fs from 'fs' import path from 'path' -import { history } from 'browser/main/store' import { push, replace } from 'connected-react-router' import copy from 'copy-to-clipboard' import AwsMobileAnalyticsConfig from 'browser/main/lib/AwsMobileAnalyticsConfig' @@ -764,10 +763,10 @@ class NoteList extends React.Component { selectedNoteKeys: [note.key] }) - history.push({ + dispatch(push({ pathname: location.pathname, search: queryString.stringify({key: note.key}) - }) + })) }) } @@ -776,9 +775,7 @@ class NoteList extends React.Component { return copy(noteLink) } - // Navigate seems unused navigate (sender, pathname) { - // const { router } = this.context const { dispatch } = this.props dispatch(push({ pathname, @@ -949,10 +946,10 @@ class NoteList extends React.Component { type: 'UPDATE_NOTE', note: note }) - history.push({ + dispatch(push({ pathname: location.pathname, search: queryString.stringify({key: getNoteKey(note)}) - }) + })) }) }) }) diff --git a/browser/main/SideNav/StorageItem.js b/browser/main/SideNav/StorageItem.js index 8d148cfa..74881b9e 100644 --- a/browser/main/SideNav/StorageItem.js +++ b/browser/main/SideNav/StorageItem.js @@ -2,7 +2,6 @@ import PropTypes from 'prop-types' import React from 'react' import CSSModules from 'browser/lib/CSSModules' import styles from './StorageItem.styl' -import { history } from 'browser/main/store' import modal from 'browser/main/lib/modal' import CreateFolderModal from 'browser/main/modals/CreateFolderModal' import RenameFolderModal from 'browser/main/modals/RenameFolderModal' @@ -12,6 +11,7 @@ import _ from 'lodash' import { SortableElement } from 'react-sortable-hoc' import i18n from 'browser/lib/i18n' import context from 'browser/lib/context' +import { push } from 'connected-react-router' const { remote } = require('electron') const { dialog } = remote @@ -134,14 +134,14 @@ class StorageItem extends React.Component { } handleHeaderInfoClick (e) { - const { storage } = this.props - history.push('/storages/' + storage.key) + const { storage, dispatch } = this.props + dispatch(push('/storages/' + storage.key)) } handleFolderButtonClick (folderKey) { return (e) => { - const { storage } = this.props - history.push('/storages/' + storage.key + '/folders/' + folderKey) + const { storage, dispatch } = this.props + dispatch(push('/storages/' + storage.key + '/folders/' + folderKey)) } } From 1afa02bbb3e7f7639e8d87e28592afe6d5aab99d Mon Sep 17 00:00:00 2001 From: AWolf81 Date: Sat, 11 May 2019 00:17:41 +0200 Subject: [PATCH 7/9] fix local link detection by creating a link tag to parse the input string --- browser/components/MarkdownPreview.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/browser/components/MarkdownPreview.js b/browser/components/MarkdownPreview.js index 4be33c51..bb663c5e 100755 --- a/browser/components/MarkdownPreview.js +++ b/browser/components/MarkdownPreview.js @@ -1015,16 +1015,19 @@ export default class MarkdownPreview extends React.Component { e.preventDefault() e.stopPropagation() - const href = e.target.getAttribute('href') - const linkHash = href.split('/').pop() + const rawHref = e.target.getAttribute('href') + const parser = document.createElement('a') + parser.href = e.target.getAttribute('href') + const { href, hash } = parser + const linkHash = hash === '' ? rawHref : hash // needed because we're having special link formats that are removed by parser e.g. :line:10 - if (!href) return + if (!rawHref) return // not checked href because parser will create file://... string for [empty link]() - const regexNoteInternalLink = process.env.NODE_ENV === 'production' ? /main.production.html#(.+)/ : /main.development.html#(.+)/ + const regexNoteInternalLink = /.*[main.\w]*.html#/ - if (regexNoteInternalLink.test(linkHash)) { - const targetId = mdurl.encode(linkHash.match(regexNoteInternalLink)[1]) - const targetElement = this.refs.root.contentWindow.document.getElementById( + if (regexNoteInternalLink.test(href)) { + const targetId = mdurl.encode(linkHash) + const targetElement = this.refs.root.contentWindow.document.querySelector( targetId ) From 929f475354e54fa2f1c4a252ecd94bd919fe9fbd Mon Sep 17 00:00:00 2001 From: Morten Lautrup <44033709+MortenLautrup@users.noreply.github.com> Date: Tue, 21 May 2019 19:44:06 +0200 Subject: [PATCH 8/9] Make buttons undraggable --- browser/main/Detail/MarkdownNoteDetail.styl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/browser/main/Detail/MarkdownNoteDetail.styl b/browser/main/Detail/MarkdownNoteDetail.styl index cdfeaf3a..f8f5c8a8 100644 --- a/browser/main/Detail/MarkdownNoteDetail.styl +++ b/browser/main/Detail/MarkdownNoteDetail.styl @@ -80,4 +80,8 @@ body[data-theme="monokai"] body[data-theme="dracula"] .root border-left 1px solid $ui-dracula-borderColor - background-color $ui-dracula-noteDetail-backgroundColor \ No newline at end of file + background-color $ui-dracula-noteDetail-backgroundColor + +img, span, div + -webkit-user-drag none + user-select none From 052fb3df5bb16955873f4cabe40a9337cc34caae Mon Sep 17 00:00:00 2001 From: Morten Lautrup <44033709+MortenLautrup@users.noreply.github.com> Date: Fri, 24 May 2019 09:09:42 +0200 Subject: [PATCH 9/9] Specify wich images should not be draggable Make only images and spans inside buttons undraggable --- browser/main/Detail/MarkdownNoteDetail.styl | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/browser/main/Detail/MarkdownNoteDetail.styl b/browser/main/Detail/MarkdownNoteDetail.styl index f8f5c8a8..819bef2e 100644 --- a/browser/main/Detail/MarkdownNoteDetail.styl +++ b/browser/main/Detail/MarkdownNoteDetail.styl @@ -82,6 +82,10 @@ body[data-theme="dracula"] border-left 1px solid $ui-dracula-borderColor background-color $ui-dracula-noteDetail-backgroundColor -img, span, div - -webkit-user-drag none - user-select none +div + > button, div + -webkit-user-drag none + user-select none + > img, span + -webkit-user-drag none + user-select none