package com.fastaccess.provider.timeline; import android.support.annotation.IdRes; import android.support.annotation.IntDef; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import com.fastaccess.data.dao.PostReactionModel; import com.fastaccess.data.dao.model.ReactionsModel; import com.fastaccess.data.dao.types.ReactionTypes; import com.fastaccess.helper.InputHelper; import com.fastaccess.helper.RxHelper; import com.fastaccess.provider.rest.RestProvider; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.LinkedHashMap; import java.util.Map; import rx.Observable; /** * Created by Kosh on 09 Apr 2017, 10:40 AM */ public class ReactionsProvider { public static final int HEADER = 0; public static final int COMMENT = 1; public static final int REVIEW_COMMENT = 2; public static final int COMMIT = 3; @IntDef({ HEADER, COMMENT, REVIEW_COMMENT, COMMIT }) @Retention(RetentionPolicy.SOURCE) public @interface ReactionType {} private Map<Long, ReactionsModel> reactionsMap = new LinkedHashMap<>(); @Nullable public Observable onHandleReaction(@IdRes int viewId, long idOrNumber, @Nullable String login, @Nullable String repoId, @ReactionType int reactionType) { if (!InputHelper.isEmpty(login) && !InputHelper.isEmpty(repoId)) { if (!isPreviouslyReacted(idOrNumber, viewId)) { ReactionTypes reactionTypes = ReactionTypes.get(viewId); if (reactionTypes != null) { Observable<ReactionsModel> observable = null; switch (reactionType) { case COMMENT: observable = RestProvider.getReactionsService() .postIssueCommentReaction(new PostReactionModel(reactionTypes.getContent()), login, repoId, idOrNumber); break; case HEADER: observable = RestProvider.getReactionsService() .postIssueReaction(new PostReactionModel(reactionTypes.getContent()), login, repoId, idOrNumber); break; case REVIEW_COMMENT: observable = RestProvider.getReactionsService() .postCommentReviewReaction(new PostReactionModel(reactionTypes.getContent()), login, repoId, idOrNumber); break; case COMMIT: observable = RestProvider.getReactionsService() .postCommitReaction(new PostReactionModel(reactionTypes.getContent()), login, repoId, idOrNumber); break; } if (observable == null) return null; return RxHelper.safeObservable(observable) .doOnNext(response -> getReactionsMap().put(idOrNumber, response)); } } else { ReactionsModel reactionsModel = getReactionsMap().get(idOrNumber); if (reactionsModel != null) { return RxHelper.safeObservable(RestProvider.getReactionsService().delete(reactionsModel.getId())) .doOnNext(booleanResponse -> { if (booleanResponse.code() == 204) { getReactionsMap().remove(idOrNumber); } }); } } } return null; } public boolean isPreviouslyReacted(long idOrNumber, @IdRes int vId) { ReactionsModel reactionsModel = getReactionsMap().get(idOrNumber); if (reactionsModel == null || InputHelper.isEmpty(reactionsModel.getContent())) { return false; } ReactionTypes type = ReactionTypes.get(vId); return type != null && type.getContent().equals(reactionsModel.getContent()); } public boolean isCallingApi(long id, int vId) { ReactionsModel reactionsModel = getReactionsMap().get(id); if (reactionsModel == null || InputHelper.isEmpty(reactionsModel.getContent())) { return false; } ReactionTypes type = ReactionTypes.get(vId); return type != null && type.getContent().equals(reactionsModel.getContent()) && reactionsModel.isCallingApi(); } @NonNull private Map<Long, ReactionsModel> getReactionsMap() { return reactionsMap; } }