diff --git a/src/components/KeyboardContent.js b/src/components/KeyboardContent.js
new file mode 100644
index 00000000..a3b32886
--- /dev/null
+++ b/src/components/KeyboardContent.js
@@ -0,0 +1,47 @@
+// @flow
+// Toggle something after a sequence of keyboard
+
+import { Component } from 'react'
+
+class KeyboardContent extends Component<
+ {
+ sequence: string,
+ children?: *,
+ },
+ { enabled: boolean },
+> {
+ state = {
+ enabled: false,
+ }
+
+ componentDidMount() {
+ window.addEventListener('keypress', this.onKeyPress)
+ }
+
+ componentWillUnmount() {
+ window.removeEventListener('keypress', this.onKeyPress)
+ }
+
+ seqIndex = -1
+ onKeyPress = (e: *) => {
+ const { sequence } = this.props
+ const next = sequence[this.seqIndex + 1]
+ if (next && next === e.key) {
+ this.seqIndex++
+ } else {
+ this.seqIndex = -1
+ }
+ if (this.seqIndex === sequence.length - 1) {
+ this.seqIndex = -1
+ this.setState(({ enabled }) => ({ enabled: !enabled }))
+ }
+ }
+
+ render() {
+ const { children } = this.props
+ const { enabled } = this.state
+ return enabled ? children : null
+ }
+}
+
+export default KeyboardContent
diff --git a/src/components/PerfIndicator.js b/src/components/PerfIndicator.js
new file mode 100644
index 00000000..df04d39b
--- /dev/null
+++ b/src/components/PerfIndicator.js
@@ -0,0 +1,57 @@
+// @flow
+import React, { PureComponent } from 'react'
+import styled from 'styled-components'
+import ping from 'commands/ping'
+
+const Indicator = styled.div`
+ opacity: 0.8;
+ border-radius: 3px;
+ background-color: white;
+ position: fixed;
+ font-size: 10px;
+ padding: 3px 6px;
+ bottom: 0;
+ left: 0;
+ z-index: 999;
+ pointer-events: none;
+`
+
+class PerfIndicator extends PureComponent<{}, { opsPerSecond: number }> {
+ state = {
+ opsPerSecond: 0,
+ }
+ componentDidMount() {
+ let count = 0
+ const loop = () => {
+ ++count
+ if (this.finished) return
+ this.sub = ping.send().subscribe({
+ complete: loop,
+ })
+ }
+ loop()
+ setInterval(() => {
+ this.setState({ opsPerSecond: count })
+ count = 0
+ }, 1000)
+ }
+ componentWillUnmount() {
+ if (this.sub) {
+ this.sub.unsubscribe()
+ this.finished = true
+ }
+ }
+ sub: *
+ interval: *
+ finished = false
+ render() {
+ return (
+
+ {this.state.opsPerSecond}
+ {' ops/s'}
+
+ )
+ }
+}
+
+export default PerfIndicator
diff --git a/src/components/layout/Default.js b/src/components/layout/Default.js
index d12f38bf..e52522b5 100644
--- a/src/components/layout/Default.js
+++ b/src/components/layout/Default.js
@@ -18,6 +18,8 @@ import DashboardPage from 'components/DashboardPage'
import ManagerPage from 'components/ManagerPage'
import ExchangePage from 'components/ExchangePage'
import SettingsPage from 'components/SettingsPage'
+import KeyboardContent from 'components/KeyboardContent'
+import PerfIndicator from 'components/PerfIndicator'
import LibcoreBusyIndicator from 'components/LibcoreBusyIndicator'
import DeviceBusyIndicator from 'components/DeviceBusyIndicator'
import TriggerAppReady from 'components/TriggerAppReady'
@@ -106,6 +108,9 @@ class Default extends Component {
+
+
+
)
diff --git a/src/helpers/db/db-storybook.js b/src/helpers/db/db-storybook.js
new file mode 100644
index 00000000..812aff0c
--- /dev/null
+++ b/src/helpers/db/db-storybook.js
@@ -0,0 +1,13 @@
+// @flow
+
+const noop = () => {}
+
+module.exports = {
+ init: noop,
+ get: noop,
+ set: noop,
+ getIn: noop,
+ setIn: noop,
+ cleanCache: noop,
+ resetAll: noop,
+}
diff --git a/src/helpers/db.js b/src/helpers/db/db.js
similarity index 100%
rename from src/helpers/db.js
rename to src/helpers/db/db.js
diff --git a/src/helpers/db/index.js b/src/helpers/db/index.js
new file mode 100644
index 00000000..f04d4cbe
--- /dev/null
+++ b/src/helpers/db/index.js
@@ -0,0 +1,3 @@
+const db = process.env.STORYBOOK_ENV ? require('./db-storybook') : require('./db')
+
+module.exports = db
diff --git a/src/helpers/resolveLogsDirectory.js b/src/helpers/resolveLogsDirectory.js
index 380fcb8e..3cd1ae0e 100644
--- a/src/helpers/resolveLogsDirectory.js
+++ b/src/helpers/resolveLogsDirectory.js
@@ -15,7 +15,6 @@ export default resolveLogsDirectory
export const RotatingLogFileParameters = {
filename: 'application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
- zippedArchive: true,
maxSize: '20m',
maxFiles: '14d',
}
diff --git a/src/logger/index.js b/src/logger/index.js
new file mode 100644
index 00000000..d3a015ad
--- /dev/null
+++ b/src/logger/index.js
@@ -0,0 +1,3 @@
+const logger = process.env.STORYBOOK_ENV ? require('./logger-storybook') : require('./logger')
+
+module.exports = logger
diff --git a/src/logger/logger-storybook.js b/src/logger/logger-storybook.js
new file mode 100644
index 00000000..1fcc6163
--- /dev/null
+++ b/src/logger/logger-storybook.js
@@ -0,0 +1,23 @@
+const noop = () => {}
+
+module.exports = {
+ setProcessShortName: noop,
+ onCmd: noop,
+ onDB: noop,
+ onReduxAction: noop,
+ onTabKey: noop,
+ websocket: noop,
+ libcore: noop,
+ network: noop,
+ networkSucceed: noop,
+ networkError: noop,
+ networkDown: noop,
+ analyticsStart: noop,
+ analyticsStop: noop,
+ analyticsTrack: noop,
+ analyticsPage: noop,
+ log: noop,
+ warn: noop,
+ error: noop,
+ critical: noop,
+}
diff --git a/src/logger.js b/src/logger/logger.js
similarity index 100%
rename from src/logger.js
rename to src/logger/logger.js