@livelike/react-native
Version:
LiveLike React Native package
257 lines (250 loc) • 8.44 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useLoadTimelineWidgetEffect = useLoadTimelineWidgetEffect;
var _javascript = require("@livelike/javascript");
var _react = require("react");
var _store = require("../store");
var _useApi = require("./useApi");
var _types = require("../types");
function useLoadTimelineWidgetEffect(_ref) {
let {
programId,
mode
} = _ref;
const [moreWidgets, setMoreWidgets] = (0, _react.useState)(false);
const nextIteratorRef = (0, _react.useRef)();
const {
onApi,
isLoading,
error,
data
} = (0, _useApi.useApi)(() => (0, _javascript.getPostedWidgets)({
programId
}).then(widgetsPayload => {
if (!widgetsPayload.done) {
setMoreWidgets(true);
nextIteratorRef.current = widgetsPayload.next;
}
return widgetsPayload;
}).then(getWidgetsDetails));
(0, _react.useEffect)(() => {
if (mode === _types.WidgetMode.POPUP) {
_store.timelineWidgetStoreActions.updateTimelineWidgetStateAction({
programId,
widgetTimelineState: {
widgets: []
}
});
return;
}
onApi().then(apiData => updateWidgetsState(apiData, programId));
}, [programId, mode]);
(0, _react.useEffect)(() => {
if (!data && mode === _types.WidgetMode.INTERACTIVE_TIMELINE) {
return;
}
function onProgramListener(_ref2) {
let {
event,
message
} = _ref2;
if (Object.values(_javascript.WidgetCreatedEvent).includes(event)) {
const {
id: widgetId,
kind: widgetKind
} = message;
const widgetPayload = message;
(_javascript.PREDICTION_FOLLOW_UP_WIDGET_KIND.includes(widgetKind) ? (0, _javascript.getWidgetInteractions)({
widgetId,
widgetKind,
interactionUrl: widgetPayload.widget_interactions_url_template
}) : Promise.resolve([])).then(widgetInteractions => {
_store.widgetStoreActions.updateWidgetStateAction({
widgetId,
widgetState: {
widgetPayload,
widgetInteractions,
widgetResultState: (0, _store.getWidgetResultState)({
widgetPayload,
widgetInteractions
}),
widgetUIPhase: (0, _store.getWidgeUIPhase)({
widgetPayload,
widgetInteractions
}),
selectedOptionIndex: (0, _store.getSelectedOptionIndex)({
widgetPayload,
widgetInteractions
}),
isTimelineWidget: true
}
});
_store.timelineWidgetStoreActions.updateTimelineWidgetsAction({
programId,
widgets: [{
widgetId,
widgetKind
}],
prepend: true
});
});
}
}
(0, _javascript.addProgramListener)({
programId
}, onProgramListener);
return () => {
(0, _javascript.removeProgramListener)({
programId
}, onProgramListener);
};
}, [data, programId, mode]);
const onLoadMore = (0, _react.useCallback)(() => {
if (nextIteratorRef.current) {
return nextIteratorRef.current().then(res => {
if (res.done) {
setMoreWidgets(false);
nextIteratorRef.current = null;
}
return res.value;
}).then(getWidgetsDetails).then(widgetsData => updateWidgetsState(widgetsData, programId));
}
}, [nextIteratorRef.current, programId]);
return {
onApi,
isLoading,
error,
data,
onLoadMore: moreWidgets ? onLoadMore : null
};
}
const getWidgetsDetails = widgetsPayload => {
return Promise.all([(0, _javascript.getWidgetsInteractions)({
interactionUrl: widgetsPayload.widget_interactions_url_template
}), Promise.all(widgetsPayload.widgets.map(widget => (0, _javascript.getTargetedWidgetIdAndKind)({
widget
}))).then(widgetIdsAndKinds => getAllRewardTransasctions(widgetIdsAndKinds.map(_ref3 => {
let {
widgetId
} = _ref3;
return widgetId;
})))]).then(_ref4 => {
let [widgetInteractions, widgetRewards] = _ref4;
return [widgetsPayload.widgets, widgetInteractions, widgetRewards];
});
};
const updateWidgetsState = (_ref5, programId) => {
let [widgets, widgetInteractions, widgetRewards] = _ref5;
const {
widgetRecords: widgetsPayloadRecord,
followUpWidgetRecords
} = getWidgetPayloadRecord(widgets);
const widgetsInteractionsRecord = getWidgetsInteractionsRecord(widgetInteractions, followUpWidgetRecords);
const widgetsRewardsRecord = getWidgetsRewardsRecord(widgetRewards, followUpWidgetRecords);
// set individual widget state so that widget details are not reloaded
// This is done to avoid sending multiple widget details request for every widget rendered
// that would give same response.
Object.keys(widgetsPayloadRecord).forEach(widgetId => {
const widgetPayload = widgetsPayloadRecord[widgetId];
const widgetInteractions = widgetsInteractionsRecord[widgetId] ?? [];
_store.widgetStoreActions.updateWidgetStateAction({
widgetId,
widgetState: {
widgetPayload,
widgetInteractions,
widgetRewards: widgetsRewardsRecord[widgetId],
widgetResultState: (0, _store.getWidgetResultState)({
widgetPayload,
widgetInteractions
}),
widgetUIPhase: (0, _store.getWidgeUIPhase)({
widgetPayload,
widgetInteractions
}),
selectedOptionIndex: (0, _store.getSelectedOptionIndex)({
widgetPayload,
widgetInteractions
}),
isTimelineWidget: true
}
});
});
_store.timelineWidgetStoreActions.updateTimelineWidgetsAction({
programId,
widgets: widgets.map(_ref6 => {
let {
id: widgetId,
kind: widgetKind
} = _ref6;
return {
widgetId,
widgetKind
};
})
});
};
// get all reward transactions incase there are multiple pages of
// reward transactions
const getAllRewardTransasctions = async widgetIds => {
const response = await (0, _javascript.getRewardTransactions)({
widgetIds
});
let results = response.results;
let done = response.done;
while (!done) {
const res = await response.next();
results = results.concat(res.value.results);
done = res.done;
}
return results;
};
// create a record of widgetId vs widgetpayload
function getWidgetPayloadRecord(widgets) {
const followUpWidgetRecords = {};
const widgetRecords = widgets.reduce((record, widgetPayload) => {
record[widgetPayload.id] = widgetPayload;
if (_javascript.PREDICTION_FOLLOW_UP_WIDGET_KIND.includes(widgetPayload.kind)) {
followUpWidgetRecords[widgetPayload.id] = widgetPayload;
}
return record;
}, {});
return {
widgetRecords,
followUpWidgetRecords
};
}
// create a record of widgetId vs widgetInteractions
function getWidgetsInteractionsRecord(widgetsInteractions, followUpWidgetRecords) {
const record = {};
for (const interactions of Object.values(widgetsInteractions)) {
for (const interaction of interactions) {
record[interaction.widget_id] = [...(record[interaction.widget_id] ?? []), interaction];
}
}
// set followup widget interaction using its corresponding prediction widget id
for (const predictionWidget of Object.values(followUpWidgetRecords)) {
const widgetId = predictionWidget[_javascript.PREDICTION_WIDGET_ID_PROP[predictionWidget.kind]];
if (widgetId && record[widgetId]) {
record[predictionWidget.id] = record[widgetId];
}
}
return record;
}
// create a record of widgetId vs widgetRewards
function getWidgetsRewardsRecord(widgetsRewards, followUpWidgetRecords) {
const record = {};
for (const reward of widgetsRewards) {
record[reward.widget_id] = [...(record[reward.widget_id] ?? []), ...(0, _store.getWidgetRewardsFromRewardTransactions)([reward])];
}
// set followup widget rewards using its corresponding prediction widget id
for (const predictionWidget of Object.values(followUpWidgetRecords)) {
const widgetId = predictionWidget[_javascript.PREDICTION_WIDGET_ID_PROP[predictionWidget.kind]];
if (widgetId && record[widgetId]) {
record[predictionWidget.id] = record[widgetId];
}
}
return record;
}
//# sourceMappingURL=useLoadTimelineWidgetEffect.js.map