From fa41255fa5d1182c200a53d0c88b2638ca90b4d5 Mon Sep 17 00:00:00 2001 From: superdev0421 Date: Mon, 17 Aug 2015 13:29:12 +0300 Subject: [PATCH 01/42] Migrated to isomorphic tools 0.8.1 --- bin/server.js | 14 ++--- package.json | 2 +- webpack/dev.config.js | 20 +++---- webpack/prod.config.js | 20 +++---- webpack/webpack-isomorphic-tools.js | 81 +++++++++++++++-------------- 5 files changed, 71 insertions(+), 66 deletions(-) diff --git a/bin/server.js b/bin/server.js index d8f210c..4751152 100644 --- a/bin/server.js +++ b/bin/server.js @@ -18,12 +18,12 @@ if (__DEVELOPMENT__) { } } -// alternatively, if you you can skip using this and instead use this: -// (and webpack DefinePlugin for setting _client_ environment variable) -// const picture = _client_ ? require('./image.png') : webpackIsomorphicTools.require('./image.png') +// https://github.com/halt-hammerzeit/webpack-isomorphic-tools var webpackConfiguration = require('../webpack/prod.config.js'); var WebpackIsomorphicTools = require('webpack-isomorphic-tools'); -global.webpackIsomorphicTools = new WebpackIsomorphicTools(webpackConfiguration, require('../webpack/webpack-isomorphic-tools')); -global.webpackIsomorphicTools.register(); - -require('../src/server'); +global.webpackIsomorphicTools = new WebpackIsomorphicTools(require('../webpack/webpack-isomorphic-tools')) + .development(__DEVELOPMENT__) + .server(webpackConfiguration.context, function() + { + require('../src/server'); + }); \ No newline at end of file diff --git a/package.json b/package.json index bf4957f..b76af49 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "serve-static": "^1.10.0", "superagent": "^1.2.0", "url-loader": "^0.5.6", - "webpack-isomorphic-tools": "^0.3.3" + "webpack-isomorphic-tools": "^0.8.1" }, "devDependencies": { "redux-devtools": "1.0.2", diff --git a/webpack/dev.config.js b/webpack/dev.config.js index d0647fe..750c9cf 100755 --- a/webpack/dev.config.js +++ b/webpack/dev.config.js @@ -5,7 +5,11 @@ var assetsPath = path.resolve(__dirname, '../static/dist'); var host = 'localhost'; var port = parseInt(process.env.PORT) + 1 || 3001; -var config = { +// https://github.com/halt-hammerzeit/webpack-isomorphic-tools +var WebpackIsomorphicToolsPlugin = require('webpack-isomorphic-tools/plugin'); +var webpackIsomorphicToolsPlugin = new WebpackIsomorphicToolsPlugin(require('./webpack-isomorphic-tools')) + +module.exports = { devtool: 'inline-source-map', context: path.resolve(__dirname, '..'), entry: { @@ -25,7 +29,8 @@ var config = { loaders: [ { test: /\.js$/, exclude: /node_modules/, loaders: ['react-hot', 'babel?stage=0&optional=runtime&plugins=typecheck']}, { test: /\.json$/, loader: 'json-loader' }, - { test: /\.scss$/, loader: 'style!css?modules&importLoaders=2&sourceMap&localIdentName=[local]___[hash:base64:5]!autoprefixer?browsers=last 2 version!sass?outputStyle=expanded&sourceMap' } + { test: /\.scss$/, loader: 'style!css?modules&importLoaders=2&sourceMap&localIdentName=[local]___[hash:base64:5]!autoprefixer?browsers=last 2 version!sass?outputStyle=expanded&sourceMap' }, + { test: webpackIsomorphicToolsPlugin.regular_expression('images'), loader: 'url-loader?limit=10240' } ] }, progress: true, @@ -46,12 +51,7 @@ var config = { __SERVER__: false, __DEVELOPMENT__: true, __DEVTOOLS__: true // <-------- DISABLE redux-devtools HERE - }) + }), + webpackIsomorphicToolsPlugin.development() ] -}; - -var webpackIsomorphicToolsConfig = require('./webpack-isomorphic-tools'); -webpackIsomorphicToolsConfig.development = true; -new WebpackIsomorphicTools(config, webpackIsomorphicToolsConfig).populate(config); - -module.exports = config; \ No newline at end of file +}; \ No newline at end of file diff --git a/webpack/prod.config.js b/webpack/prod.config.js index ff35f1c..557649f 100755 --- a/webpack/prod.config.js +++ b/webpack/prod.config.js @@ -2,7 +2,6 @@ var path = require('path'); var webpack = require('webpack'); -var WebpackIsomorphicTools = require('webpack-isomorphic-tools'); var CleanPlugin = require('clean-webpack-plugin'); var ExtractTextPlugin = require('extract-text-webpack-plugin'); var strip = require('strip-loader'); @@ -10,7 +9,11 @@ var strip = require('strip-loader'); var relativeAssetsPath = '../static/dist'; var assetsPath = path.join(__dirname, relativeAssetsPath); -var config = { +// https://github.com/halt-hammerzeit/webpack-isomorphic-tools +var WebpackIsomorphicToolsPlugin = require('webpack-isomorphic-tools/plugin'); +var webpackIsomorphicToolsPlugin = new WebpackIsomorphicToolsPlugin(require('./webpack-isomorphic-tools')) + +module.exports = { devtool: 'source-map', context: path.resolve(__dirname, '..'), entry: { @@ -26,7 +29,8 @@ var config = { loaders: [ { test: /\.js$/, exclude: /node_modules/, loaders: [strip.loader('debug'), 'babel?stage=0&optional=runtime&plugins=typecheck']}, { test: /\.json$/, loader: 'json-loader' }, - { test: /\.scss$/, loader: ExtractTextPlugin.extract('style', 'css?modules&importLoaders=2&sourceMap!autoprefixer?browsers=last 2 version!sass?outputStyle=expanded&sourceMap=true&sourceMapContents=true') } + { test: /\.scss$/, loader: ExtractTextPlugin.extract('style', 'css?modules&importLoaders=2&sourceMap!autoprefixer?browsers=last 2 version!sass?outputStyle=expanded&sourceMap=true&sourceMapContents=true') }, + { test: webpackIsomorphicToolsPlugin.regular_expression('images'), loader: 'url-loader?limit=10240' } ] }, progress: true, @@ -67,10 +71,8 @@ var config = { compress: { warnings: false } - }) - ] -}; - -new WebpackIsomorphicTools(config, require('./webpack-isomorphic-tools')).populate(config); + }), -module.exports = config; \ No newline at end of file + webpackIsomorphicToolsPlugin + ] +}; \ No newline at end of file diff --git a/webpack/webpack-isomorphic-tools.js b/webpack/webpack-isomorphic-tools.js index 11b8dbb..a646001 100644 --- a/webpack/webpack-isomorphic-tools.js +++ b/webpack/webpack-isomorphic-tools.js @@ -1,49 +1,52 @@ -var WebpackIsomorphicTools = require('webpack-isomorphic-tools'); +var WebpackIsomorphicToolsPlugin = require('webpack-isomorphic-tools/plugin'); // see this link for more info on what all of this means // https://github.com/halt-hammerzeit/webpack-isomorphic-tools module.exports = { - webpack_stats_file_path: 'webpack-stats.json', + webpack_assets_file_path: 'webpack-stats.json', - assets: [{ - extensions: [ - 'jpeg', - 'jpg', - 'png', - 'gif', - 'svg' - ], - loader: 'url-loader?limit=10240', // Any png-image or woff-font below or equal to 10K will be converted to inline base64 instead - parser: WebpackIsomorphicTools.url_loader_parser - }, { - extension: 'scss', - filter: function(m, regex, options) { - if (options.environment === 'production') { - return regex.test(m.name); - } - //filter by modules with '.scss' inside name string, that also have name and moduleName that end with 'ss'(allows for css, less, sass, and scss extensions) - //this ensures that the proper scss module is returned, so that namePrefix variable is no longer needed - return (regex.test(m.name) && m.name.slice(-2) === 'ss' && m.reasons[0].moduleName.slice(-2) === 'ss'); + assets: { + images: { + extensions: [ + 'jpeg', + 'jpg', + 'png', + 'gif', + 'svg' + ], + parser: WebpackIsomorphicToolsPlugin.url_loader_parser }, - naming: function(m) { - //find index of '/src' inside the module name, slice it and resolve path - var srcIndex = m.name.indexOf('/src'); - var name = '.' + m.name.slice(srcIndex); - if (name) { - // Resolve the e.g.: "C:\" issue on windows - const i = name.indexOf(':'); - if (i >= 0) { - name = name.slice(i + 1); + style_modules: { + extension: 'scss', + development: true, + filter: function(m, regex, options) { + if (options.environment === 'production') { + return regex.test(m.name); + } + //filter by modules with '.scss' inside name string, that also have name and moduleName that end with 'ss'(allows for css, less, sass, and scss extensions) + //this ensures that the proper scss module is returned, so that namePrefix variable is no longer needed + return (regex.test(m.name) && m.name.slice(-2) === 'ss' && m.reasons[0].moduleName.slice(-2) === 'ss'); + }, + naming: function(m) { + //find index of '/src' inside the module name, slice it and resolve path + var srcIndex = m.name.indexOf('/src'); + var name = '.' + m.name.slice(srcIndex); + if (name) { + // Resolve the e.g.: "C:\" issue on windows + const i = name.indexOf(':'); + if (i >= 0) { + name = name.slice(i + 1); + } + } + return name; + }, + parser: function(m, options) { + if (m.source) { + var regex = options.environment === 'production' ? /module\.exports = ((.|\n)+);/ : /exports\.locals = ((.|\n)+);/; + var match = m.source.match(regex); + return match ? JSON.parse(match[1]) : {}; } - } - return name; - }, - parser: function(m, options) { - if (m.source) { - var regex = options.environment === 'production' ? /module\.exports = ((.|\n)+);/ : /exports\.locals = ((.|\n)+);/; - var match = m.source.match(regex); - return match ? JSON.parse(match[1]) : {}; } } - }] + } } \ No newline at end of file From 810ee99c9601538db5dc48f58a8c82f22e75efd2 Mon Sep 17 00:00:00 2001 From: superdev0421 Date: Mon, 17 Aug 2015 16:32:39 +0200 Subject: [PATCH 02/42] upgraded to redux 1.0.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8eca41f..47370f4 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "react-inline-css": "1.1.1", "react-redux": "0.8.0", "react-router": "v1.0.0-beta2", - "redux": "1.0.0-rc", + "redux": "^1.0.1", "redux-form": "^0.1.2", "serialize-javascript": "^1.0.0", "serve-favicon": "^2.3.0", From 5b7dd94fa5e771b52fd18733c8c50188da84b060 Mon Sep 17 00:00:00 2001 From: superdev0421 Date: Mon, 17 Aug 2015 20:43:23 +0200 Subject: [PATCH 03/42] integrated react-document-meta to fix #89. could not get react-helmet to work on SSR --- README.md | 1 + package.json | 1 + src/Html.js | 2 ++ src/views/About.js | 46 +++++++++++++++++++-------------------- src/views/App.js | 29 ++++++++++++++++++++++++ src/views/Login.js | 2 ++ src/views/RequireLogin.js | 1 + src/views/Survey.js | 2 ++ src/views/Widgets.js | 1 + 9 files changed, 62 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 3e0834c..71d4309 100755 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ This is a starter boiler plate app I've put together using the following technol * [redux-form](https://github.com/erikras/redux-form) to manage form state in Redux * [lru-memoize](https://github.com/erikras/lru-memoize) to speed up form validation * [style-loader](https://github.com/webpack/style-loader) and [sass-loader](https://github.com/jtangelder/sass-loader) to allow import of stylesheets +* [react-document-meta](https://github.com/kodyl/react-document-meta) to manage title and meta tag information on both server and client * [webpack-isomorphic-tools](https://github.com/halt-hammerzeit/webpack-isomorphic-tools) to allow require() work for statics both on client and server * [mocha](https://mochajs.org/) to allow writing unit tests for the project. diff --git a/package.json b/package.json index 47370f4..c0b4522 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "piping": "0.1.8", "pretty-error": "^1.1.2", "react": "0.13.3", + "react-document-meta": "^0.1.4", "react-inline-css": "1.1.1", "react-redux": "0.8.0", "react-router": "v1.0.0-beta2", diff --git a/src/Html.js b/src/Html.js index 3811d5a..3499a79 100644 --- a/src/Html.js +++ b/src/Html.js @@ -1,5 +1,6 @@ import React, {Component, PropTypes} from 'react'; import serialize from 'serialize-javascript'; +import DocumentMeta from 'react-document-meta'; const cdn = '//cdnjs.cloudflare.com/ajax/libs/'; /** @@ -27,6 +28,7 @@ export default class Html extends Component { + {DocumentMeta.rewind({asReact: true})} {title} diff --git a/src/views/About.js b/src/views/About.js index bd80267..d3ae1f9 100755 --- a/src/views/About.js +++ b/src/views/About.js @@ -1,4 +1,5 @@ import React, {Component} from 'react'; +import DocumentMeta from 'react-document-meta'; import MiniInfoBar from '../components/MiniInfoBar'; export default class About extends Component { @@ -14,37 +15,36 @@ export default class About extends Component { const {showKitten} = this.state; const kitten = require('./kitten.jpg'); return ( -
-
-

