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

114 lines
2.8 KiB
React
Raw Normal View History

import { Components } from 'meteor/nova:lib';
import { withMutation } from 'meteor/nova:core';
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({url}).then(result => {
2016-07-04 12:57:41 +09:00
this.setState({loading: false});
console.log('Embedly Data', 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 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}>
<Components.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
}
// note: not used since we use `withMutation` and getEmbedlyData returns a `JSON` type
// function withGetEmbedlyData() {
// return graphql(gql`
// mutation getEmbedlyData($url: String) {
// getEmbedlyData(url: $url) {
// title
// media
// description
// thumbnailUrl
// sourceName
// sourceUrl
// }
// }
// `, {
// name: 'getEmbedlyData'
// });
// }
export default withMutation({
name: 'getEmbedlyData',
args: {url: 'String'},
})(EmbedlyURL);