@livelike/react-native
Version:
LiveLike React Native package
104 lines (103 loc) • 3.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useLoadWidgetRewardsEffect = useLoadWidgetRewardsEffect;
var _javascript = require("@livelike/javascript");
var _react = require("react");
var _store = require("../store");
var _useWidgetInteractions = require("./useWidgetInteractions");
var _useWidgetKind = require("./useWidgetKind");
function useLoadWidgetRewardsEffect(_ref) {
let {
widgetId
} = _ref;
const widgetInteractions = (0, _useWidgetInteractions.useWidgetInteractions)({
widgetId
});
const widgetKind = (0, _useWidgetKind.useWidgetKind)({
widgetId
});
const interactionsRef = (0, _react.useRef)(null);
const rewardRef = (0, _react.useRef)(null);
const mountRef = (0, _react.useRef)(null);
(0, _react.useEffect)(() => {
// avoid getting reward transactions on initial mount since we are already loading
// widget details including reward transaction as part of useLoadWidgetEffect
if (!mountRef.current && Array.isArray(widgetInteractions)) {
mountRef.current = true;
return;
}
// avoid loading widget rewards if there are no interactions or
// widget interaction are same as earlier interaction
if (!(widgetInteractions !== null && widgetInteractions !== void 0 && widgetInteractions.length)) {
return;
}
if (areWidgetInteractionsSame(widgetInteractions, interactionsRef.current ?? [])) {
return;
}
interactionsRef.current = widgetInteractions;
const timeout = setTimeout(() => {
(0, _javascript.getTargetedWidgetIdAndKind)({
widgetId,
widgetKind
}).then(_ref2 => {
let {
widgetId: targettedWidgetId
} = _ref2;
return (0, _javascript.getRewardTransactions)({
widgetIds: [targettedWidgetId]
});
}).then(res => {
const widgetRewards = (0, _store.getWidgetRewardsFromRewardTransactions)(res.results);
if (rewardRef.current && areWidgetRewardsSame(widgetRewards, rewardRef.current)) {
return;
}
rewardRef.current = widgetRewards;
// Observed a behaviour where old reward animation overlap with new reward animation
// until old reward animation gets resetted and dereferenced
// To avoid overlapping, we clear the existing rewards from state so that
// there's no residue of existing reward animation
Promise.resolve(_store.widgetStoreActions.updateWidgetRewardsAction({
widgetId,
widgetRewards: []
})).then(() => _store.widgetStoreActions.updateWidgetRewardsAction({
widgetId,
widgetRewards
}));
});
}, 1000);
return () => {
clearTimeout(timeout);
};
}, [widgetId, widgetKind, widgetInteractions]);
}
function areWidgetRewardsSame(rewardsA, rewardsB) {
if (rewardsA.length !== rewardsB.length) {
return false;
}
return rewardsA.every(rewardA => {
return !!rewardsB.find(_ref3 => {
let {
reward_item_id,
reward_item_amount
} = _ref3;
return rewardA.reward_item_id === reward_item_id && rewardA.reward_item_amount === reward_item_amount;
});
});
}
function areWidgetInteractionsSame(interactionsA, interactionsB) {
if (interactionsA.length !== interactionsB.length) {
return false;
}
return interactionsA.every(interactionA => {
return !!interactionsB.find(_ref4 => {
let {
option_id,
choice_id
} = _ref4;
return interactionA.option_id && interactionA.option_id === option_id || interactionA.choice_id && interactionA.choice_id === choice_id;
});
});
}
//# sourceMappingURL=useLoadWidgetRewardsEffect.js.map