Created
October 22, 2016 19:33
-
-
Save bnhansn/9afb8edad0f1eaab8214cb1cb1a33cfb to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// @flow | |
import React, { Component } from 'react'; | |
import { connect } from 'react-redux'; | |
import { connectToChannel, leaveChannel, createMessage, loadOlderMessages } from '../../actions/room'; // add loadOlderMessages | |
import MessageList from '../../components/MessageList'; | |
import MessageForm from '../../components/MessageForm'; | |
import RoomNavbar from '../../components/RoomNavbar'; | |
import RoomSidebar from '../../components/RoomSidebar'; | |
type MessageType = { | |
id: number, | |
} | |
type Props = { | |
socket: any, | |
channel: any, | |
room: Object, | |
params: { | |
id: number, | |
}, | |
connectToChannel: () => void, | |
leaveChannel: () => void, | |
createMessage: () => void, | |
messages: Array<MessageType>, | |
presentUsers: Array, | |
currentUser: Object, | |
loadingOlderMessages: boolean, | |
pagination: { | |
total_pages: number, | |
total_entries: number, | |
page_size: number, | |
page_number: number, | |
}, | |
loadOlderMessages: () => void, | |
} | |
class Room extends Component { | |
componentDidMount() { | |
this.props.connectToChannel(this.props.socket, this.props.params.id); | |
} | |
componentWillReceiveProps(nextProps) { | |
if (nextProps.params.id !== this.props.params.id) { | |
this.props.leaveChannel(this.props.channel); | |
this.props.connectToChannel(nextProps.socket, nextProps.params.id); | |
} | |
if (!this.props.socket && nextProps.socket) { | |
this.props.connectToChannel(nextProps.socket, nextProps.params.id); | |
} | |
} | |
componentWillUnmount() { | |
this.props.leaveChannel(this.props.channel); | |
} | |
props: Props | |
// new function | |
handleLoadMore = () => | |
this.props.loadOlderMessages( | |
this.props.params.id, | |
{ last_seen_id: this.props.messages[0].id } | |
) | |
handleMessageCreate = (data) => { | |
this.props.createMessage(this.props.channel, data); | |
this.messageList.scrollToBottom(); // new line | |
} | |
render() { | |
const moreMessages = this.props.pagination.total_pages > this.props.pagination.page_number; // new line | |
return ( | |
<div style={{ display: 'flex', height: '100vh' }}> | |
<RoomSidebar | |
room={this.props.room} | |
currentUser={this.props.currentUser} | |
presentUsers={this.props.presentUsers} | |
/> | |
<div style={{ display: 'flex', flexDirection: 'column' }}> | |
<RoomNavbar room={this.props.room} /> | |
<MessageList // updated props | |
moreMessages={moreMessages} | |
messages={this.props.messages} | |
onLoadMore={this.handleLoadMore} | |
ref={(c) => { this.messageList = c; }} | |
loadingOlderMessages={this.props.loadingOlderMessages} | |
/> | |
<MessageForm onSubmit={this.handleMessageCreate} /> | |
</div> | |
</div> | |
); | |
} | |
} | |
export default connect( | |
state => ({ | |
room: state.room.currentRoom, | |
socket: state.session.socket, | |
channel: state.room.channel, | |
messages: state.room.messages, | |
presentUsers: state.room.presentUsers, | |
currentUser: state.session.currentUser, | |
pagination: state.room.pagination, // new line | |
loadingOlderMessages: state.room.loadingOlderMessages, // new line | |
}), | |
{ connectToChannel, leaveChannel, createMessage, loadOlderMessages } // add loadOlderMessages | |
)(Room); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment