Skip to content

Commit 469803b

Browse files
author
Jordan Schroter
authored
Merge pull request #9 from pronebird/fix/boilerplate-upgrade
Update and migrate all deps
2 parents 3902aab + d9ec54b commit 469803b

File tree

9 files changed

+142
-57
lines changed

9 files changed

+142
-57
lines changed

.babelrc

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
{
2-
"presets": ["es2015", "stage-0"]
2+
"presets": ["es2015", "stage-0", "react"],
3+
"plugins": ["transform-decorators-legacy"]
34
}

app/client/containers/DevTools.js

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import React from 'react';
2+
3+
// Exported from redux-devtools
4+
import { createDevTools } from 'redux-devtools';
5+
6+
// Monitors are separate packages, and you can make a custom one
7+
import LogMonitor from 'redux-devtools-log-monitor';
8+
import DockMonitor from 'redux-devtools-dock-monitor';
9+
10+
// createDevTools takes a monitor and produces a DevTools component
11+
const DevTools = createDevTools(
12+
// Monitors are individually adjustable with props.
13+
// Consult their repositories to learn about those props.
14+
// Here, we put LogMonitor inside a DockMonitor.
15+
// Note: DockMonitor is visible by default.
16+
<DockMonitor toggleVisibilityKey='ctrl-h'
17+
changePositionKey='ctrl-q'
18+
defaultIsVisible={true}>
19+
<LogMonitor theme='tomorrow' />
20+
</DockMonitor>
21+
);
22+
23+
export default DevTools;

app/client/main.js

+15-13
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,29 @@
11
import React from 'react';
22
import ReactDOM from 'react-dom';
33
import { compose, createStore, combineReducers } from 'redux';
4-
import { devTools } from 'redux-devtools';
54
import { Provider } from 'react-redux';
65
import user from './reducers/user';
76
import App from './containers/App';
7+
import DevTools from './containers/DevTools';
8+
9+
const initialState = {};
810

911
const isDevelopment = process.env.NODE_ENV === 'development';
10-
const appCreateStore = isDevelopment ? compose(devTools())(createStore) : createStore;
11-
const store = appCreateStore(combineReducers({ user }));
12+
13+
const enhancer = isDevelopment ? compose(
14+
// Required! Enable Redux DevTools with the monitors you chose
15+
DevTools.instrument()
16+
) : undefined;
17+
18+
const store = createStore(combineReducers({ user }), initialState, enhancer);
1219
const rootElement = document.querySelector(document.currentScript.getAttribute('data-container'));
1320

1421
ReactDOM.render(
15-
<div>
16-
<Provider store={store}>
22+
<Provider store={store}>
23+
<div>
1724
<App />
18-
</Provider>
19-
{ isDevelopment && do {
20-
const { DevTools, DebugPanel, LogMonitor } = require('redux-devtools/lib/react');
21-
<DebugPanel top right bottom>
22-
<DevTools store={store} monitor={LogMonitor} />
23-
</DebugPanel>;
24-
} }
25-
</div>,
25+
{ isDevelopment && <DevTools /> }
26+
</div>
27+
</Provider>,
2628
rootElement
2729
);

app/main.js

+64-12
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
1-
import app from 'app';
2-
import BrowserWindow from 'browser-window';
3-
import crashReporter from 'crash-reporter';
4-
5-
crashReporter.start();
1+
import {app, crashReporter, BrowserWindow, Menu} from 'electron';
2+
import path from 'path';
3+
import url from 'url';
64

75
let mainWindow = null;
6+
let forceQuit = false;
7+
8+
crashReporter.start({
9+
productName: 'YourName',
10+
companyName: 'YourCompany',
11+
submitURL: 'https://your-domain.com/url-to-submit',
12+
uploadToServer: false
13+
});
814

