diff --git a/gulpfile.js b/gulpfile.js
index f8f0c39..71c38a5 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -26,7 +26,8 @@ var config = {
scripts: {
source: './src/js/main.js',
destination: './public/js/',
- filename: 'bundle.js'
+ filename: 'bundle.js',
+ extensions: ['.jsx']
},
templates: {
source: './src/jade/*.jade',
@@ -137,4 +138,4 @@ gulp.task('no-js', ['templates', 'styles', 'assets']);
gulp.task('build', ['scripts', 'no-js']);
-gulp.task('default', ['watch', 'no-js', 'server']);
\ No newline at end of file
+gulp.task('default', ['watch', 'no-js', 'server']);
diff --git a/package.json b/package.json
index 97b5a97..92a6732 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,7 @@
"dependencies": {
"axios": "^0.4.2",
"lodash": "^2.4.1",
- "virtual-dom": "^1.2.0"
+ "react": "^0.12.2"
},
"devDependencies": {
"6to5ify": "^3.1.2",
@@ -48,13 +48,14 @@
"karma-coffee-preprocessor": "~0.2.1",
"karma-jasmine": "~0.2.2",
"pretty-hrtime": "~0.2.2",
+ "reactify": "^1.0.0",
"through2": "^0.6.3",
"vinyl-source-stream": "~1.0.0",
"watchify": "~2.0.0"
},
"browserify": {
"transform": [
- "./jsx-transform",
+ "reactify",
"6to5ify",
"debowerify",
"deamdify"
diff --git a/src/jade/index.jade b/src/jade/index.jade
index 2b727a7..a199b5a 100644
--- a/src/jade/index.jade
+++ b/src/jade/index.jade
@@ -57,7 +57,7 @@ html
a(href='https://github.com/koodiklinikka/koodiklinikka.fi')
i.fa.fa-github
- .fader
+ #fade.fader
script(src='js/bundle.js')
diff --git a/src/js/components/inviteForm.js b/src/js/components/inviteForm.js
deleted file mode 100644
index 6ee526a..0000000
--- a/src/js/components/inviteForm.js
+++ /dev/null
@@ -1,60 +0,0 @@
-'use strict';
-
-var {h} = require('virtual-dom');
-var classList = require('../util/classList');
-
-function render(props, state) {
- var formClasses = classList({
- 'invite-form': true,
- 'has-success': state.submitted,
- 'has-error': state.error
- });
-
- var inputClasses = classList({
- 'input': true,
- 'has-success': state.submitted,
- 'has-error': state.error
- });
-
- var feedbackMessage;
-
- if(state.error || state.submitted) {
- let messageText;
-
- if(state.submitted) {
- messageText = 'Kutsu lähetetty antamaasi sähköpostiosoitteeseen.';
- } else if(state.error.status === 400) {
- messageText = 'Tarkasta syöttämäsi sähköpostiosoite';
- } else {
- messageText = 'Jotain meni pieleen. Yritä hetken päästä uudelleen.';
- }
-
- feedbackMessage = (
-
- {messageText}
-
- );
-
- }
- return (
-
- )
-}
-
-module.exports = render;
diff --git a/src/js/components/inviteForm.jsx b/src/js/components/inviteForm.jsx
new file mode 100644
index 0000000..27a0ca5
--- /dev/null
+++ b/src/js/components/inviteForm.jsx
@@ -0,0 +1,98 @@
+'use strict';
+
+var request = require('axios');
+var React = require('React/addons');
+var classSet = React.addons.classSet
+
+module.exports = React.createClass({
+ getInitialState() {
+ return {
+ email: '',
+ submitted: false,
+ error: null
+ };
+ },
+ onSubmit(e) {
+ e.preventDefault();
+
+ this.setState({
+ submitted: false,
+ error: null
+ });
+
+ request.post('/api/invites', {
+ email: this.state.email
+ })
+ .then(this.handleSuccess)
+ .catch(this.handleError);
+ },
+ handleSuccess() {
+ this.setState({submitted: true});
+ },
+ handleError(err) {
+ this.setState({error: err});
+ },
+ onChange(e) {
+ if(e.target.value === this.state.email) {
+ return;
+ }
+ this.setState({
+ email: e.target.value,
+ error: null,
+ submitted: false
+ });
+ },
+ render() {
+ var formClasses = classSet({
+ 'invite-form': true,
+ 'has-success': this.state.submitted,
+ 'has-error': this.state.error
+ });
+
+ var inputClasses = classSet({
+ 'input': true,
+ 'has-success': this.state.submitted,
+ 'has-error': this.state.error
+ });
+
+ var feedbackMessage;
+
+ if(this.state.error || this.state.submitted) {
+ let messageText;
+
+ if(this.state.submitted) {
+ messageText = 'Kutsu lähetetty antamaasi sähköpostiosoitteeseen.';
+ } else if(this.state.error.status === 400) {
+ messageText = 'Tarkasta syöttämäsi sähköpostiosoite';
+ } else {
+ messageText = 'Jotain meni pieleen. Yritä hetken päästä uudelleen.';
+ }
+
+ feedbackMessage = (
+
+ {messageText}
+
+ );
+ }
+
+ return (
+
+ )
+ }
+});
diff --git a/src/js/main.js b/src/js/main.js
index ecb721b..2e89726 100644
--- a/src/js/main.js
+++ b/src/js/main.js
@@ -1,66 +1,9 @@
'use strict';
-
require('./ga');
-var _ = require('lodash');
-var request = require('axios');
-
-var inviteForm = require('./components/inviteForm');
-var {diff, patch, create} = require('virtual-dom');
-
-var state = {
- email: '',
- submitted: false,
- error: null
-};
-
-function setState(newState) {
- state = _.extend({}, state, newState);
- rerender(state);
-}
-
-var props = {
- onSubmit: function(e) {
- e.preventDefault();
-
- setState({
- submitted: false,
- error: null
- });
-
- request.post('/api/invites', {
- email: state.email
- }).then(function() {
- setState({submitted: true});
- }).catch(function(err) {
- setState({error: err});
- });
- },
- onChange: function(e) {
- if(e.target.value === state.email) {
- return;
- }
-
- setState({
- email: e.target.value,
- error: null,
- submitted: false
- });
- },
-};
-
-var tree = inviteForm(props, state);
-var rootNode = create(tree);
-
-document
- .getElementById('invite-form')
- .appendChild(rootNode);
-
-function rerender() {
- var newTree = inviteForm(props, state);
- var patches = diff(tree, newTree);
- rootNode = patch(rootNode, patches);
- tree = newTree;
-}
+var React = require('React');
+React.render(
+ require('./components/inviteForm')(),
+ document.getElementById('invite-form'));
diff --git a/src/js/util/classList.js b/src/js/util/classList.js
deleted file mode 100644
index 9a85b16..0000000
--- a/src/js/util/classList.js
+++ /dev/null
@@ -1,11 +0,0 @@
-'use strict';
-
-module.exports = function classList(classesObj) {
- var classes = [];
- for(var key in classesObj) {
- if(!!classesObj[key]) {
- classes.push(key);
- }
- }
- return classes.join(' ');
-};