import { h, Component } from 'preact'; import heartImage from 'images/emoji/emoji-one-heart.png'; import unicornImage from 'images/emoji/emoji-one-unicorn.png'; import bookmarkImage from 'images/emoji/emoji-one-bookmark.png'; import openLink from 'images/external-link-logo.svg'; export default class Article extends Component { constructor(props) { super(props); this.state = { reactionCounts: [], userReactions: [], optimisticUserReaction: null, }; } componentDidMount() { fetch(`/reactions?article_id=${this.props.resource.id}`, { Accept: 'application/json', 'Content-Type': 'application/json', credentials: 'same-origin', }) .then(response => response.json()) .then(this.displayReactions) .catch(this.displayReactionsFailure); } displayReactions = response => { this.setState({ userReactions: response.reactions }); }; displayReactionsFailure = response => { console.log(response); }; handleNewReactionResponse = response => { let oldUserReactions = this.state.userReactions; const foundReactions = oldUserReactions.filter(obj => { return obj.category === response.category; }); if (foundReactions.length === 0 && response.result === 'create') { oldUserReactions.push({ category: response.category }); } else { oldUserReactions = oldUserReactions.filter(obj => { return obj.category != response.category; }); } this.setState({ userReactions: oldUserReactions, optimisticUserReaction: null, }); }; handleNewReactionFailure = response => { console.log(response); }; handleReactionClick = e => { e.preventDefault(); const { target } = e; this.setState({ optimisticUserReaction: target.dataset.category }); const article = this.props.resource; fetch('/reactions', { method: 'POST', headers: { Accept: 'application/json', 'X-CSRF-Token': window.csrfToken, 'Content-Type': 'application/json', }, body: JSON.stringify({ reactable_type: 'Article', reactable_id: article.id, category: target.dataset.category, }), credentials: 'same-origin', }) .then(response => response.json()) .then(this.handleNewReactionResponse) .catch(this.handleNewReactionFailure); }; actionButton = (props) => { const types = { "heart": ["heart-reaction-button", "like", heartImage], "unicorn": ["unicorn-reaction-button", "unicorn", unicornImage], "readinglist": ["readinglist-reaction-button", "readinglist", bookmarkImage] }; const curType = types[props.reaction]; return ( ) }; render() { const article = this.props.resource; let heartReactedClass = ''; let unicornReactedClass = ''; let bookmarkReactedClass = ''; const { state } = this; state.userReactions.forEach(reaction => { if ( reaction.category === 'like' || state.optimisticUserReaction === 'like' ) { heartReactedClass = 'active'; } if ( reaction.category === 'unicorn' || state.optimisticUserReaction === 'unicorn' ) { unicornReactedClass = 'active'; } if ( reaction.category === 'readinglist' || state.optimisticUserReaction === 'readinglist' ) { bookmarkReactedClass = 'active'; } }); let coverImage = ''; if (article.cover_image) { coverImage = (
); } return (
{article.path}
{coverImage}

{article.title}

{article.user.username} {article.user.name} {' '} {' '} | {' '} {article.readable_publish_date}

); } }