Skip to content

Commit 7f08ed8

Browse files
committed
Add livestream message support
1 parent 8fa299d commit 7f08ed8

File tree

17 files changed

+234
-31
lines changed

17 files changed

+234
-31
lines changed

dist/browser.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/browser.min.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/css/compactLayout.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/css/fullViewLayout.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/index.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/index.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/actions/clientActions.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import {
1+
import {
2+
CONNECTING,
23
CONNECT_SUCCESS,
34
CONNECT_FAIL,
45
DISCONNECT_SUCCESS,
@@ -40,8 +41,21 @@ const _connect = (client, userId, accessToken) => {
4041
});
4142
};
4243

44+
export const setConnected = (value = true) => {
45+
return dispatch => {
46+
dispatch({
47+
type: CONNECT_SUCCESS,
48+
payload: {}
49+
});
50+
}
51+
}
52+
4353
export const chConnect = (client, userId, accessToken) => {
4454
return dispatch => {
55+
dispatch({
56+
type: CONNECTING,
57+
payload: {}
58+
});
4559
return _connect(client, userId, accessToken)
4660
.then(response => connectSuccess(dispatch, response))
4761
.catch(error => connectFail(dispatch, error));

src/actions/messageActions.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import {
1212
LOAD_MORE_MESSAGES_SUCCESS,
1313
LOAD_MORE_MESSAGES_FAIL,
1414
SET_ACTIVE_CONVERSATION,
15-
SET_ACTIVE_USERID
15+
SET_ACTIVE_USERID,
16+
NEW_MESSAGE_RECEIVED_EVENT
1617
} from '../constants';
1718

1819
export const sendFileToConversation = (client, conversation, file, body, attachmentType) => {
@@ -155,4 +156,19 @@ export const setActiveUserId = (userId) => {
155156
payload: userId
156157
});
157158
};
158-
};
159+
};
160+
161+
export const registerConversationEventHandlers = (conversation) => {
162+
return dispatch => {
163+
if (!conversation.__isWatching) {
164+
return
165+
}
166+
167+
conversation.on('watcher.message.created', (response) => {
168+
dispatch({
169+
type: NEW_MESSAGE_RECEIVED_EVENT,
170+
payload: response
171+
});
172+
});
173+
}
174+
}

