forked from shakacode/react-webpack-rails-tutorial
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCommentBox.jsx
121 lines (110 loc) · 3.79 KB
/
CommentBox.jsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import React from 'react';
import PropTypes from 'prop-types';
import Immutable from 'immutable';
import ActionCable from 'actioncable';
import _ from 'lodash';
import BaseComponent from 'libs/components/BaseComponent';
import { injectIntl, intlShape } from 'react-intl';
import SelectLanguage from 'libs/i18n/selectLanguage';
import { defaultMessages, defaultLocale } from 'libs/i18n/default';
import CommentForm from './CommentForm/CommentForm';
import CommentList, { CommentPropTypes } from './CommentList/CommentList';
import css from './CommentBox.scss';
class CommentBox extends BaseComponent {
static propTypes = {
pollInterval: PropTypes.number.isRequired,
actions: PropTypes.shape({
fetchComments: PropTypes.function,
}),
data: PropTypes.shape({
isFetching: PropTypes.boolean,
isSaving: PropTypes.boolean,
submitCommentError: PropTypes.string,
$$comments: PropTypes.arrayOf(CommentPropTypes),
}).isRequired,
intl: intlShape.isRequired,
};
constructor() {
super();
_.bindAll(this, [
'refreshComments',
]);
this.cable = null;
}
subscribeChannel() {
const { messageReceived } = this.props.actions;
const protocol = window.location.protocol === 'https:' ? 'wss://' : 'ws://';
const cableUrl = `${protocol}${window.location.hostname}:${window.location.port}/cable`;
this.cable = ActionCable.createConsumer(cableUrl);
/* eslint no-console: ["error", { allow: ["log"] }] */
this.cable.subscriptions.create({ channel: 'CommentsChannel' }, {
connected: () => {
console.log('connected');
},
disconnected: () => {
console.log('disconnected');
},
received: (comment) => {
messageReceived(Immutable.fromJS(comment));
},
});
}
componentDidMount() {
const { fetchComments } = this.props.actions;
fetchComments();
this.subscribeChannel();
}
componentWillUnmount() {
this.cable.subscriptions.remove({ channel: 'CommentsChannel' });
}
refreshComments() {
const { fetchComments } = this.props.actions;
fetchComments();
}
render() {
const { actions, data, intl } = this.props;
const { formatMessage } = intl;
const cssTransitionGroupClassNames = {
enter: css.elementEnter,
enterActive: css.elementEnterActive,
leave: css.elementLeave,
leaveActive: css.elementLeaveActive,
};
const locale = data.get('locale') || defaultLocale;
/* eslint-disable no-script-url */
return (
<div className="commentBox container">
<h2>
{formatMessage(defaultMessages.comments)}
{data.get('isFetching') && formatMessage(defaultMessages.loading)}
</h2>
{ SelectLanguage(actions.setLocale, locale) }
<ul>
<li>
{ (data.get('isFetching') && <br />) ||
<button className={css.anchorButton} onClick={this.refreshComments} >
{formatMessage(defaultMessages.descriptionForceRefrech)}
</button>
}
</li>
<li>{formatMessage(defaultMessages.descriptionSupportMarkdown)}</li>
<li>{formatMessage(defaultMessages.descriptionDeleteRule)}</li>
<li>{formatMessage(defaultMessages.descriptionSubmitRule)}</li>
<li>{formatMessage(defaultMessages.descriptionSeeActionCable)}</li>
</ul>
<CommentForm
isSaving={data.get('isSaving')}
error={data.get('submitCommentError')}
actions={actions}
cssTransitionGroupClassNames={cssTransitionGroupClassNames}
/>
<CommentList
$$comments={data.get('$$comments')}
error={data.get('fetchCommentError')}
cssTransitionGroupClassNames={cssTransitionGroupClassNames}
/>
</div>
);
}
}
export default injectIntl(CommentBox);