client/src/components/SessionForm.js
author ymh <ymh.work@gmail.com>
Tue, 01 Aug 2017 12:20:14 +0200
changeset 132 906a6c7c7943
parent 129 d48946d164c6
child 133 6f3078f7fd47
permissions -rw-r--r--
add group to sync + create groups + various component cleaning
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     1
import React, { Component } from 'react';
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     2
import { connect } from 'react-redux';
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     3
import { bindActionCreators } from 'redux';
132
906a6c7c7943 add group to sync + create groups + various component cleaning
ymh <ymh.work@gmail.com>
parents: 129
diff changeset
     4
import { Panel, FormGroup, ControlLabel, FormControl } from 'react-bootstrap';
906a6c7c7943 add group to sync + create groups + various component cleaning
ymh <ymh.work@gmail.com>
parents: 129
diff changeset
     5
import GroupForm from './GroupForm';
46
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     6
import '../App.css';
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     7
import * as sessionsActions from '../actions/sessionsActions';
100
6fd752d98933 Introduce group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 46
diff changeset
     8
import * as authActions from '../actions/authActions';
46
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     9
import _ from 'lodash';
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    10
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    11
class SessionForm extends Component {
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    12
100
6fd752d98933 Introduce group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 46
diff changeset
    13
  state = {
6fd752d98933 Introduce group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 46
diff changeset
    14
    createGroup: false
6fd752d98933 Introduce group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 46
diff changeset
    15
  }
6fd752d98933 Introduce group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 46
diff changeset
    16
46
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    17
  onChange = (e) => {
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    18
    const { name, value } = e.target;
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    19
    const changes = { [name]: value }
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    20
    this.onChangeThrottle(changes);
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    21
  }
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    22
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    23
  onChangeThrottle = _.debounce((changes) => {
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    24
    this.props.sessionsActions.updateSession(this.props.currentSession, changes);
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    25
  }, 750)
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    26
101
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    27
  onGroupChange = (e) => {
132
906a6c7c7943 add group to sync + create groups + various component cleaning
ymh <ymh.work@gmail.com>
parents: 129
diff changeset
    28
    const groupName = e.target.value;
101
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    29
132
906a6c7c7943 add group to sync + create groups + various component cleaning
ymh <ymh.work@gmail.com>
parents: 129
diff changeset
    30
    this.props.sessionsActions.updateSession(this.props.currentSession, { group: groupName });
101
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    31
  }
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    32
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    33
  componentWillUpdate = (nextProps, nextState) => {
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    34
    if (nextState.createGroup && nextProps.createGroup.get('success')) {
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    35
      this.setState({ createGroup: false })
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    36
    }
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    37
  }
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    38
46
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    39
  render() {
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    40
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    41
    if (!this.props.currentSession) {
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    42
      return (
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    43
        <form></form>
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    44
      )
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    45
    }
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    46
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    47
    return (
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    48
      <Panel>
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    49
        <form onSubmit={ e => { e.preventDefault() } }>
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    50
          <FormGroup>
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    51
            <ControlLabel>Title</ControlLabel>
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    52
            <FormControl
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    53
              name="title"
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    54
              defaultValue={ this.props.currentSession.title }
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    55
              onChange={ this.onChange }
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    56
              type="text"
101
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    57
              placeholder="Enter a title"
46
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    58
            />
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    59
          </FormGroup>
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    60
          <FormGroup>
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    61
            <ControlLabel>Description</ControlLabel>
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    62
            <FormControl
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    63
              name="description"
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    64
              componentClass="textarea"
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    65
              defaultValue={ this.props.currentSession.description }
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    66
              onChange={ this.onChange }
101
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    67
              placeholder="Enter a description"
46
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    68
            />
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    69
          </FormGroup>
100
6fd752d98933 Introduce group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 46
diff changeset
    70
          <FormGroup>
101
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    71
            <ControlLabel>Group</ControlLabel>
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    72
            <FormControl
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    73
              name="group"
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    74
              componentClass="select"
132
906a6c7c7943 add group to sync + create groups + various component cleaning
ymh <ymh.work@gmail.com>
parents: 129
diff changeset
    75
              value={ this.props.group ? this.props.group.get('name') : '' }
906a6c7c7943 add group to sync + create groups + various component cleaning
ymh <ymh.work@gmail.com>
parents: 129
diff changeset
    76
              onChange={ this.onGroupChange }>
101
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    77
              { this.props.groups.map((group, key) =>
132
906a6c7c7943 add group to sync + create groups + various component cleaning
ymh <ymh.work@gmail.com>
parents: 129
diff changeset
    78
                <option key={ key } value={ group.get('name') }>{ group.get('name') }</option>
101
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    79
              ) }
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    80
            </FormControl>
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    81
          </FormGroup>
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    82
          <FormGroup>
132
906a6c7c7943 add group to sync + create groups + various component cleaning
ymh <ymh.work@gmail.com>
parents: 129
diff changeset
    83
            <GroupForm session={this.props.session} />
100
6fd752d98933 Introduce group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 46
diff changeset
    84
          </FormGroup>
46
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    85
        </form>
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    86
      </Panel>
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    87
    );
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    88
  }
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    89
}
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    90
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    91
function mapStateToProps(state, props) {
101
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    92
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    93
  let group;
132
906a6c7c7943 add group to sync + create groups + various component cleaning
ymh <ymh.work@gmail.com>
parents: 129
diff changeset
    94
  if (props.session && props.session.get('group')) {
906a6c7c7943 add group to sync + create groups + various component cleaning
ymh <ymh.work@gmail.com>
parents: 129
diff changeset
    95
    group = state.get('groups').find(group => props.session.get('group') === group.get('name'))
101
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    96
  }
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
    97
46
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    98
  return {
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    99
    currentSession: props.session,
129
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
   100
    createGroup: state.get('createGroup'),
d48946d164c6 Add a first version of synchronisation
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
   101
    groups: state.get('groups'),
101
e165aa89ac82 Add group dropdown, update session after group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 100
diff changeset
   102
    group
46
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   103
  };
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   104
}
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   105
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   106
function mapDispatchToProps(dispatch) {
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   107
  return {
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   108
    sessionsActions: bindActionCreators(sessionsActions, dispatch),
100
6fd752d98933 Introduce group creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 46
diff changeset
   109
    authActions: bindActionCreators(authActions, dispatch),
46
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   110
  }
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   111
}
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   112
4aa24724e5b3 Move session form to dedicated component.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   113
export default connect(mapStateToProps, mapDispatchToProps)(SessionForm);