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 = (