in src/views/article/arcticle-actions.ts [776:821]
function onReactionSelect(
articleId: string,
comment: IssueComment,
reaction: Reaction,
activities: Activity[] | null,
onReactionUpdate: (activities: Activity[], error?: CustomError) => void,
): ReduxAction {
return async (dispatch: ReduxThunkDispatch, getState: ReduxStateGetter, getApi: ReduxAPIGetter) => {
const currentUser = getState().app.user!;
usage.trackEvent(ANALYTICS_ARTICLE_PAGE_STREAM, 'Reaction select');
const reactionName: string = reaction.reaction;
const existReaction: Reaction = (comment.reactions || []).filter(
(it: Reaction) =>
it.reaction === reactionName && it.author.id === currentUser!.id,
)[0];
const [error, commentReaction] = await until(
existReaction
? getApi().articles.removeCommentReaction(articleId, comment.id, existReaction.id)
: getApi().articles.addCommentReaction(articleId, comment.id, reactionName),
);
if (error) {
notifyError(error);
} else {
const targetActivityData: ActivityPositionData | null = activities
? findActivityInGroupedActivities(activities, comment.id)
: null;
if (targetActivityData) {
const _comment = updateActivityCommentReactions({
comment,
currentUser,
reaction: existReaction ? reaction : commentReaction,
});
const newActivities: Activity[] = activities.slice(0);
const targetActivity: Activity | null | undefined = newActivities[targetActivityData.index];
if (targetActivity && Array.isArray(targetActivity?.comment?.added)) {
targetActivity.comment.added = [_comment];
onReactionUpdate(newActivities);
}
}
}
};
}