Vulcan/packages/nova-embedly/lib/components/EmbedlyURL.jsx

110 lines
2.6 KiB
React
Raw Normal View History

2016-08-08 11:18:21 +09:00
import Telescope from 'meteor/nova:lib';
2016-04-07 12:43:41 +09:00
import React, { PropTypes, Component } from 'react';
import FRC from 'formsy-react-components';
import { graphql } from 'react-apollo';
import gql from 'graphql-tag';
2016-04-07 12:43:41 +09:00
const Input = FRC.Input;
class EmbedlyURL extends Component {
constructor() {
super();
this.handleBlur = this.handleBlur.bind(this);
this.state = {
loading: false
}
}
// called whenever the URL input field loses focus
handleBlur() {
this.setState({loading: true});
2016-07-04 12:57:41 +09:00
const url = this.input.getValue();
if (url.length) {
// the URL has changed, get a new thumbnail
this.props.getEmbedlyData({variables: {url}}).then(result => {
2016-07-04 12:57:41 +09:00
this.setState({loading: false});
console.log(result)
this.context.addToAutofilledValues({
title: result.data.getEmbedlyData.title,
body: result.data.getEmbedlyData.description,
thumbnailUrl: result.data.getEmbedlyData.thumbnailUrl
});
}).catch(error => {
this.setState({loading: false});
console.log(error)
this.context.throwError({content: error.message, type: "error"});
2016-07-04 12:57:41 +09:00
});
}
2016-04-07 12:43:41 +09:00
}
render() {
const Loading = Telescope.components.Loading;
const wrapperStyle = {
position: "relative"
};
const loadingStyle = {
position: "absolute",
pointerEvents: "none",
top: "15px",
right: "15px"
};
loadingStyle.display = this.state.loading ? "block" : "none";
// see https://facebook.github.io/react/warnings/unknown-prop.html
const {document, updateCurrentValue, control, getEmbedlyData, ...rest} = this.props;
2016-04-07 12:43:41 +09:00
return (
<div className="embedly-url-field" style={wrapperStyle}>
<Input
{...rest}
onBlur={this.handleBlur}
type="text"
ref={ref => this.input = ref}
/>
<div className="embedly-url-field-loading" style={loadingStyle}>
<Loading />
</div>
2016-04-07 12:43:41 +09:00
</div>
);
}
}
EmbedlyURL.propTypes = {
name: React.PropTypes.string,
value: React.PropTypes.any,
label: React.PropTypes.string
}
EmbedlyURL.contextTypes = {
2016-05-12 11:47:49 +09:00
addToAutofilledValues: React.PropTypes.func,
throwError: React.PropTypes.func,
actions: React.PropTypes.object,
2016-04-07 12:43:41 +09:00
}
function withGetEmbedlyData() {
return graphql(gql`
mutation getEmbedlyData($url: String) {
getEmbedlyData(url: $url) {
title
media
description
thumbnailUrl
sourceName
sourceUrl
}
}
`, {
name: 'getEmbedlyData'
});
}
export default withGetEmbedlyData()(EmbedlyURL);