diff --git a/src/js/components/membershipForm.js b/src/js/components/membershipForm.js
new file mode 100644
index 0000000..66178b6
--- /dev/null
+++ b/src/js/components/membershipForm.js
@@ -0,0 +1,133 @@
+'use strict';
+
+var request = require('axios');
+var React = require('react');
+var classSet = require('classnames');
+
+var api = require('../api');
+
+module.exports = React.createClass({
+ getInitialState() {
+ return {
+ email: '',
+ name: '',
+ handle: '',
+ residence: '',
+ submitted: false,
+ sending: false,
+ error: null
+ };
+ },
+ onSubmit(e) {
+ e.preventDefault();
+
+ this.setState({
+ submitted: false,
+ sending: true,
+ error: null
+ });
+
+ request.post(api('invites'), {
+ email: this.state.email.trim()
+ })
+ .then(this.handleSuccess)
+ .catch(this.handleError);
+ },
+ handleSuccess() {
+ this.setState({submitted: true, sending: false});
+ },
+ handleError(err) {
+ this.setState({error: err, sending: false});
+ },
+ onChange(e) {
+ if(e.target.value === this.state[e.target.name]) {
+ return;
+ }
+
+ this.setState({
+ [e.target.name]: e.target.value,
+ error: null,
+ submitted: false
+ });
+ },
+ render() {
+ var formClasses = classSet({
+ 'membership-form': true,
+ 'has-success': this.state.submitted,
+ 'has-error': this.state.error,
+ 'sending': this.state.sending
+ });
+
+ 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 && this.state.error.data === 'invalid_email') {
+ messageText = 'Tarkasta syöttämäsi sähköpostiosoite';
+ } else if(this.state.error.status === 400 && this.state.error.data === 'already_invited') {
+ messageText = 'Sähköpostiosoitteeseen on jo lähetetty kutsu';
+ } 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 d5b35bc..0ab8ce9 100644
--- a/src/js/main.js
+++ b/src/js/main.js
@@ -3,31 +3,46 @@ require('./ga');
let ReactDOM = require('react-dom');
var React = require('react');
-
var inviteForm = React.createFactory(require('./components/inviteForm'));
var fader = React.createFactory(require('./components/fader'));
var members = React.createFactory(require('./components/members'));
var feed = React.createFactory(require('./components/feed'));
var email = React.createFactory(require('./components/email'));
+var membershipForm = React.createFactory(require('./components/membershipForm'));
-ReactDOM.render(
- inviteForm(),
- document.getElementById('invite-form'));
+const pathName = window.location.pathname;
+console.log(pathName);
-ReactDOM.render(
- fader(),
- document.getElementById('fader'));
+if(pathName == '/') {
+ ReactDOM.render(
+ inviteForm(),
+ document.getElementById('invite-form'));
+ ReactDOM.render(
+ fader(),
+ document.getElementById('fader'));
-ReactDOM.render(
- members(),
- document.getElementById('members'));
+ ReactDOM.render(
+ members(),
+ document.getElementById('members'));
+ ReactDOM.render(
+ feed(),
+ document.getElementById('feed'));
-ReactDOM.render(
- feed(),
- document.getElementById('feed'));
+ ReactDOM.render(
+ email(),
+ document.getElementById('email'));
+} else if (pathName == '/yhdistys.html') {
+ ReactDOM.render(
+ membershipForm(),
+ document.getElementById('membership-form'));
-ReactDOM.render(
- email(),
- document.getElementById('email'));
+ ReactDOM.render(
+ fader(),
+ document.getElementById('fader'));
+
+ ReactDOM.render(
+ email(),
+ document.getElementById('email'));
+}
diff --git a/src/styles/style.styl b/src/styles/style.styl
index a5d23e1..8228f2d 100644
--- a/src/styles/style.styl
+++ b/src/styles/style.styl
@@ -147,6 +147,13 @@ section:first-child
width 28px
height 28px
+.membership-form
+ .input
+ margin 8px 0px
+ .btn
+ margin-top 12px
+ color rgba(255, 255, 255, 0.9)
+
@keyframes drop
0%
transform rotateX(90deg)
diff --git a/src/yhdistys.jade b/src/yhdistys.jade
new file mode 100644
index 0000000..79d1096
--- /dev/null
+++ b/src/yhdistys.jade
@@ -0,0 +1,105 @@
+doctype html
+html
+ head
+ title Yhdistys
+ // inject:css
+ // endinject
+ meta(name='description', content='Koodiklinikka on suomalainen Slack-yhteisö ohjelmistoalan harrastajille ja ammattilaisille.')
+ meta(name='keywords', content='ohjelmointi,frontend,open source,devaus,suomi,javascript,clojure,go,java,node.js,io.js,angular.js,web')
+ meta(charset='utf-8')
+ meta(name='viewport', content='width=device-width, initial-scale=1')
+ meta(name='apple-mobile-web-app-capable', content='yes')
+
+ script.
+ if(location.hostname === 'koodiklinikka.fi' && location.protocol !== 'https:') {
+ location.protocol = 'https';
+ }
+ link(rel='apple-touch-icon', sizes='57x57', href='icons/apple-touch-icon-57x57.png')
+ link(rel='apple-touch-icon', sizes='114x114', href='icons/apple-touch-icon-114x114.png')
+ link(rel='apple-touch-icon', sizes='72x72', href='icons/apple-touch-icon-72x72.png')
+ link(rel='apple-touch-icon', sizes='144x144', href='icons/apple-touch-icon-144x144.png')
+ link(rel='apple-touch-icon', sizes='60x60', href='icons/apple-touch-icon-60x60.png')
+ link(rel='apple-touch-icon', sizes='120x120', href='icons/apple-touch-icon-120x120.png')
+ link(rel='apple-touch-icon', sizes='76x76', href='icons/apple-touch-icon-76x76.png')
+ link(rel='apple-touch-icon', sizes='152x152', href='icons/apple-touch-icon-152x152.png')
+ link(rel='apple-touch-icon', sizes='180x180', href='icons/apple-touch-icon-180x180.png')
+ link(rel='icon', type='image/png', href='icons/favicon-192x192.png', sizes='192x192')
+ link(rel='icon', type='image/png', href='icons/favicon-160x160.png', sizes='160x160')
+ link(rel='icon', type='image/png', href='icons/favicon-96x96.png', sizes='96x96')
+ link(rel='icon', type='image/png', href='icons/favicon-16x16.png', sizes='16x16')
+ link(rel='icon', type='image/png', href='icons/favicon-32x32.png', sizes='32x32')
+ link(rel='shortcut icon', href='icons/favicon.ico')
+ link(rel='icon', href='icons/favicon.ico')
+ meta(name='msapplication-TileColor', content='#10558c')
+ meta(name='msapplication-TileImage', content='icons/mstile-144x144.png')
+ meta(property='og:image', content='images/logo.png')
+ script(src='//use.typekit.net/scb5xny.js')
+ script.
+ try{Typekit.load();}catch(e){};
+
+ body
+ .site
+ .container
+ .header
+ .header__container
+ .header__nav
+ a(href='/', target='_blank') Etusivu
+ .header__headline
+ .header__logo
+ h1.header__title Koodiklinikka ry
+
+ .content
+ section
+ .row
+ .bread
+ .column.column1-2
+ h3 Rekisteröity yhdistys
+ p.
+ Koodiklinikka on nyt myös ry! Tähän vois kirjottaa jotain kivoja juttuja
+ .column.column1-2
+ a(href='images/slack.png', target='_blank')
+ img(src='images/slack.png')
+ .row
+ .bread
+ .column.column1-2
+ h3 Liity jäseneksi
+ #membership-form.form
+ .column.column1-2
+ p.
+ Jäseneksi liittymällä saat jotain hienoja juttuja eli kannattaa liittyä
+
+ footer
+ .sponsors
+ .sponsors__label Yhteistyössä
+ a(href='http://futurice.com/', target='_blank')
+ img.sponsor.sponsor__futurice(src='images/futurice.svg')
+ a(href='http://www.metosin.fi/', target='_blank')
+ img.sponsor.sponsor__metosin(src='images/metosin.svg')
+ a(href='https://www.solita.fi/', target='_blank')
+ img.sponsor(src='images/solita.svg')
+ a(href='http://leonidasoy.fi/', target='_blank')
+ img.sponsor.sponsor__leonidas(src='images/leonidas.png')
+ a(href='https://www.nordea.com/', target='_blank')
+ img.sponsor.sponsor__nordea(src='images/nordea.png')
+
+ .contacts
+ div
+ a(href='https://koodiklinikka.slack.com')
+ i.fa.fa-slack
+
+ a(href='https://github.com/koodiklinikka/koodiklinikka.fi')
+ i.fa.fa-github
+
+ a(href='https://twitter.com/koodiklinikka')
+ i.fa.fa-twitter
+
+ a(href='https://www.linkedin.com/groups/12025476')
+ i.fa.fa-linkedin
+
+ a(href='https://www.facebook.com/koodiklinikka')
+ i.fa.fa-facebook
+ div#email
+
+ #fader
+ // inject:js
+ // endinject