915
app.on('window-all-closed', () => {
1016
// On OS X it is common for applications and their menu bar
@@ -15,15 +21,61 @@ app.on('window-all-closed', () => {
1521
});
1622

1723
app.on('ready', () => {
18-
mainWindow = new BrowserWindow({ width: 1200, height: 1000 });
24+
mainWindow = new BrowserWindow({
25+
width: 1000,
26+
height: 800,
27+
minWidth: 640,
28+
minHeight: 480,
29+
show: false
30+
});
31+
mainWindow.loadURL(url.format({
32+
pathname: path.join(__dirname, 'client/index.html'),
33+
protocol: 'file:',
34+
slashes: true
35+
}));
1936

20-
mainWindow.loadUrl(`file://${__dirname}/client/index.html`);
37+
mainWindow.webContents.on('did-finish-load', () => {
38+
mainWindow.show();
39+
mainWindow.focus();
2140

22-
if (process.env.NODE_ENV === 'development') {
23-
mainWindow.openDevTools();
24-
}
41+
// Handle window logic properly on macOS:
42+
// 1. App should not terminate if window has been closed
43+
// 2. Click on icon in dock should re-open the window
44+
// 3. ⌘+Q should close the window and quit the app
45+
if (process.platform === 'darwin') {
46+
mainWindow.on('close', function (e) {
47+
if (!forceQuit) {
48+
e.preventDefault();
49+
mainWindow.hide();
50+
}
51+
});
2552

26-
mainWindow.on('closed', () => {
27-
mainWindow = null;
53+
app.on('activate', () => {
54+
mainWindow.show();
55+
});
56+
57+
app.on('before-quit', () => {
58+
forceQuit = true;
59+
});
60+
} else {
61+
mainWindow.on('closed', () => {
62+
mainWindow = null;
63+
});
64+
}
2865
});
66+
67+
if (process.env.NODE_ENV === 'development') {
68+
// auto-open dev tools
69+
mainWindow.webContents.openDevTools();
70+
71+
// add inspect element on right click menu
72+
mainWindow.webContents.on('context-menu', (e, props) => {
73+
Menu.buildFromTemplate([{
74+
label: 'Inspect element',
75+
click() {
76+
mainWindow.inspectElement(props.x, props.y);
77+
}
78+
}]).popup(mainWindow);
79+
});
80+
}
2981
});

app/package.json

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"name": "app",
3+
"version": "1.0.0",
4+
"description": "",
5+
"main": "main.js",
6+
"scripts": {
7+
"test": "echo \"Error: no test specified\" && exit 1"
8+
},
9+
"author": "",
10+
"license": "ISC"
11+
}

init.js

+1-13
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,3 @@
11
var path = require('path');
2-
var cacheDir = path.join(__dirname, 'cache');
3-
4-
if (process.env.NODE_ENV === 'development') {
5-
require('electron-compile').initWithOptions({
6-
cacheDir: cacheDir,
7-
js: {
8-
stage: 2
9-
}
10-
});
11-
} else {
12-
require('electron-compile').initForProduction(cacheDir);
13-
}
14-
require('./app/main');
152

3+
require('electron-compile').init(__dirname, './app/main');

package.json

+19-15
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,33 @@
77
"repository": "https://github.com/jschr/electron-react-redux-boilerplate",
88
"license": "MIT",
99
"dependencies": {
10-
"react": "^0.14.2",
11-
"react-dom": "^0.14.2",
12-
"react-redux": "^4.0.0",
10+
"react": "^15.4.2",
11+
"react-dom": "^15.4.2",
12+
"react-redux": "^5.0.2",
1313
"redux": "^3.0.0",
14-
"redux-actions": "^0.8.0",
15-
"electron-compile": "^1.0.0",
16-
"redux-devtools": "^2.1.2"
14+
"redux-actions": "^1.2.1",
15+
"electron-compile": "^5.1.3",
16+
"redux-devtools": "^3.3.2"
1717
},
1818
"devDependencies": {
19-
"babel-cli": "^6.2.0",
19+
"babel-cli": "^6.22.2",
2020
"babel-core": "^6.2.1",
21-
"babel-eslint": "^4.1.1",
21+
"babel-eslint": "^7.1.1",
22+
"babel-plugin-transform-decorators-legacy": "^1.3.4",
2223
"babel-preset-es2015": "^6.1.18",
24+
"babel-preset-react": "^6.22.0",
2325
"babel-preset-stage-0": "^6.1.18",
2426
"browser-sync": "^2.9.3",
2527
"chai": "^3.4.1",
26-
"electron-compilers": "^1.0.1",
27-
"electron-packager": "^5.1.0",
28-
"electron-prebuilt": "^0.34.2",
29-
"eslint": "^1.4.1",
30-
"eslint-config-airbnb": "0.1.0",
31-
"eslint-plugin-react": "^3.3.2",
32-
"mocha": "^2.3.4"
28+
"electron": "^1.5.0",
29+
"electron-compilers": "^5.1.3",
30+
"electron-packager": "^8.5.1",
31+
"eslint": "^3.14.1",
32+
"eslint-config-airbnb": "^14.0.0",
33+
"eslint-plugin-react": "^6.9.0",
34+
"mocha": "^3.2.0",
35+
"redux-devtools-dock-monitor": "^1.1.1",
36+
"redux-devtools-log-monitor": "^1.2.0"
3337
},
3438
"scripts": {
3539
"serve": "babel-node scripts/serve.js",

scripts/pack.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ packager({
2929
name: packageJson.name,
3030
platform: 'darwin',
3131
arch: 'x64',
32-
version: require('electron-prebuilt/package.json').version,
32+
version: require('electron/package.json').version,
3333
overwrite: true,
3434
prune: true,
3535
ignore: new RegExp(`node_modules/(${nodeModuleIgnores.join('|')})`),

scripts/serve.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { spawn } from 'child_process';
2-
import electron from 'electron-prebuilt';
2+
import electron from 'electron';
33
import browserSync from 'browser-sync';
44
import browserSyncConnectUtils from 'browser-sync/lib/connect-utils';
55

@@ -31,7 +31,7 @@ bsync.init({
3131
}, (err, bs) => {
3232
if (err) return console.error(err);
3333

34-
spawn(electron, ['.'], {
34+
const proc = spawn(electron, ['.'], {
3535
env: {
3636
...{
3737
NODE_ENV: 'development',
@@ -42,6 +42,10 @@ bsync.init({
4242
stdio: 'inherit'
4343
});
4444

45+
proc.on('close', (code) => {
46+
process.exit();
47+
});
48+
4549
bsync
4650
.watch('app/client/**/*')
4751
.on('change', bsync.reload);

0 commit comments

Comments
 (0)