function onReactionSelect()

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);
        }
      }
    }
  };
}