* updating all headers to have h* tags, or changing elements * Remove commented out binding.pry * Remove unused page * Use article instead of div for consistency * Update snapshot with new section tag * Use h4 tags again for new views
146 lines
5.1 KiB
JavaScript
146 lines
5.1 KiB
JavaScript
|
|
|
|
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 = <section><div class="image image-final" style={{backgroundImage:`url(${article.cover_image}`}}></div></section>
|
|
}
|
|
return (
|
|
<div className='activechatchannel__activeArticle'>
|
|
<div className="activechatchannel__activeArticleDetails">
|
|
<a href={article.path} target='_blank'>
|
|
<span className="activechatchannel__activeArticleDetailsPath">{article.path}</span>
|
|
<img src={openLink} />
|
|
</a>
|
|
</div>
|
|
<div className="container">
|
|
{coverImage}
|
|
<div className="title">
|
|
<h1>{article.title}</h1>
|
|
<h3>
|
|
<a href={'/'+article.user.username} className="author" data-content={'/users/'+article.user.id}>
|
|
<img className="profile-pic" src={article.user.profile_image_90} alt={article.user.username}/>
|
|
<span>{article.user.name} </span>
|
|
<span class="published-at"> | {article.readable_publish_date}</span>
|
|
</a>
|
|
</h3>
|
|
</div>
|
|
<div className="body">
|
|
<div dangerouslySetInnerHTML={{__html: article.body_html}} ></div>
|
|
</div>
|
|
</div>
|
|
<div className="activechatchannel__activeArticleActions">
|
|
<button className={'heart-reaction-button ' + heartReactedClass}
|
|
onClick={this.handleReactionClick} data-category='like' >
|
|
<img src={heartImage} />
|
|
</button>
|
|
<button className={'unicorn-reaction-button ' + unicornReactedClass}
|
|
onClick={this.handleReactionClick} data-category='unicorn'>
|
|
<img src={unicornImage} data-category='unicorn' />
|
|
</button>
|
|
<button className={'readinglist-reaction-button ' + bookmarkReactedClass}
|
|
onClick={this.handleReactionClick} data-category='readinglist'>
|
|
<img src={bookmarkImage} data-category='readinglist' />
|
|
</button>
|
|
</div>
|
|
</div>)
|
|
}
|
|
}
|
|
|