1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-01-20 00:08:02 +01:00

Merge pull request #11 from Unleash/prompt_username

Show a dialog if the username cookie is not set.
This commit is contained in:
Ivar Conradi Østhus 2016-11-24 21:48:38 +01:00 committed by GitHub
commit 2493e1175d
6 changed files with 136 additions and 0 deletions

View File

@ -3,6 +3,8 @@ import { Layout, Panel, NavDrawer, AppBar } from 'react-toolbox';
import style from './styles.scss'; import style from './styles.scss';
import ErrorContainer from './error/error-container'; import ErrorContainer from './error/error-container';
import UserContainer from './user/user-container';
import Navigation from './nav'; import Navigation from './nav';
export default class App extends Component { export default class App extends Component {
@ -28,6 +30,7 @@ export default class App extends Component {
</NavDrawer> </NavDrawer>
<Panel scrollY> <Panel scrollY>
<div style={{ padding: '1.8rem' }}> <div style={{ padding: '1.8rem' }}>
<UserContainer />
{this.props.children} {this.props.children}
</div> </div>
</Panel> </Panel>

View File

@ -0,0 +1,48 @@
import React, { PropTypes } from 'react';
import Dialog from 'react-toolbox/lib/dialog';
import Input from 'react-toolbox/lib/input';
class ErrorComponent extends React.Component {
static propTypes () {
return {
user: PropTypes.object.isRequired,
updateUserName: PropTypes.func.isRequired,
};
}
handleSubmit = (evt) => {
evt.preventDefault();
this.props.save();
}
render () {
const actions = [
{ label: 'Save', onClick: this.props.save },
];
return (
<Dialog
active={this.props.user.showDialog}
title="Action required"
actions={actions}
>
<p>
You hav to specify a username to use Unleash. This will allow us to track changes.
</p>
<form onSubmit={this.handleSubmit}>
<Input
type="text"
label="USERNAME"
name="username"
required
value={this.props.user.userName}
onChange={(v) => this.props.updateUserName(v)}
/>
</form>
</Dialog>
);
}
}
export default ErrorComponent;

View File

@ -0,0 +1,15 @@
import { connect } from 'react-redux';
import UserComponent from './user-component';
import { updateUserName, save } from '../../store/user/actions';
const mapDispatchToProps = {
updateUserName,
save,
};
const mapStateToProps = (state) => ({
user: state.user.toJS(),
});
export default connect(mapStateToProps, mapDispatchToProps)(UserComponent);

View File

@ -10,6 +10,7 @@ import metrics from './metrics-store';
import clientStrategies from './client-strategy-store'; import clientStrategies from './client-strategy-store';
import clientInstances from './client-instance-store'; import clientInstances from './client-instance-store';
import settings from './settings'; import settings from './settings';
import user from './user';
const unleashStore = combineReducers({ const unleashStore = combineReducers({
features, features,
@ -23,6 +24,7 @@ const unleashStore = combineReducers({
clientStrategies, clientStrategies,
clientInstances, clientInstances,
settings, settings,
user,
}); });
export default unleashStore; export default unleashStore;

View File

@ -0,0 +1,11 @@
export const USER_UPDATE_USERNAME = 'USER_UPDATE_USERNAME';
export const USER_SAVE = 'USER_SAVE';
export const updateUserName = (value) => ({
type: USER_UPDATE_USERNAME,
value,
});
export const save = () => ({
type: USER_SAVE,
});

View File

@ -0,0 +1,57 @@
import { Map as $Map } from 'immutable';
import { USER_UPDATE_USERNAME, USER_SAVE } from './actions';
const COOKIE_NAME = 'username';
// Ref: http://stackoverflow.com/questions/10730362/get-cookie-by-name
function readCookie () {
const nameEQ = `${COOKIE_NAME}=`;
const ca = document.cookie.split(';');
for (let i = 0;i < ca.length;i++) {
let c = ca[i];
while (c.charAt(0) == ' ') { // eslint-disable-line eqeqeq
c = c.substring(1, c.length);
}
if (c.indexOf(nameEQ) === 0) {
return c.substring(nameEQ.length, c.length);
}
}
}
function writeCookie (userName) {
document.cookie = `${COOKIE_NAME}=${userName}; expires=Thu, 18 Dec 2099 12:00:00 UTC`;
}
function getInitState () {
const userName = readCookie(COOKIE_NAME);
const showDialog = !userName;
return new $Map({ userName, showDialog });
}
function updateUserName (state, action) {
return state.set('userName', action.value);
}
function save (state) {
const userName = state.get('userName');
if (userName) {
writeCookie(userName);
return state.set('showDialog', false);
} else {
return state;
}
}
const settingStore = (state = getInitState(), action) => {
switch (action.type) {
case USER_UPDATE_USERNAME:
return updateUserName(state, action);
case USER_SAVE:
return save(state);
default:
return state;
}
};
export default settingStore;