Advertisement
Guest User

Untitled

a guest
Jan 17th, 2017
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { Component, React, KeyValuePair } from 'chen-react';
  2. import { IRouter } from 'react-router';
  3. import { Spinner, ProfilePic, PreviewFile, LinkPreview } from '../pipes';
  4.  
  5. import { ProfileLink } from './popover';
  6. import { Content } from './content';
  7.  
  8. import * as moment from 'moment';
  9.  
  10. export interface ChatListProps {
  11.   router? : IRouter;
  12.   messages? : KeyValuePair<any>[];
  13.   onScrolledTop? : Function;
  14.   isLoadingMessages? : boolean;
  15.   onFileClick? : (file: KeyValuePair<any>) => void;
  16.   user: KeyValuePair<any>;
  17. }
  18.  
  19. export interface ChatListState {}
  20.  
  21. export class ChatList extends Component <ChatListProps, ChatListState> {
  22.  
  23.   private container;
  24.  
  25.   public handleScrolling(event: JQueryEventObject, pos) {
  26.     if (pos < 1) {
  27.       this.props.onScrolledTop(this.props.messages[0]);
  28.     }
  29.   }
  30.  
  31.   public componentDidMount() {
  32.     $(this.container).slimScroll({
  33.       height: `${$('#chat-preview').offset().top - $(this.container).offset().top - 10}px`,
  34.       distance: '3px',
  35.       size: '3px',
  36.       start: 'bottom',
  37.       touchScrollStep: 50,
  38.       railVisible: false
  39.     }).bind('slimscrolling', this.handleScrolling.bind(this));
  40.  
  41.   }
  42.  
  43.   public componentWillUnmount() {
  44.     $(this.container).unbind('slimscrolling');
  45.   }
  46.  
  47.   public scrollToBottom() {
  48.     this.resize();
  49.     $(this.container).slimScroll({
  50.       scrollTo: $(this.container)[0].scrollHeight + 'px',
  51.     });
  52.   }
  53.  
  54.   public resize() {
  55.     $(this.container).slimScroll({
  56.       height: `${$('#chat-preview').offset().top - $(this.container).offset().top - 10}px`
  57.     });
  58.   }
  59.  
  60.   public componentDidUpdate(prevProps: ChatListProps, prevState: ChatListState) {
  61.     if (this.props.messages.length && prevProps.messages != this.props.messages
  62.       && (!prevProps.messages.length || prevProps.messages[0]['id'] == this.props.messages[0]['id'])) {
  63.       this.scrollToBottom();
  64.     }
  65.   }
  66.  
  67.   public render() {
  68.     let messages = [];
  69.     if (this.props.messages) {
  70.       let lastDay = null;
  71.       messages = this.props.messages.map((message, i) => {
  72.         let name = '';
  73.  
  74.         if (message['user']['firstName']) {
  75.           name = message['user']['firstName'];
  76.         }
  77.  
  78.         if (message['user']['lastName']) {
  79.           name += ` ${message['user']['lastName']}`;
  80.         }
  81.  
  82.         let file;
  83.         if (message['file']) {
  84.           file = (
  85.             <div className="chat-file-preview">
  86.               <PreviewFile file={message['file']} onClick={e => {e.preventDefault(); this.props.onFileClick(message['file']) }}/>
  87.             </div>
  88.           )
  89.         }
  90.  
  91.         let pipe = null;
  92.         let day = moment(message['createdAt']).calendar(null,  {
  93.           sameDay: '[Today]',
  94.           nextDay: '[Tomorrow]',
  95.           nextWeek: 'dddd',
  96.           lastDay: '[Yesterday]',
  97.           lastWeek: '[Last] dddd',
  98.           sameElse: 'DD/MM/YYYY'
  99.         });
  100.  
  101.         if (day != lastDay) {
  102.           lastDay = day;
  103.           pipe = <div className="vr-date text-center">
  104.             <hr/>
  105.             <span>{day}</span>
  106.           </div>;
  107.         }
  108.  
  109.         return <li key={message['id']} className={(!message['createdAt'] ? 'pending': '')}>
  110.           {pipe ? pipe : ''}
  111.           <div className="chat-user-photo">
  112.             <ProfilePic user={message['user']} size="small" />
  113.           </div>
  114.           <div className="chat-user-content clearfix">
  115.             <div className="chat-user-bubble">
  116.               <h5>
  117.                 <ProfileLink user={message['user']} isOwn={message['userId'] == this.props.user['id']} router={this.props.router}>
  118.                   {name}
  119.                   <span>@{message['user']['username']}</span>
  120.                 </ProfileLink>
  121.               </h5>
  122.               <Content user={this.props.user} data={message['content']} router={this.props.router} mentions={message['mentions']} />
  123.               <LinkPreview link={message['link']} singleColumn={true} />
  124.               {file}
  125.             </div>
  126.              <small>{moment(message['createdAt']).fromNow()}</small>
  127.           </div>
  128.         </li>
  129.       });
  130.     }
  131.  
  132.     if (!messages.length && !this.props.isLoadingMessages) {
  133.       messages = [<li key={0} className="text-center">No message found.</li>]
  134.     }
  135.  
  136.     if (this.props.isLoadingMessages) {
  137.       messages.unshift(<li key={0}><Spinner /></li>);
  138.     }
  139.  
  140.     return (
  141.       <div ref={ref => this.container = ref} className="user-chat-list scroll-chat-list">
  142.  
  143.         <ul>
  144.         {messages}
  145.         </ul>
  146.       </div>
  147.     );
  148.   }
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement