import { createSelector } from 'reselect'; import REWARDS from 'rewards'; const selectState = (state) => state.rewards || {}; export const selectUnclaimedRewardsByType = (state) => selectState(state).unclaimedRewardsByType; export const selectClaimedRewardsById = (state) => selectState(state).claimedRewardsById; export const selectClaimedRewards = createSelector(selectClaimedRewardsById, (byId) => Object.values(byId) || []); export const selectClaimedRewardsByTransactionId = createSelector(selectClaimedRewards, (rewards) => rewards.reduce((mapParam, reward) => { const map = mapParam; map[reward.transaction_id] = reward; return map; }, {}) ); export const selectUnclaimedRewards = (state) => selectState(state).unclaimedRewards; export const selectFetchingRewards = (state) => !!selectState(state).fetching; export const selectUnclaimedRewardValue = createSelector(selectUnclaimedRewards, (rewards) => rewards.reduce((sum, reward) => sum + reward.reward_amount, 0) ); export const selectClaimsPendingByType = (state) => selectState(state).claimPendingByType; const selectIsClaimRewardPending = (state, props) => selectClaimsPendingByType(state, props)[props.reward_type]; export const makeSelectIsRewardClaimPending = () => createSelector(selectIsClaimRewardPending, (isClaiming) => isClaiming); export const selectClaimErrorsByType = (state) => selectState(state).claimErrorsByType; const selectClaimRewardError = (state, props) => selectClaimErrorsByType(state, props)[props.reward_type]; export const makeSelectClaimRewardError = () => createSelector(selectClaimRewardError, (errorMessage) => errorMessage); const selectRewardByType = (state, rewardType) => selectUnclaimedRewards(state).find((reward) => reward.reward_type === rewardType); export const makeSelectRewardByType = () => createSelector(selectRewardByType, (reward) => reward); const selectRewardByClaimCode = (state, claimCode) => selectUnclaimedRewards(state).find((reward) => reward.claim_code === claimCode); export const makeSelectRewardByClaimCode = () => createSelector(selectRewardByClaimCode, (reward) => reward); export const makeSelectRewardAmountByType = () => createSelector(selectRewardByType, (reward) => (reward ? reward.reward_amount : 0)); export const selectRewardContentClaimIds = createSelector(selectState, (state) => state.rewardedContentClaimIds); export const selectReferralReward = createSelector( selectUnclaimedRewards, (unclaimedRewards) => unclaimedRewards.filter((reward) => reward.reward_type === REWARDS.TYPE_REFERRAL)[0] ); export const selectHasUnclaimedRefereeReward = createSelector(selectUnclaimedRewards, (unclaimedRewards) => unclaimedRewards.some((reward) => reward.reward_type === REWARDS.TYPE_REFEREE) ); export const selectIsClaimingInitialRewards = createSelector(selectClaimsPendingByType, (claimsPendingByType) => { return !!(claimsPendingByType[REWARDS.TYPE_NEW_USER] || claimsPendingByType[REWARDS.TYPE_CONFIRM_EMAIL]); }); export const selectHasClaimedInitialRewards = createSelector(selectClaimedRewardsById, (claimedRewardsById) => { const claims = Object.values(claimedRewardsById); const newUserClaimed = !!claims.find((claim) => claim && claim.reward_type === REWARDS.TYPE_NEW_USER); const confirmEmailClaimed = !!claims.find((claim) => claim && claim.reward_type === REWARDS.TYPE_CONFIRM_EMAIL); return newUserClaimed && confirmEmailClaimed; }); export const selectWeeklyWatchClaimedThisWeek = createSelector(selectClaimedRewardsById, (claimedRewardsById) => { const claimedRewards = Object.values(claimedRewardsById); // The list could be huge, so: // - don't use find() which will look from the top. // - only search until LOOKUP_LIMIT from the back. const LOOKUP_LIMIT = 15; let i = claimedRewards.length; const stopIndex = i > LOOKUP_LIMIT ? i - LOOKUP_LIMIT : 0; while (--i >= stopIndex) { if (claimedRewards[i].reward_type === REWARDS.TYPE_WEEKLY_WATCH) { const last = new Date(claimedRewards[i].updated_at || claimedRewards[i].created_at); const diff = new Date() - last; const diffDays = Math.ceil(diff / (1000 * 60 * 60 * 24)); return diffDays < 6; } } return false; });