OEmbed support for PreviewCard (#2337)

* OEmbed support for PreviewCard

* Improve ProviderDiscovery code failure treatment

* Do not crawl links if there is a content warning, since those
don't display a link card anyway

* Reset db schema

* Fresh migrate

* Fix rubocop style issues
Fix #1681 - return existing access token when applicable instead of creating new

* Fix test

* Extract http client to helper

* Improve oembed controller
This commit is contained in:
Eugen Rochko
2017-04-27 14:42:22 +02:00
committed by GitHub
parent be0a01145b
commit 88725d6ce8
22 changed files with 278 additions and 36 deletions

View File

@ -13,7 +13,7 @@ export function fetchStatusCard(id) {
dispatch(fetchStatusCardRequest(id));
api(getState).get(`/api/v1/statuses/${id}/card`).then(response => {
if (!response.data.url || !response.data.title || !response.data.description) {
if (!response.data.url) {
return;
}

View File

@ -14,14 +14,11 @@ const getHostname = url => {
class Card extends React.PureComponent {
render () {
renderLink () {
const { card } = this.props;
if (card === null) {
return null;
}
let image = '';
let image = '';
let provider = card.get('provider_name');
if (card.get('image')) {
image = (
@ -31,18 +28,64 @@ class Card extends React.PureComponent {
);
}
if (provider.length < 1) {
provider = getHostname(card.get('url'))
}
return (
<a href={card.get('url')} className='status-card' target='_blank' rel='noopener'>
{image}
<div className='status-card__content'>
<strong className='status-card__title' title={card.get('title')}>{card.get('title')}</strong>
<p className='status-card__description'>{card.get('description').substring(0, 50)}</p>
<span className='status-card__host' style={hostStyle}>{getHostname(card.get('url'))}</span>
<p className='status-card__description'>{(card.get('description') || '').substring(0, 50)}</p>
<span className='status-card__host' style={hostStyle}>{provider}</span>
</div>
</a>
);
}
renderPhoto () {
const { card } = this.props;
return (
<a href={card.get('url')} className='status-card-photo' target='_blank' rel='noopener'>
<img src={card.get('url')} alt={card.get('title')} width={card.get('width')} height={card.get('height')} />
</a>
);
}
renderVideo () {
const { card } = this.props;
const content = { __html: card.get('html') };
return (
<div
className='status-card-video'
dangerouslySetInnerHTML={content}
/>
);
}
render () {
const { card } = this.props;
if (card === null) {
return null;
}
switch(card.get('type')) {
case 'link':
return this.renderLink();
case 'photo':
return this.renderPhoto();
case 'video':
return this.renderVideo();
case 'rich':
default:
return null;
}
}
}
Card.propTypes = {