You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
3.4 KiB
125 lines
3.4 KiB
// @flow
|
|
|
|
import logger from 'logger'
|
|
import React from 'react'
|
|
import { remote, webFrame } from 'electron'
|
|
import { render } from 'react-dom'
|
|
import { AppContainer } from 'react-hot-loader'
|
|
import createHistory from 'history/createHashHistory'
|
|
import moment from 'moment'
|
|
import { runMigrations } from 'migrations'
|
|
|
|
import createStore from 'renderer/createStore'
|
|
import events from 'renderer/events'
|
|
|
|
import { enableGlobalTab, disableGlobalTab, isGlobalTabEnabled } from 'config/global-tab'
|
|
|
|
import { fetchAccounts } from 'actions/accounts'
|
|
import { fetchSettings } from 'actions/settings'
|
|
import { lock } from 'reducers/application'
|
|
import { languageSelector, sentryLogsSelector } from 'reducers/settings'
|
|
import libcoreGetVersion from 'commands/libcoreGetVersion'
|
|
|
|
import resolveUserDataDirectory from 'helpers/resolveUserDataDirectory'
|
|
import db from 'helpers/db'
|
|
import dbMiddleware from 'middlewares/db'
|
|
import CounterValues from 'helpers/countervalues'
|
|
|
|
import { decodeAccountsModel, encodeAccountsModel } from 'reducers/accounts'
|
|
|
|
import sentry from 'sentry/browser'
|
|
import App from 'components/App'
|
|
import AppError from 'components/AppError'
|
|
|
|
import 'styles/global'
|
|
|
|
const rootNode = document.getElementById('app')
|
|
const userDataDirectory = resolveUserDataDirectory()
|
|
|
|
const TAB_KEY = 9
|
|
|
|
db.init(userDataDirectory)
|
|
|
|
async function init() {
|
|
await runMigrations()
|
|
db.init(userDataDirectory)
|
|
db.registerTransform('app', 'accounts', { get: decodeAccountsModel, set: encodeAccountsModel })
|
|
|
|
const history = createHistory()
|
|
const store = createStore({ history, dbMiddleware })
|
|
|
|
const settings = await db.getKey('app', 'settings')
|
|
store.dispatch(fetchSettings(settings))
|
|
|
|
const countervaluesData = await db.getKey('app', 'countervalues')
|
|
if (countervaluesData) {
|
|
store.dispatch(CounterValues.importAction(countervaluesData))
|
|
}
|
|
|
|
const state = store.getState()
|
|
const language = languageSelector(state)
|
|
moment.locale(language)
|
|
|
|
sentry(() => sentryLogsSelector(store.getState()))
|
|
|
|
// FIXME IMO init() really should only be for window. any other case is a hack!
|
|
const isMainWindow = remote.getCurrentWindow().name === 'MainWindow'
|
|
|
|
const isAccountsDecrypted = await db.hasBeenDecrypted('app', 'accounts')
|
|
if (!isAccountsDecrypted) {
|
|
store.dispatch(lock())
|
|
} else {
|
|
await store.dispatch(fetchAccounts())
|
|
}
|
|
|
|
r(<App store={store} history={history} language={language} />)
|
|
|
|
// Only init events on MainWindow
|
|
if (isMainWindow) {
|
|
webFrame.setVisualZoomLevelLimits(1, 1)
|
|
|
|
events({ store })
|
|
|
|
const libcoreVersion = await libcoreGetVersion.send().toPromise()
|
|
logger.log('libcore', libcoreVersion)
|
|
|
|
window.addEventListener('keydown', (e: SyntheticKeyboardEvent<any>) => {
|
|
if (e.which === TAB_KEY) {
|
|
if (!isGlobalTabEnabled()) enableGlobalTab()
|
|
logger.onTabKey(document.activeElement)
|
|
}
|
|
})
|
|
|
|
window.addEventListener('click', () => {
|
|
if (isGlobalTabEnabled()) disableGlobalTab()
|
|
})
|
|
}
|
|
document.addEventListener(
|
|
'dragover',
|
|
(event: Event) => {
|
|
event.preventDefault()
|
|
return false
|
|
},
|
|
false,
|
|
)
|
|
|
|
document.addEventListener(
|
|
'drop',
|
|
(event: Event) => {
|
|
event.preventDefault()
|
|
return false
|
|
},
|
|
false,
|
|
)
|
|
}
|
|
|
|
function r(Comp) {
|
|
if (rootNode) {
|
|
render(<AppContainer>{Comp}</AppContainer>, rootNode)
|
|
}
|
|
}
|
|
|
|
init().catch(e => {
|
|
logger.critical(e)
|
|
r(<AppError error={e} language="en" />)
|
|
})
|
|
|