1
0
mirror of https://github.com/BoostIo/Boostnote synced 2025-12-14 10:16:26 +00:00

Compare commits

...

11 Commits

Author SHA1 Message Date
dependabot[bot]
1bd0c451a4 Bump path-parse from 1.0.5 to 1.0.7
Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.5 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-10 23:17:04 +00:00
Baptiste Augrain
58c4a78be1 avoids conflicting styles between inline codes and code blocks 2020-12-27 11:16:55 +09:00
Gonçalo Santos
2603dfc1ed Fix Analytics save bug 2020-12-12 00:15:37 +09:00
Gonçalo Santos
2df590600b AutoUpdate is auto saved 2020-12-12 00:15:37 +09:00
Gonçalo Santos
ef20a8f3e5 Remove debug statements 2020-12-12 00:15:37 +09:00
Gonçalo Santos
3e405e1abf Fix Cancel update 2020-12-12 00:15:37 +09:00
Gonçalo Santos
553832bdfa Create confirm download dialog 2020-12-12 00:15:37 +09:00
Gonçalo Santos
18d65d999a Menu item calls update-check 2020-12-12 00:15:37 +09:00
Gonçalo Santos
3b5eff582a Update not found message 2020-12-12 00:15:37 +09:00
Gonçalo Santos
85d09b3b3d Add update menu item 2020-12-12 00:15:37 +09:00
Baptiste Augrain
8958e67fcf fix unwanted deletion of attachments 2020-09-15 12:33:12 +09:00
10 changed files with 128 additions and 56 deletions

View File