src/components/App.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import React, { PureComponent } from 'react';
22
import { connect } from 'react-redux';
33
import {
44
chConnect,
5-
registerEventHandlers
5+
registerEventHandlers,
6+
setConnected
67
} from "../actions";
78
import { IMAGES } from "../constants";
89
import { ChannelizeProvider } from '../context';
@@ -20,7 +21,12 @@ class App extends PureComponent {
2021

2122
componentDidMount() {
2223
const { client, userId, accessToken } = this.props;
23-
this.props.chConnect(client, userId, accessToken);
24+
if (!client.connected) {
25+
this.props.chConnect(client, userId, accessToken);
26+
return
27+
}
28+
29+
this.props.setConnected(true)
2430
}
2531

2632
componentDidUpdate(prevProps) {
@@ -55,7 +61,7 @@ const mapStateToProps = ({client}) => {
5561

5662
App = connect(
5763
mapStateToProps,
58-
{ chConnect, registerEventHandlers }
64+
{ chConnect, registerEventHandlers, setConnected }
5965
)(App);
6066

6167
export { App };

src/components/ConversationWindow.js

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React, { PureComponent } from 'react';
22
import { Header } from "./Header";
33
import { Loader } from "./Loader";
4-
import { MessagePreview } from "./MessagePreview";
4+
import { MessageSimple } from "./MessageSimple";
55
import { modifyConversation, modifyMessageList } from "../utils";
66
import { connect } from 'react-redux';
77
import { LANGUAGE_PHRASES, IMAGES } from "../constants";
@@ -12,10 +12,13 @@ import {
1212
sendMessageToUserId,
1313
sendFileToConversation,
1414
loadMoreMessages as loadMoreMessagesAction,
15-
setActiveConversation
15+
setActiveConversation,
16+
setActiveUserId,
17+
registerConversationEventHandlers
1618
} from '../actions';
1719
import moment from 'moment';
1820
import throttle from 'lodash/throttle';
21+
import PropTypes from 'prop-types';
1922

2023
class ConversationWindow extends PureComponent {
2124

@@ -163,8 +166,30 @@ class ConversationWindow extends PureComponent {
163166
}
164167

165168
_init = () => {
166-
const { client, conversation, userId } = this.props;
169+
const { client, conversation, userId, ownProps } = this.props;
170+
167171
if (!conversation && !userId) {
172+
// Handle ownProps
173+
if (Object.keys(ownProps).length) {
174+
if (ownProps.conversation) {
175+
let conversation = ownProps.conversation;
176+
177+
if (conversation.type != 'open' || conversation.__isWatching) {
178+
this.props.setActiveConversation(conversation);
179+
return;
180+
}
181+
182+
// Start watching open conversation
183+
conversation.startWatching((err, res) => {
184+
this.props.setActiveConversation(conversation);
185+
})
186+
return;
187+
}
188+
if (ownProps.userId) {
189+
this.props.setActiveUserId(ownProps.userId);
190+
return;
191+
}
192+
}
168193
return
169194
}
170195

@@ -198,6 +223,9 @@ class ConversationWindow extends PureComponent {
198223
return
199224
}
200225

226+
// Register conversation event handlers
227+
this.props.registerConversationEventHandlers(conversation);
228+
201229
// Load messages
202230
let messageListQuery = conversation.createMessageListQuery();
203231
messageListQuery.limit = this.limit;
@@ -303,7 +331,9 @@ class ConversationWindow extends PureComponent {
303331
showCloseIcon,
304332
showChevron,
305333
disableComposer,
306-
disableComposerMessage
334+
disableComposerMessage,
335+
Message,
336+
renderHeader
307337
} = this.props;
308338
const { text, dummyConversation } = this.state;
309339

@@ -349,10 +379,10 @@ class ConversationWindow extends PureComponent {
349379
}
350380

351381
const user = client.getCurrentUser();
352-
353382
return (
354383
<div id="ch_conv_window" className="ch-conv-window">
355-
{ conversation && <Header
384+
{ conversation && renderHeader && renderHeader(conversation) }
385+
{ conversation && !renderHeader && <Header
356386
profileImageUrl={headerImage}
357387
title={headerTitle}
358388
subtitle={headerSubtitle}
@@ -393,7 +423,7 @@ class ConversationWindow extends PureComponent {
393423

394424
{
395425
list.map(message => {
396-
return <MessagePreview key={message.id} message={message}/>
426+
return <Message key={message.id} message={message}/>
397427
})
398428
}
399429
</div>
@@ -439,8 +469,16 @@ class ConversationWindow extends PureComponent {
439469

440470
ConversationWindow = withChannelizeContext(ConversationWindow);
441471

442-
const mapStateToProps = ({message, client}) => {
443-
return {...message, ...client}
472+
ConversationWindow.propTypes = {
473+
Message: PropTypes.elementType,
474+
}
475+
476+
ConversationWindow.defaultProps = {
477+
Message: MessageSimple
478+
};
479+
480+
const mapStateToProps = ({message, client}, ownProps) => {
481+
return {...message, ...client, ownProps: ownProps}
444482
}
445483

446484
ConversationWindow = connect(
@@ -451,7 +489,10 @@ ConversationWindow = connect(
451489
sendMessageToUserId,
452490
sendFileToConversation,
453491
loadMoreMessagesAction,
454-
setActiveConversation }
492+
setActiveConversation,
493+
setActiveUserId,
494+
registerConversationEventHandlers
495+
}
455496
)(ConversationWindow);
456497

457498
export { ConversationWindow }

0 commit comments

Comments
 (0)