11import React , { PropTypes } from 'react'
22import ProfileImage from '../../../components/ProfileImage'
3- import { createTeam } from '../api'
3+ import { searchUser , createTeam , setMember , deleteMember } from '../api'
44import linkState from '../../../helpers/linkState'
5+ import Select from 'react-select'
6+
7+ function getUsers ( input , cb ) {
8+ searchUser ( input )
9+ . then ( function ( res ) {
10+ let users = res . body
11+
12+ cb ( null , {
13+ options : users . map ( user => {
14+ return { value : user . name , label : user . name }
15+ } ) ,
16+ complete : false
17+ } )
18+ } )
19+ . catch ( function ( err ) {
20+ console . error ( err )
21+ } )
22+ }
523
624export default class CreateNewTeam extends React . Component {
725 constructor ( props ) {
@@ -12,16 +30,12 @@ export default class CreateNewTeam extends React.Component {
1230 alert : null
1331 } ,
1432 select : {
15- team : { "name" :"test123" ,
16- "profileName" :"test123" ,
17- "userType" :"team" ,
18- "updatedAt" :"2015-10-11T09:01:01.277Z" ,
19- "createdAt" :"2015-10-11T09:01:01.277Z" ,
20- "id" :220 , "Members" :[ { "id" :213 , "email" :"fluke8259@gmail.com" , "name" :"rokt33r" , "profileName" :"Rokt33r" , "userType" :"person" , "createdAt" :"2015-10-05T09:01:30.000Z" , "updatedAt" :"2015-10-05T09:01:30.000Z" , "_pivot_TeamId" :220 , "_pivot_MemberId" :213 , "_pivot_role" :"owner" } ]
21- } ,
33+ team : null ,
34+ newMember : null ,
2235 alert : null
2336 } ,
24- currentTab : 'select'
37+ currentTab : 'create' ,
38+ currentUser : JSON . parse ( localStorage . getItem ( 'currentUser' ) )
2539 }
2640 }
2741
@@ -56,13 +70,13 @@ export default class CreateNewTeam extends React.Component {
5670 }
5771
5872 function onError ( err ) {
59- let errorMessage = err . response != null ? err . response . body . message : err . message
73+ let errorMessage = err . response != null ? err . response . body . message : 'Can\'t connect to API server.'
6074
6175 let createState = this . state . create
6276 createState . isSending = false
6377 createState . alert = {
6478 type : 'error' ,
65- message : 'Can\'t connect to API server.'
79+ message : errorMessage
6680 }
6781
6882 this . setState ( {
@@ -91,24 +105,112 @@ export default class CreateNewTeam extends React.Component {
91105 </ div >
92106 )
93107 }
108+ handleNewMemberChange ( value ) {
109+ let selectState = this . state . select
110+ selectState . newMember = value
111+ this . setState ( { select : selectState } )
112+ }
113+
114+ handleClickAddMemberButton ( e ) {
115+ let selectState = this . state . select
116+ let input = {
117+ name : selectState . newMember ,
118+ role : 'member'
119+ }
120+
121+ setMember ( selectState . team . id , input )
122+ . then ( res => {
123+ let selectState = this . state . select
124+ let team = res . body
125+ team . Members = team . Members . sort ( ( a , b ) => {
126+ return new Date ( a . _pivot_createdAt ) - new Date ( b . _pivot_createdAt )
127+ } )
128+ selectState . team = team
129+ selectState . newMember = ''
130+
131+ this . setState ( { select : selectState } )
132+ } )
133+ . catch ( err => {
134+ if ( err . status != null ) throw err
135+ else console . error ( err )
136+ } )
137+ }
138+
139+ handleMemberDeleteButtonClick ( name ) {
140+ let selectState = this . state . select
141+ let input = {
142+ name : name ,
143+ role : 'member'
144+ }
145+
146+ return function ( e ) {
147+ deleteMember ( selectState . team . id , input )
148+ . then ( res => {
149+ let selectState = this . state . select
150+ let team = res . body
151+ team . Members = team . Members . sort ( ( a , b ) => {
152+ return new Date ( a . _pivot_createdAt ) - new Date ( b . _pivot_createdAt )
153+ } )
154+ selectState . team = team
155+ selectState . newMember = ''
156+
157+ this . setState ( { select : selectState } )
158+ } )
159+ . catch ( err => {
160+ console . log ( err , err . response )
161+ if ( err . status != null ) throw err
162+ else console . error ( err )
163+ } )
164+ } . bind ( this )
165+ }
166+
167+ handleMemberRoleChange ( name ) {
168+ return function ( e ) {
169+ let selectState = this . state . select
170+ let input = {
171+ name : name ,
172+ role : e . target . value
173+ }
174+
175+ setMember ( selectState . team . id , input )
176+ . then ( res => {
177+ let selectState = this . state . select
178+ let team = res . body
179+ team . Members = team . Members . sort ( ( a , b ) => {
180+ return new Date ( a . _pivot_createdAt ) - new Date ( b . _pivot_createdAt )
181+ } )
182+ selectState . team = team
183+ selectState . newMember = ''
184+
185+ this . setState ( { select : selectState } )
186+ } )
187+ . catch ( err => {
188+ if ( err . status != null ) throw err
189+ else console . error ( err )
190+ } )
191+ } . bind ( this )
192+ }
94193
95194 renderSelectTab ( ) {
96195 let selectState = this . state . select
97- console . log ( selectState )
196+
98197 let membersEl = selectState . team . Members . map ( member => {
198+ let isCurrentUser = this . state . currentUser . id === member . id
199+
99200 return (
100201 < li key = { 'user-' + member . id } >
101202 < ProfileImage className = 'userPhoto' email = { member . email } size = '30' />
102203 < div className = 'userInfo' >
103204 < div className = 'userName' > { `${ member . profileName } (${ member . name } )` } </ div >
104205 < div className = 'userEmail' > { member . email } </ div >
105206 </ div >
207+
106208 < div className = 'userControl' >
107- < select value = { member . _pivot_role } className = 'userRole' >
209+ < select onChange = { e => this . handleMemberRoleChange ( member . name ) ( e ) } disabled = { isCurrentUser } value = { member . _pivot_role } className = 'userRole' >
108210 < option value = 'owner' > Owner</ option >
109211 < option value = 'member' > Member</ option >
110212 </ select >
111- < button > < i className = 'fa fa-times fa-fw' /> </ button >
213+ < button onClick = { e => this . handleMemberDeleteButtonClick ( member . name ) ( e ) } disabled = { isCurrentUser } > < i className = 'fa fa-times fa-fw' /> </ button >
112214 </ div >
113215 </ li >
114216 )
@@ -117,9 +219,15 @@ export default class CreateNewTeam extends React.Component {
117219 return (
118220 < div className = 'selectTab' >
119221 < div className = 'title' > Select member</ div >
120- < div className = 'ipt' >
121- < input type = 'text' placeholder = 'Enter user name or e-mail' />
122- < button > add</ button >
222+ < div className = 'memberForm' >
223+ < Select
224+ className = 'memberName'
225+ autoload = { false }
226+ asyncOptions = { getUsers }
227+ onChange = { val => this . handleNewMemberChange ( val ) }
228+ value = { selectState . newMember }
229+ />
230+ < button onClick = { e => this . handleClickAddMemberButton ( e ) } className = 'addMemberBtn' > add</ button >
123231 </ div >
124232 < ul className = 'memberList' >
125233 { membersEl }
0 commit comments