-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathembed.js
101 lines (91 loc) · 2.19 KB
/
embed.js
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
import React, { Component, PropTypes } from 'react';
import Knocking from './knocking';
class Embed extends Component {
constructor(props, context) {
super(props, context)
this.state = {
error: !!props.src === false,
isLoading: !!props.src,
isReady: false
};
}
componentWillMount() {
this.getEmbed(this.props.src);
}
componentWillReceiveProps(nextProps) {
if (this.props.src !== nextProps.src) {
this.getEmbed(nextProps.src);
}
}
getEmbed(src) {
fetch(src)
.then(res => res.json())
.then(data => {
this.setState({
data,
isLoading: false,
isReady: true,
showCover: !!data.thumbnail_url
});
})
.catch(err => {
this.setState({
error: true,
message: err
});
});
}
render() {
const { data, error, isLoading, isReady, showCover } = this.state;
const { autoplay, overCover, style, styleCover, styleCoverWrapper, styleKnocking } = this.props;
let ret;
if (isLoading) {
ret = <Knocking style={styleKnocking} />;
} else if (isReady) {
if (showCover && !autoplay) {
ret = (
<div onClick={() => this.setState({showCover: false})} style={styleCoverWrapper}>
{ overCover && <img {...overCover} />}
<img src={data.thumbnail_url} style={styleCover} />
</div>
)
} else {
ret = <div dangerouslySetInnerHTML={{__html: data.html}} />;
}
} else if (error) {
ret = <div>{typeof message === 'undefined' ? 'Do you src in your props?' : message}</div>;
}
return (
<div
data-block={this.props['data-block']}
style={style}
>
{ret}
</div>
);
}
}
Embed.defaultProps = {
overCover: false
};
Embed.propTypes = {
overCover: PropTypes.oneOfType([
PropTypes.object,
PropTypes.bool
]),
style: PropTypes.object,
styleCover: PropTypes.object,
styleCoverWrapper: PropTypes.object,
styleKnocking: PropTypes.object
}
const style = {
cover: {
cursor: 'pointer',
position: 'relative'
},
overCover: {
position: 'absolute',
zIndex: 1
}
}
export default Embed;