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; let 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.target; console.log(target.dataset.category) 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); } render() { const article = this.props.resource; let heartReactedClass = '' let unicornReactedClass = '' let bookmarkReactedClass = '' const state = this.state; 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}

) } }