@@ -63,7 +63,7 @@ export default class CodeEditor extends React.Component {
this.focusHandler = () => { this.focusHandler = () => {
ipcRenderer.send('editor:focused', true) ipcRenderer.send('editor:focused', true)
} }
const debouncedDeletionOfAttachments = _.debounce( this.debouncedDeletionOfAttachments = _.debounce(
attachmentManagement.deleteAttachmentsNotPresentInNote, attachmentManagement.deleteAttachmentsNotPresentInNote,
30000 30000
) )
@@ -80,7 +80,7 @@ export default class CodeEditor extends React.Component {
this.props.onBlur != null && this.props.onBlur(e) this.props.onBlur != null && this.props.onBlur(e)
const { storageKey, noteKey } = this.props const { storageKey, noteKey } = this.props
if (this.props.deleteUnusedAttachments === true) { if (this.props.deleteUnusedAttachments === true) {
debouncedDeletionOfAttachments( this.debouncedDeletionOfAttachments(
this.editor.getValue(), this.editor.getValue(),
storageKey, storageKey,
noteKey noteKey
@@ -810,6 +810,8 @@ export default class CodeEditor extends React.Component {
} }
handleChange(editor, changeObject) { handleChange(editor, changeObject) {
this.debouncedDeletionOfAttachments.cancel()
spellcheck.handleChange(editor, changeObject) spellcheck.handleChange(editor, changeObject)
// The current note contains an toc. We'll check for changes on headlines. // The current note contains an toc. We'll check for changes on headlines.

View File

@@ -8,7 +8,7 @@ import markdownItTocAndAnchor from '@hikerpig/markdown-it-toc-and-anchor'
import _ from 'lodash' import _ from 'lodash'
import ConfigManager from 'browser/main/lib/ConfigManager' import ConfigManager from 'browser/main/lib/ConfigManager'
import katex from 'katex' import katex from 'katex'
import { lastFindInArray } from './utils' import { escapeHtmlCharacters, lastFindInArray } from './utils'
function createGutter(str, firstLineNumber) { function createGutter(str, firstLineNumber) {
if (Number.isNaN(firstLineNumber)) firstLineNumber = 1 if (Number.isNaN(firstLineNumber)) firstLineNumber = 1
@@ -479,6 +479,16 @@ class Markdown {
return true return true
}) })
this.md.renderer.rules.code_inline = function(tokens, idx) {
const token = tokens[idx]
return (
'<code class="inline">' +
escapeHtmlCharacters(token.content) +
'</code>'
)
}
if (config.preview.smartArrows) { if (config.preview.smartArrows) {
this.md.use(smartArrows) this.md.use(smartArrows)
} }

View File

@@ -18,6 +18,7 @@ import { getLocales } from 'browser/lib/Languages'
import applyShortcuts from 'browser/main/lib/shortcutManager' import applyShortcuts from 'browser/main/lib/shortcutManager'
import { chooseTheme, applyTheme } from 'browser/main/lib/ThemeManager' import { chooseTheme, applyTheme } from 'browser/main/lib/ThemeManager'
import { push } from 'connected-react-router' import { push } from 'connected-react-router'
import { ipcRenderer } from 'electron'
const path = require('path') const path = require('path')
const electron = require('electron') const electron = require('electron')
@@ -184,6 +185,7 @@ class Main extends React.Component {
this.toggleMenuBarVisible.bind(this) this.toggleMenuBarVisible.bind(this)
) )
eventEmitter.on('dispatch:push', this.changeRoutePush.bind(this)) eventEmitter.on('dispatch:push', this.changeRoutePush.bind(this))
eventEmitter.on('update', () => ipcRenderer.send('update-check', 'manual'))
} }
componentWillUnmount() { componentWillUnmount() {

View File

@@ -12,6 +12,7 @@ import DevTools from './DevTools'
require('./lib/ipcClient') require('./lib/ipcClient')
require('../lib/customMeta') require('../lib/customMeta')
import i18n from 'browser/lib/i18n' import i18n from 'browser/lib/i18n'
import ConfigManager from './lib/ConfigManager'
const electron = require('electron') const electron = require('electron')
@@ -107,6 +108,22 @@ function updateApp() {
} }
} }
function downloadUpdate() {
const index = dialog.showMessageBox(remote.getCurrentWindow(), {
type: 'warning',
message: i18n.__('Update Boostnote'),
detail: i18n.__('New Boostnote is ready to be downloaded.'),
buttons: [i18n.__('Download now'), i18n.__('Ignore updates')]
})
if (index === 0) {
ipcRenderer.send('update-download-confirm')
} else if (index === 1) {
ipcRenderer.send('update-cancel')
ConfigManager.set({ autoUpdateEnabled: false })
}
}
ReactDOM.render( ReactDOM.render(
<Provider store={store}> <Provider store={store}>
<ConnectedRouter history={history}> <ConnectedRouter history={history}>
@@ -147,8 +164,12 @@ ReactDOM.render(
}) })
ipcRenderer.on('update-found', function() { ipcRenderer.on('update-found', function() {
notify('Update found!', { downloadUpdate()
body: 'Preparing to update...' })
ipcRenderer.on('update-not-found', function(_, msg) {
notify('Update not found!', {
body: msg
}) })
}) })

View File

@@ -18,9 +18,9 @@ const DEFAULT_MARKDOWN_LINT_CONFIG = `{
const DEFAULT_CSS_CONFIG = ` const DEFAULT_CSS_CONFIG = `
/* Drop Your Custom CSS Code Here */ /* Drop Your Custom CSS Code Here */
[data-theme="default"] p code, [data-theme="default"] p code.inline,
[data-theme="default"] li code, [data-theme="default"] li code.inline,
[data-theme="default"] td code [data-theme="default"] td code.inline
{ {
padding: 2px; padding: 2px;
border-width: 1px; border-width: 1px;

View File

@@ -638,74 +638,74 @@ code {
direction: ltr; direction: ltr;
} }
p code, p code.inline,
li code, li code.inline,
td code td code.inline
{ {
padding: 2px; padding: 2px;
border-width: 1px; border-width: 1px;
border-style: solid; border-style: solid;
border-radius: 5px; border-radius: 5px;
} }
[data-theme="default"] p code, [data-theme="default"] p code.inline,
[data-theme="default"] li code, [data-theme="default"] li code.inline,
[data-theme="default"] td code [data-theme="default"] td code.inline
{ {
background-color: #F4F4F4; background-color: #F4F4F4;
border-color: #d9d9d9; border-color: #d9d9d9;
color: inherit; color: inherit;
} }
[data-theme="white"] p code, [data-theme="white"] p code.inline,
[data-theme="white"] li code, [data-theme="white"] li code.inline,
[data-theme="white"] td code [data-theme="white"] td code.inline
{ {
background-color: #F4F4F4; background-color: #F4F4F4;
border-color: #d9d9d9; border-color: #d9d9d9;
color: inherit; color: inherit;
} }
[data-theme="dark"] p code, [data-theme="dark"] p code.inline,
[data-theme="dark"] li code, [data-theme="dark"] li code.inline,
[data-theme="dark"] td code [data-theme="dark"] td code.inline
{ {
background-color: #444444; background-color: #444444;
border-color: #555; border-color: #555;
color: #FFFFFF; color: #FFFFFF;
} }
[data-theme="dracula"] p code, [data-theme="dracula"] p code.inline,
[data-theme="dracula"] li code, [data-theme="dracula"] li code.inline,
[data-theme="dracula"] td code [data-theme="dracula"] td code.inline
{ {
background-color: #444444; background-color: #444444;
border-color: #555; border-color: #555;
color: #FFFFFF; color: #FFFFFF;
} }
[data-theme="monokai"] p code, [data-theme="monokai"] p code.inline,
[data-theme="monokai"] li code, [data-theme="monokai"] li code.inline,
[data-theme="monokai"] td code [data-theme="monokai"] td code.inline
{ {
background-color: #444444; background-color: #444444;
border-color: #555; border-color: #555;
color: #FFFFFF; color: #FFFFFF;
} }
[data-theme="nord"] p code, [data-theme="nord"] p code.inline,
[data-theme="nord"] li code, [data-theme="nord"] li code.inline,
[data-theme="nord"] td code [data-theme="nord"] td code.inline
{ {
background-color: #444444; background-color: #444444;
border-color: #555; border-color: #555;
color: #FFFFFF; color: #FFFFFF;
} }
[data-theme="solarized-dark"] p code, [data-theme="solarized-dark"] p code.inline,
[data-theme="solarized-dark"] li code, [data-theme="solarized-dark"] li code.inline,
[data-theme="solarized-dark"] td code [data-theme="solarized-dark"] td code.inline
{ {
background-color: #444444; background-color: #444444;
border-color: #555; border-color: #555;
color: #FFFFFF; color: #FFFFFF;
} }
[data-theme="vulcan"] p code, [data-theme="vulcan"] p code.inline,
[data-theme="vulcan"] li code, [data-theme="vulcan"] li code.inline,
[data-theme="vulcan"] td code [data-theme="vulcan"] td code.inline
{ {
background-color: #444444; background-color: #444444;
border-color: #555; border-color: #555;

View File

@@ -23,15 +23,25 @@ class InfoTab extends React.Component {
} }
} }
componentDidMount() {
const { autoUpdateEnabled, amaEnabled } = ConfigManager.get()
this.setState({ config: { autoUpdateEnabled, amaEnabled } })
}
handleLinkClick(e) { handleLinkClick(e) {
shell.openExternal(e.currentTarget.href) shell.openExternal(e.currentTarget.href)
e.preventDefault() e.preventDefault()
} }
handleConfigChange(e) { handleConfigChange(e) {
const newConfig = { amaEnabled: this.refs.amaEnabled.checked } const newConfig = {
amaEnabled: this.refs.amaEnabled.checked,
autoUpdateEnabled: this.refs.autoUpdateEnabled.checked
}
this.setState({ config: newConfig }) this.setState({ config: newConfig })
return newConfig
} }
handleSubscriptionFormSubmit(e) { handleSubscriptionFormSubmit(e) {
@@ -77,9 +87,7 @@ class InfoTab extends React.Component {
} }
handleSaveButtonClick(e) { handleSaveButtonClick(e) {
const newConfig = { const newConfig = this.state.config
amaEnabled: this.state.config.amaEnabled
}
if (!newConfig.amaEnabled) { if (!newConfig.amaEnabled) {
AwsMobileAnalyticsConfig.recordDynamicCustomEvent('DISABLE_AMA') AwsMobileAnalyticsConfig.recordDynamicCustomEvent('DISABLE_AMA')
@@ -106,20 +114,17 @@ class InfoTab extends React.Component {
}) })
} }
toggleAutoUpdate() {
const newConfig = {
autoUpdateEnabled: !this.state.config.autoUpdateEnabled
}
this.setState({ config: newConfig })
ConfigManager.set(newConfig)
}
infoMessage() { infoMessage() {
const { amaMessage } = this.state const { amaMessage } = this.state
return amaMessage ? <p styleName='policy-confirm'>{amaMessage}</p> : null return amaMessage ? <p styleName='policy-confirm'>{amaMessage}</p> : null
} }
handleAutoUpdateChange() {
const { autoUpdateEnabled } = this.handleConfigChange()
ConfigManager.set({ autoUpdateEnabled })
}
render() { render() {
return ( return (
<div styleName='root'> <div styleName='root'>
@@ -260,7 +265,8 @@ class InfoTab extends React.Component {
<label> <label>
<input <input
type='checkbox' type='checkbox'
onChange={this.toggleAutoUpdate.bind(this)} ref='autoUpdateEnabled'
onChange={() => this.handleAutoUpdateChange()}
checked={this.state.config.autoUpdateEnabled} checked={this.state.config.autoUpdateEnabled}
/> />
{i18n.__('Enable Auto Update')} {i18n.__('Enable Auto Update')}

View File

@@ -26,6 +26,7 @@ if (!singleInstance) {
} }
var isUpdateReady = false var isUpdateReady = false
let updateFound = false
var ghReleasesOpts = { var ghReleasesOpts = {
repo: 'BoostIO/boost-releases', repo: 'BoostIO/boost-releases',
@@ -36,25 +37,33 @@ const updater = new GhReleases(ghReleasesOpts)
// Check for updates // Check for updates
// `status` returns true if there is a new update available // `status` returns true if there is a new update available
function checkUpdate() { function checkUpdate(manualTriggered = false) {
if (!isPackaged) { if (!isPackaged) {
// Prevents app from attempting to update when in dev mode. // Prevents app from attempting to update when in dev mode.
console.log('Updates are disabled in Development mode, see main-app.js') console.log('Updates are disabled in Development mode, see main-app.js')
return true return true
} }
if (!electronConfig.get('autoUpdateEnabled', true)) return
if (process.platform === 'linux' || isUpdateReady) { // End if auto updates disabled and it is an automatic check
if (!electronConfig.get('autoUpdateEnabled', true) && !manualTriggered) return
if (process.platform === 'linux' || isUpdateReady || updateFound) {
return true return true
} }
updater.check((err, status) => { updater.check((err, status) => {
if (err) { if (err) {
var isLatest = err.message === 'There is no newer version.' var isLatest = err.message === 'There is no newer version.'
if (!isLatest) console.error('Updater error! %s', err.message) if (!isLatest) console.error('Updater error! %s', err.message)
mainWindow.webContents.send(
'update-not-found',
isLatest ? 'There is no newer version.' : 'Updater error'
)
return return
} }
if (status) { if (status) {
mainWindow.webContents.send('update-found', 'Update available!') mainWindow.webContents.send('update-found', 'Update available!')
updater.download() updateFound = true
} }
}) })
} }
@@ -63,6 +72,7 @@ updater.on('update-downloaded', info => {
if (mainWindow != null) { if (mainWindow != null) {
mainWindow.webContents.send('update-ready', 'Update available!') mainWindow.webContents.send('update-ready', 'Update available!')
isUpdateReady = true isUpdateReady = true
updateFound = false
} }
}) })
@@ -77,6 +87,14 @@ ipc.on('update-app-confirm', function(event, msg) {
} }
}) })
ipc.on('update-cancel', () => {
updateFound = false
})
ipc.on('update-download-confirm', () => {
updater.download()
})
app.on('window-all-closed', function() { app.on('window-all-closed', function() {
app.quit() app.quit()
}) })
@@ -113,7 +131,7 @@ app.on('ready', function() {
if (isUpdateReady) { if (isUpdateReady) {
mainWindow.webContents.send('update-ready', 'Update available!') mainWindow.webContents.send('update-ready', 'Update available!')
} else { } else {
checkUpdate() checkUpdate(msg === 'manual')
} }
}) })
}, 10 * 1000) }, 10 * 1000)

View File

@@ -178,6 +178,18 @@ const file = {
mainWindow.webContents.send('list:isMarkdownNote', 'print') mainWindow.webContents.send('list:isMarkdownNote', 'print')
mainWindow.webContents.send('print') mainWindow.webContents.send('print')
} }
},
{
type: 'separator'
},
{
label: 'Update',
click() {
mainWindow.webContents.send('update')
}
},
{
type: 'separator'
} }
] ]
} }

View File

@@ -7269,8 +7269,9 @@ path-key@^2.0.0, path-key@^2.0.1:
resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
path-parse@^1.0.5: path-parse@^1.0.5:
version "1.0.5" version "1.0.7"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
path-to-regexp@0.1.7: path-to-regexp@0.1.7:
version "0.1.7" version "0.1.7"