Advertisement
pavelzx

Untitled

Feb 7th, 2019
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import React            from 'react'
  2. import { connect }      from 'react-redux'
  3. import { Link }         from 'react-router-dom'
  4. import ReactGravatar    from 'react-gravatar'
  5. import { push }         from 'react-router-redux'
  6. import { Dropdown, Icon, Label } from 'semantic-ui-react'
  7.  
  8. import Actions          from '../redux/actions/session'
  9. import CapActions       from '../redux/actions/cap'
  10.  
  11. class Cap extends React.Component {
  12.   _handleTreeClick(e) {
  13.     e.preventDefault()
  14.  
  15.     const { dispatch } = this.props
  16.     const { ownedTree, invitedTree } = this.props.tree
  17.  
  18.     if (ownedTree && ownedTree.length != 0 || invitedTree && invitedTree.length != 0) {
  19.       dispatch(CapActions.showTree(true))
  20.     } else {
  21.       dispatch(push('/'))
  22.     }
  23.   }
  24.  
  25.   _renderTree() {
  26.     const { dispatch, currentTree, socket, cap } = this.props
  27.  
  28.     if (!cap.showTree) return false
  29.  
  30.     const { ownedTree, invitedTree } = this.props.tree
  31.  
  32.     const ownedTreeItems = ownedTree.map((tree) => {
  33.       return this._createTreeItem(dispatch, currentTree, socket, tree)
  34.     })
  35.  
  36.     const ownedTreeItemsCap = ownedTreeItems.length > 0 ? <header className="title"><Icon name="user"/> Собственные деревья</header> : null
  37.  
  38.     const invitedTreeItems = invitedTree.map((tree) => {
  39.       return this._createTreeItem(dispatch, currentTree, socket, tree)
  40.     })
  41.  
  42.     const invitedTreeItemsCap = invitedTreeItems.length > 0 ? <header className="title"><Icon name="users"/> Другие деревья</header> : null
  43.  
  44.     return (
  45.       <Dropdown>
  46.         <Dropdown.Menu>
  47.           <Dropdown.Item> {ownedTreeItemsCap} </Dropdown.Item>
  48.           <Dropdown.Item> {ownedTreeItems} </Dropdown.Item>
  49.           <Dropdown.Item> {invitedTreeItemsCap} </Dropdown.Item>
  50.           <Dropdown.Item> {invitedTreeItems} </Dropdown.Item>
  51.           <Dropdown.Item as={Link} to="/"  onChange={::this._hideTree}> Показать все деревья </Dropdown.Item>
  52.         </Dropdown.Menu>
  53.       </Dropdown>
  54.     )
  55.   }
  56.  
  57.   _hideTree() {
  58.     const { dispatch } = this.props;
  59.     dispatch(CapActions.showTree(false))
  60.   }
  61.  
  62.   _createTreeItem(dispatch, currentTree, socket, tree) {
  63.     const onClick = (e) => {
  64.       e.preventDefault()
  65.  
  66.       if (currentTree.id != undefined && currentTree.id == tree.id) {
  67.         dispatch(CapActions.showTree(false))
  68.         return false
  69.       }
  70.  
  71.       dispatch(CapActions.visitTree(socket, currentTree.channel, tree.id));
  72.     }
  73.  
  74.     return (
  75.       <li key={tree.id}>
  76.         <Label as='a' href="#" onClick={onClick}>{tree.name}</Label>
  77.       </li>
  78.     )
  79.   }
  80.  
  81.   _renderCurrentUser() {
  82.     const { currentUser } = this.props
  83.  
  84.     if (!currentUser) {
  85.       return false
  86.     }
  87.  
  88.     const fullName = [currentUser.first_name, currentUser.last_name].join(' ')
  89.  
  90.     return (
  91.       <Label as='a'>
  92.         <ReactGravatar email={currentUser.email} true="true" /> {fullName}
  93.       </Label>
  94.     );
  95.   }
  96.  
  97.   _renderSignOutLink() {
  98.     if (!this.props.currentUser) {
  99.       return false
  100.     }
  101.  
  102.     return (
  103.       <Label as='a' href="#" onClick={::this._handleSignOutClick}><Icon name="sign out"/> Выйти</Label>
  104.     )
  105.   }
  106.  
  107.   _handleSignOutClick(e) {
  108.     e.preventDefault()
  109.  
  110.     this.props.dispatch(Actions.signOut())
  111.   }
  112.  
  113.   render() {
  114.     return (
  115.       <header>
  116.         <Grid columns={5} relaxed>
  117.           <Grid.Column>
  118.             <Segment basic>
  119.            
  120.             <Label as='a' href="#" onClick={::this._handleTreeClick}><Icon name="heartbeat"/> Деревья</Label>
  121.               {::this._renderTree()}
  122.             </Segment>
  123.           </Grid.Column>
  124.                    
  125.           <Grid.Column>
  126.             <Link to='/'>
  127.               <Image src='/images/logo.png' size='small' />
  128.             </Link>
  129.           </Grid.Column>
  130.           <Grid.Column>
  131.             <Segment basic>
  132.               {this._renderCurrentUser()}
  133.             </Segment>
  134.           </Grid.Column>
  135.           <Grid.Column>
  136.           <Segment basic>
  137.             {this._renderSignOutLink()}
  138.           </Segment>
  139.         </Grid.Column>
  140.       </Grid>
  141.     </header>
  142.     )
  143.   }
  144. }
  145.  
  146. const mapStateToProps = (state) => ({
  147.   currentUser: state.session.currentUser,
  148.   socket: state.session.socket,
  149.   tree: state.tree,
  150.   currentTree: state.currentTree,
  151.   cap: state.cap,
  152. })
  153.  
  154. export default connect(mapStateToProps)(Cap)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement