Merge branch 'develop' into feature/react-intl

* develop:
  Fix 'M' issue in Firefox
  Widen modal to account for tooltip overflow
  Name Registration component
  Refresh session, close popup after registration
  Add standalone legacy registration iframe

# Conflicts:
#	server/proxies.json
#	src/components/navigation/navigation.jsx
This commit is contained in:
Matthew Taylor 2015-10-16 11:14:45 -04:00
commit 997b94a91c
7 changed files with 85 additions and 22 deletions

View file

@ -2,12 +2,12 @@
{ {
"root": "/", "root": "/",
"paths": [ "paths": [
"/accounts/",
"/accounts/", "/accounts/",
"/csrf_token/", "/csrf_token/",
"/fragment/",
"/get_image/", "/get_image/",
"/session/", "/session/",
"/site-api/" "/static/"
] ]
} }
] ]

19
src/_mixins.scss Normal file
View file

@ -0,0 +1,19 @@
@mixin modal-iframe($iframe-width, $iframe-height, $padding: 0) {
&.ReactModal__Content {
top: 50%;
right: auto;
bottom: auto;
left: 50%;
margin-top: -($iframe-height + $padding * 2)/2;
margin-left: -($iframe-width + $padding * 2)/2;
padding: $padding;
width: $iframe-width;
height: $iframe-height;
iframe {
border: 0;
width: $iframe-width;
height: $iframe-height;
}
}
}

View file

@ -1,4 +1,5 @@
@import "../../colors"; @import "../../colors";
@import "../../mixins";
.intro { .intro {
display: flex; display: flex;
@ -224,22 +225,5 @@
} }
.video-modal { .video-modal {
$video-width: 570px; @include modal-iframe(570px, 357px, 15px);
$video-height: 357px;
$padding: 15px;
top: 50%;
right: auto;
bottom: auto;
left: 50%;
margin-top: -($video-height + $padding * 2)/2;
margin-left: -($video-width + $padding * 2)/2;
padding: $padding;
width: $video-width;
height: $video-height;
iframe {
border: 0;
width: $video-width;
height: $video-height;
}
} }

View file

@ -12,6 +12,7 @@ var Dropdown = require('./dropdown.jsx');
var Input = require('../forms/input.jsx'); var Input = require('../forms/input.jsx');
var log = require('../../lib/log.js'); var log = require('../../lib/log.js');
var Login = require('../login/login.jsx'); var Login = require('../login/login.jsx');
var Registration = require('../registration/registration.jsx');
var Session = require('../../mixins/session.jsx'); var Session = require('../../mixins/session.jsx');
require('./navigation.scss'); require('./navigation.scss');
@ -35,9 +36,10 @@ var Navigation = React.createClass({
], ],
getInitialState: function () { getInitialState: function () {
return { return {
'accountNavOpen': false,
'loginOpen': false, 'loginOpen': false,
'loginError': null, 'loginError': null,
'accountNavOpen': false 'registrationOpen': false
}; };
}, },
componentDidUpdate: function (prevProps, prevState) { componentDidUpdate: function (prevProps, prevState) {
@ -52,6 +54,10 @@ var Navigation = React.createClass({
if (!this.state.session.user) return; if (!this.state.session.user) return;
return '/users/' + this.state.session.user.username + '/'; return '/users/' + this.state.session.user.username + '/';
}, },
handleJoinClick: function (e) {
e.preventDefault();
this.setState({'registrationOpen': true});
},
handleLoginClick: function (e) { handleLoginClick: function (e) {
e.preventDefault(); e.preventDefault();
this.setState({'loginOpen': !this.state.loginOpen}); this.setState({'loginOpen': !this.state.loginOpen});
@ -100,6 +106,13 @@ var Navigation = React.createClass({
closeAccountNav: function () { closeAccountNav: function () {
this.setState({'accountNavOpen': false}); this.setState({'accountNavOpen': false});
}, },
closeRegistration: function () {
this.setState({'registrationOpen': false});
},
completeRegistration: function () {
window.refreshSession();
this.closeRegistration();
},
render: function () { render: function () {
var classes = classNames({ var classes = classNames({
'inner': true, 'inner': true,
@ -198,6 +211,11 @@ var Navigation = React.createClass({
id='general.joinScratch' id='general.joinScratch'
defaultMessage={'Join Scratch'} /> defaultMessage={'Join Scratch'} />
</a></li>, </a></li>,
<Registration
key="registration"
isOpen={this.state.registrationOpen}
onRequestClose={this.closeRegistration}
onRegistrationDone={this.completeRegistration} />,
<li className="link right login-item" key="login"> <li className="link right login-item" key="login">
<a <a
href="#" href="#"

View file

@ -155,7 +155,7 @@
padding-left: 10px; padding-left: 10px;
width: 30px; width: 30px;
overflow: hidden; overflow: hidden;
text-indent: 100%; text-indent: 50px;
white-space: nowrap; white-space: nowrap;
} }

View file

@ -0,0 +1,36 @@
var React = require('react');
var Modal = require('../modal/modal.jsx');
require('./registration.scss');
Modal.setAppElement(document.getElementById('view'));
var Registration = React.createClass({
propTypes: {
isOpen: React.PropTypes.bool,
onRegistrationDone: React.PropTypes.func,
onRequestClose: React.PropTypes.func
},
onMessage: function (e) {
if (e.origin != window.location.origin) return;
if (e.data == 'registration-done') this.props.onRegistrationDone();
},
componentDidMount: function () {
window.addEventListener('message', this.onMessage);
},
componentWillUnmount: function () {
window.removeEventListener('message', this.onMessage);
},
render: function () {
return (
<Modal
isOpen={this.props.isOpen}
onRequestClose={this.props.onRequestClose}
className="registration">
<iframe src="/accounts/standalone-registration/" />
</Modal>
);
}
});
module.exports = Registration;

View file

@ -0,0 +1,6 @@
@import "../../mixins";
.registration {
@include modal-iframe(610px, 438px);
overflow: hidden;
}