import React, { Component, PropTypes } from 'react' import { MessageUtils } from '../../flow/utils.js' export default View => class extends React.Component { static displayName = View.displayName || View.name static matches = View.matches static propTypes = { ...View.propTypes, content: PropTypes.string, // mark as non-required flow: PropTypes.object.isRequired, message: PropTypes.object.isRequired, } constructor(props) { super(props) this.state = { content: undefined, request: undefined, } } componentWillMount() { this.updateContent(this.props) } componentWillReceiveProps(nextProps) { if ( nextProps.message.content !== this.props.message.content || nextProps.message.contentHash !== this.props.message.contentHash || nextProps.contentView !== this.props.contentView ) { this.updateContent(nextProps) } } componentWillUnmount() { if (this.state.request) { this.state.request.abort() } } updateContent(props) { if (this.state.request) { this.state.request.abort() } // We have a few special cases where we do not need to make an HTTP request. if(props.message.content !== undefined) { return this.setState({request: undefined, content: props.message.content}) } if(props.message.contentLength === 0 || props.message.contentLength === null){ return this.setState({request: undefined, content: ""}) } let requestUrl = MessageUtils.getContentURL(props.flow, props.message, (View.name == 'ViewServer' ? props.contentView : undefined)) // We use XMLHttpRequest instead of fetch() because fetch() is not (yet) abortable. let request = new XMLHttpRequest(); request.addEventListener("load", this.requestComplete.bind(this, request)); request.addEventListener("error", this.requestFailed.bind(this, request)); request.open("GET", requestUrl); request.send(); this.setState({ request, content: undefined }) } requestComplete(request, e) { if (request !== this.state.request) { return // Stale request } this.setState({ content: request.responseText, request: undefined }) } requestFailed(request, e) { if (request !== this.state.request) { return // Stale request } console.error(e) // FIXME: Better error handling this.setState({ content: "Error getting content.", request: undefined }) } render() { return this.state.content !== undefined ? ( ) : (
) } }; >include/package-defaults.mk
blob: 16d9ae0027d4454aedce86bb8d02d30a1d7273fd (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
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