Skip to content

Commit f6f575b

Browse files
committed
Add redux persist
1 parent eb387ae commit f6f575b

File tree

8 files changed

+105
-56
lines changed

8 files changed

+105
-56
lines changed

app/App.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
11
import 'babel-polyfill';
2+
3+
import {PersistGate} from 'redux-persist/integration/react';
24
import {Provider} from 'react-redux';
35
import React from 'react';
6+
import {persistStore} from 'redux-persist';
47

58
import Router from './components/Layout/Router';
69
import store from './redux/store';
710

11+
const Loading = () => (
12+
<div>Loading</div>
13+
);
14+
815
const App = () => (
916
<Provider store={store}>
10-
<Router />
17+
<PersistGate loading={<Loading />} persistor={persistStore(store)}>
18+
<Router />
19+
</PersistGate>
1120
</Provider>
1221
);
1322

app/components/Layout/Init.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import Toggle from 'material-ui/Toggle';
1010
import {raiseError} from '../../redux/actions/errorsActions';
1111
import {pickFile} from '../../helpers/fsHelpers';
1212
import Row from '../FlexBox/Row';
13-
import Animated from '../Base/Animated';
1413

1514
class Init extends PureComponent<$InitProps, $InitState> {
1615
state = {
@@ -21,7 +20,7 @@ class Init extends PureComponent<$InitProps, $InitState> {
2120
nameError: '',
2221
};
2322
render = () => (
24-
<Animated jello style={{margin: 12}}>
23+
<div style={{margin: 12}}>
2524
<Row style={{marginBottom: 12}}>
2625
<IconButton>
2726
<NameIcon />
@@ -55,7 +54,7 @@ class Init extends PureComponent<$InitProps, $InitState> {
5554
/>
5655
</div>
5756
</Row>
58-
</Animated>
57+
</div>
5958
);
6059
onChangeBase = event => this.setState({
6160
base: event.target.value,

app/components/Layout/Router.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,11 @@ class Router extends PureComponent<$RouterProps, $RoouterState> {
3737
<MuiThemeProvider>
3838
<div>
3939
<main style={styles.container}>
40-
<div style={merge(styles.wrapper, {width: '500vh'})}>
40+
<div
41+
style={merge(styles.wrapper, {
42+
width: '300vw',
43+
})}
44+
>
4145
<div style={styles.page}>
4246
<AppBar
4347
iconElementLeft={(

app/components/Terminal/Console.js

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import Avatar from 'material-ui/Avatar';
77
import OpenFolderIcon from 'material-ui/svg-icons/file/folder-open';
88
import TermIcon from 'material-ui/svg-icons/action/code';
99
import stripAnsi from 'strip-ansi';
10+
import DoneIcon from 'material-ui/svg-icons/action/done';
11+
import ErrorIcon from 'material-ui/svg-icons/alert/error';
12+
import {green800, redA700, red500} from 'material-ui/styles/colors';
1013

1114
import exec from '../../lib/exec';
1215
import Row from '../FlexBox/Row';
@@ -21,15 +24,22 @@ type $TerminalProps = {
2124
};
2225

2326
type $TerminalState = {
24-
output: string[],
25-
pid: ?number,
27+
code: ?number,
2628
done: boolean,
2729
error: ?Error,
30+
output: string[],
31+
pid: ?number,
2832
};
2933

3034
class Terminal extends PureComponent<$TerminalProps, $TerminalState> {
3135
ps: EventEmitter;
32-
state: $TerminalState = {output: [], pid: null, done: false, error: null};
36+
state: $TerminalState = {
37+
code: null,
38+
done: false,
39+
error: null,
40+
output: [],
41+
pid: null,
42+
};
3343
componentDidMount = () => {
3444
const {command, cwd, inputHandlers = []} = this.props;
3545
this.ps = exec(command, {cwd});
@@ -40,12 +50,16 @@ class Terminal extends PureComponent<$TerminalProps, $TerminalState> {
4050
}
4151
}));
4252
this.ps.on('error', error => this.setState({error}));
43-
this.ps.on('done', () => this.setState({done: true}, () => {
53+
this.ps.on('done', () => this.setState({done: true, code: 0}, () => {
4454
if (typeof this.props.onDone === 'function') {
4555
this.props.onDone();
4656
}
4757
}));
48-
this.ps.on('failed', () => this.setState({done: true, error: new Error('Status closed')}));
58+
this.ps.on('failed', code => this.setState({
59+
done: true,
60+
error: new Error('Status closed'),
61+
code,
62+
}));
4963
};
5064
render = () => (
5165
<Card>
@@ -67,6 +81,25 @@ class Terminal extends PureComponent<$TerminalProps, $TerminalState> {
6781
<Avatar>PID</Avatar>
6882
{this.state.pid}
6983
</Chip>
84+
{typeof this.state.code === 'number' && (
85+
<Chip
86+
backgroundColor={this.state.code === 0 ? green800 : redA700}
87+
>
88+
<Avatar
89+
backgroundColor={this.state.code === 0 ? green800 : redA700}
90+
icon={
91+
this.state.code === 0 ? (
92+
<DoneIcon />
93+
) : (
94+
<ErrorIcon />
95+
)
96+
}
97+
/>
98+
{this.state.code > 0 && (
99+
<span style={{color: 'white'}}>{this.state.code}</span>
100+
)}
101+
</Chip>
102+
)}
70103
<Chip>
71104
<Avatar icon={<OpenFolderIcon />} />
72105
{this.props.cwd}

app/lib/exec.js

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,41 @@ import Emitter from 'events';
33

44
const $spawn = (cmd, options = {}) => {
55
const emitter = new Emitter();
6-
const {cwd = process.cwd()} = options;
76
setTimeout(() => {
87
const [entry, ...bits] = cmd.trim().split(/\s+/);
98
const ps = spawn(entry, bits, options);
9+
let done = false;
1010
emitter.emit('pid', ps.pid);
1111
ps
1212
.on('error', error => emitter.emit('error', error))
13-
.on('exit', status => {
13+
.on('exit', (status) => {
14+
done = true;
1415
if (status === 0) {
1516
emitter.emit('done');
1617
} else {
1718
emitter.emit('failed', status);
1819
}
1920
})
2021
.on('close', (status) => {
21-
emitter.emit('failed', status);
22+
if (!done) {
23+
done = true;
24+
if (status === 0) {
25+
emitter.emit('done');
26+
} else {
27+
emitter.emit('failed', status);
28+
}
29+
}
2230
});
23-
ps.stdout.on('data', data => emitter.emit('data', {std: 'out', buffer: data, message: data.toString()}));
24-
ps.stderr.on('data', data => emitter.emit('data', {std: 'err', buffer: data, message: data.toString()}));
31+
ps.stdout.on('data', data => emitter.emit('data', {
32+
std: 'out',
33+
buffer: data,
34+
message: data.toString(),
35+
}));
36+
ps.stderr.on('data', data => emitter.emit('data', {
37+
std: 'err',
38+
buffer: data,
39+
message: data.toString(),
40+
}));
2541
emitter.on('write', message => ps.stdin.write(message));
2642
emitter.on('kill', () => $spawn(`kill -9 ${ps.pid}`));
2743
});

app/redux/store.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,18 @@ import {
33
combineReducers,
44
createStore,
55
} from 'redux';
6+
import {persistStore, persistReducer} from 'redux-persist';
7+
import storage from 'redux-persist/lib/storage';
8+
69
import * as reducers from './reducers';
710

8-
export default createStore(combineReducers(reducers));
11+
const persistConfig = {
12+
key: 'root',
13+
storage,
14+
};
15+
16+
const persistedReducer = persistReducer(persistConfig, combineReducers(reducers));
17+
18+
// export default createStore(combineReducers(reducers));
19+
20+
export default createStore(persistedReducer);

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@
1313
"react": "^16.3.1",
1414
"react-dom": "^16.3.1",
1515
"react-redux": "^5.0.7",
16-
"react-swipeable-views": "^0.12.13",
17-
"redux": "^3.7.2"
16+
"redux": "^3.7.2",
17+
"redux-persist": "^5.9.1",
18+
"strip-ansi": "^4.0.0"
1819
},
1920
"devDependencies": {
2021
"babel-cli": "^6.26.0",

yarn.lock

Lines changed: 13 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1304,7 +1304,7 @@ doctrine@^2.0.2, doctrine@^2.1.0:
13041304
dependencies:
13051305
esutils "^2.0.2"
13061306

1307-
dom-helpers@^3.2.0, dom-helpers@^3.2.1:
1307+
dom-helpers@^3.2.0:
13081308
version "3.3.1"
13091309
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6"
13101310

@@ -1567,7 +1567,7 @@ fast-levenshtein@~2.0.4:
15671567
version "2.0.6"
15681568
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
15691569

1570-
fbjs@^0.8.1, fbjs@^0.8.16, fbjs@^0.8.4:
1570+
fbjs@^0.8.1, fbjs@^0.8.16:
15711571
version "0.8.16"
15721572
resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db"
15731573
dependencies:
@@ -2149,7 +2149,7 @@ jsx-ast-utils@^2.0.0, jsx-ast-utils@^2.0.1:
21492149
dependencies:
21502150
array-includes "^3.0.3"
21512151

2152-
keycode@^2.1.7, keycode@^2.1.8:
2152+
keycode@^2.1.8:
21532153
version "2.2.0"
21542154
resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04"
21552155

@@ -2573,17 +2573,17 @@ promise@^7.1.1:
25732573
dependencies:
25742574
asap "~2.0.3"
25752575

2576-
prop-types@^15.5.4, prop-types@^15.6.0:
2577-
version "15.6.0"
2578-
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856"
2576+
prop-types@^15.5.6, prop-types@^15.5.7:
2577+
version "15.6.1"
2578+
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca"
25792579
dependencies:
25802580
fbjs "^0.8.16"
25812581
loose-envify "^1.3.1"
25822582
object-assign "^4.1.1"
25832583

2584-
prop-types@^15.5.6, prop-types@^15.5.7:
2585-
version "15.6.1"
2586-
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca"
2584+
prop-types@^15.6.0:
2585+
version "15.6.0"
2586+
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856"
25872587
dependencies:
25882588
fbjs "^0.8.16"
25892589
loose-envify "^1.3.1"
@@ -2646,35 +2646,6 @@ react-redux@^5.0.7:
26462646
loose-envify "^1.1.0"
26472647
prop-types "^15.6.0"
26482648

2649-
react-swipeable-views-core@^0.12.11:
2650-
version "0.12.11"
2651-
resolved "https://registry.yarnpkg.com/react-swipeable-views-core/-/react-swipeable-views-core-0.12.11.tgz#3cf2b4daffbb36f9d69bd19bf5b2d5370b6b2c1b"
2652-
dependencies:
2653-
babel-runtime "^6.23.0"
2654-
warning "^3.0.0"
2655-
2656-
react-swipeable-views-utils@^0.12.13:
2657-
version "0.12.13"
2658-
resolved "https://registry.yarnpkg.com/react-swipeable-views-utils/-/react-swipeable-views-utils-0.12.13.tgz#fe102524180bf568f746e844c8d74b9cd3e7e0b8"
2659-
dependencies:
2660-
babel-runtime "^6.23.0"
2661-
fbjs "^0.8.4"
2662-
keycode "^2.1.7"
2663-
prop-types "^15.6.0"
2664-
react-event-listener "^0.5.1"
2665-
react-swipeable-views-core "^0.12.11"
2666-
2667-
react-swipeable-views@^0.12.13:
2668-
version "0.12.13"
2669-
resolved "https://registry.yarnpkg.com/react-swipeable-views/-/react-swipeable-views-0.12.13.tgz#247442dbe14922efe5ad6fe0297599c817600bf9"
2670-
dependencies:
2671-
babel-runtime "^6.23.0"
2672-
dom-helpers "^3.2.1"
2673-
prop-types "^15.5.4"
2674-
react-swipeable-views-core "^0.12.11"
2675-
react-swipeable-views-utils "^0.12.13"
2676-
warning "^3.0.0"
2677-
26782649
react-test-renderer@16.2.0:
26792650
version "16.2.0"
26802651
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.2.0.tgz#bddf259a6b8fcd8555f012afc8eacc238872a211"
@@ -2759,6 +2730,10 @@ recompose@^0.26.0:
27592730
hoist-non-react-statics "^2.3.1"
27602731
symbol-observable "^1.0.4"
27612732

2733+
redux-persist@^5.9.1:
2734+
version "5.9.1"
2735+
resolved "https://registry.yarnpkg.com/redux-persist/-/redux-persist-5.9.1.tgz#83bd4abd526ef768f63fceee338fa9d8ed6552d6"
2736+
27622737
redux@^3.7.2:
27632738
version "3.7.2"
27642739
resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b"

0 commit comments

Comments
 (0)