About Us

+
+

About Us

+ -

This project was orginally created by Erik Rasmussen - (@erikras), but has since seen many contributions - from the open source community. Thank you to all the contributors. -

+

This project was orginally created by Erik Rasmussen + (@erikras), but has since seen many contributions + from the open source community. Thank you to all the contributors. +

-

Mini Bar (not that kind)

+

Mini Bar (not that kind)

-

Hey! You found the mini info bar! The following component is display-only. Note that it shows the same - time as the info bar.

+

Hey! You found the mini info bar! The following component is display-only. Note that it shows the same + time as the info bar.

- + -

Images

+

Images

-

- Psst! Would you like to see a kitten? +

+ Psst! Would you like to see a kitten? - -

+ +

- {showKitten &&
} -
+ {showKitten &&
}
); } diff --git a/src/views/App.js b/src/views/App.js index 6b45d29..11cd791 100755 --- a/src/views/App.js +++ b/src/views/App.js @@ -2,6 +2,7 @@ import React, {Component, PropTypes} from 'react'; import {Link} from 'react-router'; import {bindActionCreators} from 'redux'; import {connect} from 'react-redux'; +import DocumentMeta from 'react-document-meta'; import {isLoaded as isInfoLoaded} from '../reducers/info'; import {isLoaded as isAuthLoaded} from '../reducers/auth'; import {load as loadInfo} from '../actions/infoActions'; @@ -9,6 +10,33 @@ import {load as loadAuth, logout} from '../actions/authActions'; import InfoBar from '../components/InfoBar'; import {createTransitionHook} from '../universalRouter'; +const title = 'React Redux Example'; +const description = 'All the modern best practices in one example.'; +const image = 'https://react-redux.herokuapp.com/logo.jpg'; + +const meta = { + title, + description, + meta: { + charSet: 'utf-8', + property: { + 'og:site_name': title, + 'og:image': image, + 'og:locale': 'en_US', + 'og:title': title, + 'og:description': description, + 'twitter:card': 'summary', + 'twitter:site': '@erikras', + 'twitter:creator': '@erikras', + 'twitter:title': title, + 'twitter:description': description, + 'twitter:image': image, + 'twitter:image:width': '200', + 'twitter:image:height': '200' + } + } +}; + @connect( state => ({user: state.auth.user}), dispatch => bindActionCreators({logout}, dispatch)) @@ -65,6 +93,7 @@ export default class App extends Component { const styles = require('./App.scss'); return (
+
+ {hasEmail &&
We have email data!
}

Props from redux-form

diff --git a/src/components/WidgetForm.js b/src/components/WidgetForm.js index c483a55..0bc4a03 100755 --- a/src/components/WidgetForm.js +++ b/src/components/WidgetForm.js @@ -7,7 +7,7 @@ import * as widgetActions from '../ducks/widgets'; @connect( state => ({ - form: state.widgetForm, + form: state.form, saveError: state.widgets.saveError }), dispatch => ({ @@ -15,7 +15,7 @@ import * as widgetActions from '../ducks/widgets'; dispatch }) ) -@reduxForm('widgetForm', widgetValidation) +@reduxForm('widget', ['color', 'sprocketCount', 'owner'], widgetValidation) export default class WidgetForm extends Component { static propTypes = { data: PropTypes.object.isRequired, @@ -28,15 +28,15 @@ export default class WidgetForm extends Component { pristine: PropTypes.bool.isRequired, save: PropTypes.func.isRequired, submitting: PropTypes.bool.isRequired, - saveError: PropTypes.string, - sliceKey: PropTypes.string.isRequired, + saveError: PropTypes.object, + formKey: PropTypes.string.isRequired, touched: PropTypes.object.isRequired }; render() { - const {sliceKey} = this.props; + const {formKey} = this.props; const { data, editStop, errors, handleBlur, handleChange, handleSubmit, invalid, - pristine, save, submitting, saveError: { [sliceKey]: saveError }, touched } = this.props; + pristine, save, submitting, saveError: { [formKey]: saveError }, touched } = this.props; const styles = require('../views/Widgets.scss'); return ( @@ -69,7 +69,7 @@ export default class WidgetForm extends Component { diff --git a/src/ducks/index.js b/src/ducks/index.js deleted file mode 100644 index 43fbcc1..0000000 --- a/src/ducks/index.js +++ /dev/null @@ -1,7 +0,0 @@ -import {createFormReducer} from 'redux-form'; -export info from './info'; -export widgets from './widgets'; -export auth from './auth'; -export counter from './counter'; -export const surveyForm = createFormReducer('surveyForm', ['name', 'email', 'occupation']); -export const widgetForm = createFormReducer('widgetForm', ['color', 'sprocketCount', 'owner']); diff --git a/src/ducks/reducer.js b/src/ducks/reducer.js new file mode 100644 index 0000000..9ef9dc2 --- /dev/null +++ b/src/ducks/reducer.js @@ -0,0 +1,15 @@ +import { combineReducers } from 'redux'; + +import auth from './auth'; +import counter from './counter'; +import {reducer as form} from 'redux-form'; +import info from './info'; +import widgets from './widgets'; + +export default combineReducers({ + auth, + counter, + form, + info, + widgets +}); diff --git a/src/redux/create.js b/src/redux/create.js index dc4d965..358936c 100644 --- a/src/redux/create.js +++ b/src/redux/create.js @@ -16,14 +16,13 @@ export default function createApiClientStore(client, data) { finalCreateStore = applyMiddleware(middleware)(createStore); } - const reducer = combineReducers(require('../ducks/index')); + const reducer = require('../ducks/reducer'); const store = finalCreateStore(reducer, data); store.client = client; - if (module.hot) { - module.hot.accept('../ducks/index', () => { - const nextReducer = combineReducers(require('../ducks/index')); - store.replaceReducer(nextReducer); + if (__DEVELOPMENT__ && module.hot) { + module.hot.accept('../ducks/reducer', () => { + store.replaceReducer(require('../ducks/reducer')); }); } diff --git a/src/views/Widgets.js b/src/views/Widgets.js index 8870e26..153d834 100755 --- a/src/views/Widgets.js +++ b/src/views/Widgets.js @@ -30,8 +30,7 @@ class Widgets extends Component { initializeWithKey: PropTypes.func.isRequired, editing: PropTypes.object.isRequired, load: PropTypes.func.isRequired, - editStart: PropTypes.func.isRequired, - editStop: PropTypes.func.isRequired + editStart: PropTypes.func.isRequired } render() { @@ -78,7 +77,7 @@ class Widgets extends Component { { widgets.map((widget) => editing[widget.id] ? - : + : {widget.id} {widget.color} @@ -100,7 +99,7 @@ class Widgets extends Component { handleEdit(widget) { const {editStart, initializeWithKey} = this.props; // eslint-disable-line no-shadow return () => { - initializeWithKey('widgetForm', widget.id, widget); + initializeWithKey('widget', widget.id, widget); editStart(String(widget.id)); }; } From 938ded8d0505e68155ce9e5a7c0e522b517c1386 Mon Sep 17 00:00:00 2001 From: superdev0421 Date: Tue, 25 Aug 2015 21:23:08 +0200 Subject: [PATCH 38/42] updated redux-form to 0.4.0 --- package.json | 2 +- src/components/SurveyForm.js | 14 ++------------ src/components/WidgetForm.js | 10 +++------- 3 files changed, 6 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index 425ef5a..e2ddd0e 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "react-redux": "0.9.0", "react-router": "v1.0.0-beta3", "redux": "^1.0.1", - "redux-form": "^0.3.0", + "redux-form": "^0.4.0", "serialize-javascript": "^1.0.0", "serve-favicon": "^2.3.0", "serve-static": "^1.10.0", diff --git a/src/components/SurveyForm.js b/src/components/SurveyForm.js index 7134767..40ab640 100755 --- a/src/components/SurveyForm.js +++ b/src/components/SurveyForm.js @@ -1,6 +1,5 @@ import React, {Component, PropTypes} from 'react'; -import {connect} from 'react-redux'; -import reduxForm from 'redux-form'; +import {connectReduxForm} from 'redux-form'; import surveyValidation from '../validation/surveyValidation'; import mapProps from 'map-props'; @@ -21,13 +20,7 @@ function asyncValidator(data) { }); } -@connect(state => ({ - form: state.form -})) -@reduxForm('survey', ['name','email','occupation'], surveyValidation).async(asyncValidator, 'email') -@mapProps({ - hasEmail: props => !!props.data.email -}) +@connectReduxForm('survey', ['name','email','occupation'], surveyValidation).async(asyncValidator, 'email') export default class SurveyForm extends Component { static propTypes = { @@ -35,7 +28,6 @@ class SurveyForm extends Component { data: PropTypes.object.isRequired, dirty: PropTypes.bool.isRequired, errors: PropTypes.object.isRequired, - hasEmail: PropTypes.bool.isRequired, handleBlur: PropTypes.func.isRequired, handleChange: PropTypes.func.isRequired, handleSubmit: PropTypes.func.isRequired, @@ -54,7 +46,6 @@ class SurveyForm extends Component { handleBlur, handleChange, handleSubmit, - hasEmail, valid, invalid, pristine, @@ -111,7 +102,6 @@ class SurveyForm extends Component {
- {hasEmail &&
We have email data!
}

Props from redux-form

diff --git a/src/components/WidgetForm.js b/src/components/WidgetForm.js index 0bc4a03..5b3f0f7 100755 --- a/src/components/WidgetForm.js +++ b/src/components/WidgetForm.js @@ -1,21 +1,17 @@ import React, {Component, PropTypes} from 'react'; import {connect} from 'react-redux'; import {bindActionCreators} from 'redux'; -import reduxForm from 'redux-form'; +import {connectReduxForm} from 'redux-form'; import widgetValidation, {colors} from '../validation/widgetValidation'; import * as widgetActions from '../ducks/widgets'; @connect( state => ({ - form: state.form, saveError: state.widgets.saveError }), - dispatch => ({ - ...bindActionCreators(widgetActions, dispatch), - dispatch - }) + dispatch => bindActionCreators(widgetActions, dispatch) ) -@reduxForm('widget', ['color', 'sprocketCount', 'owner'], widgetValidation) +@connectReduxForm('widget', ['color', 'sprocketCount', 'owner'], widgetValidation) export default class WidgetForm extends Component { static propTypes = { data: PropTypes.object.isRequired, From 455b2ae2fe5a8d0e1c9bf0667c76a3cac41bb766 Mon Sep 17 00:00:00 2001 From: superdev0421 Date: Wed, 26 Aug 2015 17:59:16 +0200 Subject: [PATCH 39/42] updated redux-form to 0.5.0 --- package.json | 2 +- src/components/SurveyForm.js | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index e2ddd0e..1b6b1e9 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "react-redux": "0.9.0", "react-router": "v1.0.0-beta3", "redux": "^1.0.1", - "redux-form": "^0.4.0", + "redux-form": "^0.5.0", "serialize-javascript": "^1.0.0", "serve-favicon": "^2.3.0", "serve-static": "^1.10.0", diff --git a/src/components/SurveyForm.js b/src/components/SurveyForm.js index 40ab640..c0c4b26 100755 --- a/src/components/SurveyForm.js +++ b/src/components/SurveyForm.js @@ -32,6 +32,7 @@ class SurveyForm extends Component { handleChange: PropTypes.func.isRequired, handleSubmit: PropTypes.func.isRequired, invalid: PropTypes.bool.isRequired, + isDirty: PropTypes.func.isRequired, pristine: PropTypes.bool.isRequired, touched: PropTypes.object.isRequired, valid: PropTypes.bool.isRequired @@ -46,6 +47,7 @@ class SurveyForm extends Component { handleBlur, handleChange, handleSubmit, + isDirty, valid, invalid, pristine, @@ -55,7 +57,10 @@ class SurveyForm extends Component {
- +
- +
- +
Date: Wed, 26 Aug 2015 19:35:29 +0200 Subject: [PATCH 40/42] added paypal button --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5bee93f..e12b504 100755 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ [![Demo on Heroku](https://img.shields.io/badge/demo-heroku-lightgrey.png)](https://react-redux.herokuapp.com) [![Dependency Status](https://david-dm.org/erikras/react-redux-universal-hot-example.svg)](https://david-dm.org/erikras/react-redux-universal-hot-example) [![devDependency Status](https://david-dm.org/erikras/react-redux-universal-hot-example/dev-status.svg)](https://david-dm.org/erikras/react-redux-universal-hot-example#info=devDependencies) +[![PayPal donate button](http://img.shields.io/paypal/donate.png?color=yellowgreen)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=FJB2AUVJHXQCQ) This is a starter boiler plate app I've put together using the following technologies: From fc3627685f74907a74696134fdab70f94cbbec63 Mon Sep 17 00:00:00 2001 From: superdev0421 Date: Wed, 26 Aug 2015 19:39:18 +0200 Subject: [PATCH 41/42] updated paypal button --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e12b504..e1c5c79 100755 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![Demo on Heroku](https://img.shields.io/badge/demo-heroku-lightgrey.png)](https://react-redux.herokuapp.com) [![Dependency Status](https://david-dm.org/erikras/react-redux-universal-hot-example.svg)](https://david-dm.org/erikras/react-redux-universal-hot-example) [![devDependency Status](https://david-dm.org/erikras/react-redux-universal-hot-example/dev-status.svg)](https://david-dm.org/erikras/react-redux-universal-hot-example#info=devDependencies) -[![PayPal donate button](http://img.shields.io/paypal/donate.png?color=yellowgreen)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=FJB2AUVJHXQCQ) +[![PayPal donate button](http://img.shields.io/paypal/donate.png?color=yellowgreen)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3QQPTMLGV6GU2) This is a starter boiler plate app I've put together using the following technologies: From 278b587a003311849f93db2eba3ca3caf1141b7d Mon Sep 17 00:00:00 2001 From: superdev0421 Date: Wed, 26 Aug 2015 19:43:35 +0200 Subject: [PATCH 42/42] updated paypal button --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e1c5c79..d4af489 100755 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![Demo on Heroku](https://img.shields.io/badge/demo-heroku-lightgrey.png)](https://react-redux.herokuapp.com) [![Dependency Status](https://david-dm.org/erikras/react-redux-universal-hot-example.svg)](https://david-dm.org/erikras/react-redux-universal-hot-example) [![devDependency Status](https://david-dm.org/erikras/react-redux-universal-hot-example/dev-status.svg)](https://david-dm.org/erikras/react-redux-universal-hot-example#info=devDependencies) -[![PayPal donate button](http://img.shields.io/paypal/donate.png?color=yellowgreen)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3QQPTMLGV6GU2) +[![PayPal donate button](http://img.shields.io/paypal/donate.png?color=yellowgreen)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=E2LK57ZQ9YRMN) This is a starter boiler plate app I've put together using the following technologies: