blob: 9bac66f60a8b21bdfced7b571721fe7c7dec7539 (
plain)
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
|
import React from 'react';
import PropTypes from 'prop-types';
import createDOMPurify from 'dompurify';
import { connect } from 'react-redux';
import { withRouter } from 'react-router-dom';
import { fetchSchedule } from '../../actions/view';
function cleanMeetingpointHTML(htmlStr) {
const DOMPurify = createDOMPurify(window);
return DOMPurify.sanitize(htmlStr, {
ADD_ATTR: ['rules'],
});
}
class View extends React.Component {
componentDidMount() {
if (!this.loadingFinished(this.props.user)) {
this.props.dispatch(fetchSchedule(this.props.user));
}
}
componentWillReceiveProps(nextProps) {
if (nextProps.user !== this.props.user && !this.loadingFinished(nextProps.user)) {
this.props.dispatch(fetchSchedule(nextProps.user));
}
}
loadingFinished(user) {
return this.props.schedules.hasOwnProperty(user) &&
this.props.schedules[user].state === 'finished';
}
render() {
if (!this.loadingFinished(this.props.user)) {
return (
<div>
Loading...
</div>
);
}
const cleanHTML = cleanMeetingpointHTML(this.props.schedules[this.props.user].htmlStr);
return (
// eslint-disable-next-line react/no-danger
<div dangerouslySetInnerHTML={{ __html: cleanHTML }} />
);
}
}
View.propTypes = {
user: PropTypes.string,
dispatch: PropTypes.func.isRequired,
schedules: PropTypes.objectOf(PropTypes.shape({
state: PropTypes.string.isRequired,
htmlStr: PropTypes.string,
})).isRequired,
};
View.defaultProps = {
user: null,
};
const mapStateToProps = state => ({
schedules: state.view.schedules,
});
export default withRouter(connect(mapStateToProps)(View));
|