onReactionSelect: function()

in src/views/issue/activity/issue-activity__comment-actions.ts [327:374]


    onReactionSelect: function (
      issueId: string,
      comment: IssueComment,
      reaction: Reaction,
      activities: ActivityGroup[],
      onReactionUpdate: (activities: Activity[], error?: AnyError) => void
    ): ReduxAction {
      return async (_: ReduxThunkDispatch, getState: ReduxStateGetter, getApi: ReduxAPIGetter) => {
        const issueApi: IssueAPI = getApi().issue;
        const currentUser: User = getState().app.user!;
        usage.trackEvent(ANALYTICS_ISSUE_PAGE, 'Reaction select');
        const reactionName: string = reaction.reaction;
        const existReaction: Reaction = (comment.reactions || []).filter(
          it => it.reaction === reactionName && it.author.id === currentUser.id
        )[0];
        const [error, commentReaction] = await until(
          existReaction
            ? issueApi.removeCommentReaction(issueId, comment.id, existReaction.id)
            : issueApi.addCommentReaction(issueId, comment.id, reactionName)
        );

        if (error) {
          onReactionUpdate(activities, error);
          notifyError(error);
          return;
        }

        const targetActivityData: ActivityPositionData | null | undefined = findActivityInGroupedActivities(
          activities,
          comment.id
        );

        if (targetActivityData) {
          const _comment = updateActivityCommentReactions({
            comment,
            currentUser,
            reaction: existReaction ? reaction : commentReaction,
          });

          const newActivities: ActivityGroup[] = activities.slice(0);
          const targetActivity: ActivityGroup | undefined = newActivities[targetActivityData.index];
          if (targetActivity?.comment?.added) {
            targetActivity.comment.added = [_comment];
            onReactionUpdate(newActivities);
          }
        }
      };
    },