import { isNothing, isSome } from "@jet/environment/types/optional";
import * as models from "../../api/models";
import * as serverData from "../../foundation/json-parsing/server-data";
import * as mediaRelationship from "../../foundation/media/relationships";
import * as mediaAttributes from "../../foundation/media/attributes";
import * as objects from "../../foundation/util/objects";
import * as metricsBuilder from "../metrics/builder";
import * as metricsHelpersLocation from "../metrics/helpers/location";
import * as metricsHelpersPage from "../metrics/helpers/page";
import { MetricsReferralContext } from "../metrics/metrics-referral-context";
import * as appPromotionCommon from "./app-promotions-common";
/**
* Create a flow action for navigating to the offer detail page.
* @param data The data blob
* @param parentAppData The associated parent app data
* @param offerItem The source offer object
* @param baseMetricsOptions The base metrics options
* @param animationBehavior The animation behavior for presenting the modal page
* @param includeLockupClickAction Whether to generate a click action for the lockup
* @param referrerData Referrer data from an incoming deep link
*/
export function offerItemDetailPageFlowActionFromData(objectGraph, data, parentAppData, offerItem, baseMetricsOptions, animationBehavior, includeLockupClickAction, referrerData) {
const page = offerItemDetailPageFromData(objectGraph, data, parentAppData, offerItem, baseMetricsOptions, includeLockupClickAction, referrerData, false);
const action = new models.FlowAction("offerItemDetail");
action.title = offerItem.title;
action.pageData = page;
action.animationBehavior = animationBehavior;
if (baseMetricsOptions && baseMetricsOptions.pageInformation) {
action.referrerUrl = baseMetricsOptions.pageInformation.pageUrl;
}
return action;
}
/**
* Creates an offer item detail page
* @param objectGraph The object graph
* @param data The data blob
* @param parentAppData The data blob for the related parent app
* @param offerItem The source offer
* @param baseMetricsOptions The base metrics options to use for the detail page
* @param includeLockupClickAction Whether to generate a click action for the lockup
* @param referrerData The referrer data
* @param isArcadePage Whether or not this is presented on the Arcade page
*/
export function offerItemDetailPageFromData(objectGraph, offerItemData, parentAppData, offerItem, baseMetricsOptions, includeLockupClickAction, referrerData, isArcadePage) {
var _a, _b;
let artwork = appPromotionCommon.artworkFromPlatformData(objectGraph, offerItemData, "productArtwork");
// rdar://126775681 (Remove force moduleArtwork to be null as MAPI still sends down artwork when it should not)
// The below `if` check should be uncommented when this is removed - it was commented as strict null checking is smart enough to know that `artwork` will always be null.
artwork = null;
const mediaOverlayStyle = "dark";
const isArtworkDark = true;
const includeBorderInDarkMode = false;
// if (serverData.isDefinedNonNullNonEmpty(artwork)) {
// isArtworkDark = color.isDarkColor(artwork?.backgroundColor);
// mediaOverlayStyle = isArtworkDark ? "dark" : "light";
// includeBorderInDarkMode = color.isDarkColor(artwork?.backgroundColor, 10);
// }
const copy = objects.shallowCopyOf(offerItem);
const pageInformation = metricsHelpersPage.pageInformationForAppPromotionDetailPage(objectGraph, models.AppPromotionType.OfferItem, offerItemData.id, parentAppData.id, referrerData, (_a = baseMetricsOptions.recoMetricsData) !== null && _a !== void 0 ? _a : null);
const metricsOptions = {
...baseMetricsOptions,
pageInformation: pageInformation,
locationTracker: metricsHelpersLocation.newLocationTracker(),
};
const offerEnvironment = isArtworkDark ? "dark" : "light";
const lockup = appPromotionCommon.lockupFromData(objectGraph, offerItemData, parentAppData, (_b = copy.title) !== null && _b !== void 0 ? _b : undefined, offerEnvironment, "transparent", false, metricsOptions, includeLockupClickAction, referrerData, isArcadePage, false);
if (serverData.isNull(lockup)) {
return null;
}
copy.offerLockup = lockup;
const additionalInfoLabel = objectGraph.loc.string("Winback.AdditionalInfoButton.Title");
const iapData = mediaRelationship.relationshipData(objectGraph, offerItemData, "salables");
const redemptionExpirationDate = mediaAttributes.attributeAsString(offerItemData, "redemptionExpirationDate");
let additionalInfo;
if (isSome(redemptionExpirationDate) && isSome(iapData)) {
const endDate = new Date(redemptionExpirationDate);
additionalInfo = formattedAdditionalInfoFromData(objectGraph, offerItemData, iapData, endDate);
}
const page = new models.OfferItemDetailPage(copy, artwork !== null && artwork !== void 0 ? artwork : undefined, undefined, mediaOverlayStyle, includeBorderInDarkMode, additionalInfoLabel, additionalInfo);
page.backButtonActionMetrics.addMetricsData(createButtonActionMetricsForTarget(objectGraph, "back", pageInformation, metricsOptions.locationTracker));
page.learnMoreActionMetrics.addMetricsData(createButtonActionMetricsForTarget(objectGraph, "LearnMore", pageInformation, metricsOptions.locationTracker, additionalInfoLabel));
page.closeButtonActionMetrics.addMetricsData(createButtonActionMetricsForTarget(objectGraph, "close", pageInformation, metricsOptions.locationTracker));
metricsHelpersPage.addMetricsEventsToPageWithInformation(objectGraph, page, pageInformation, (fields) => {
if (serverData.isDefinedNonNullNonEmpty(referrerData)) {
MetricsReferralContext.shared.addReferralContextToMetricsFieldsIfNecessary(fields);
}
});
return page;
}
function createButtonActionMetricsForTarget(objectGraph, targetId, pageInformation, locationTracker, title) {
let actionType;
switch (targetId) {
case "LearnMore":
actionType = "navigate";
break;
case "back":
actionType = "back";
break;
case "close":
actionType = "dismiss";
break;
default:
break;
}
const eventFields = {
targetType: "button",
actionType,
targetId,
idType: undefined,
location: metricsHelpersLocation.createContentLocation(objectGraph, {
pageInformation: pageInformation,
locationTracker: locationTracker,
targetType: "button",
id: targetId,
}, title !== null && title !== void 0 ? title : targetId),
};
const event = metricsBuilder.createMetricsClickData(objectGraph, targetId, "button", eventFields);
return event;
}
/**
* Creates the additional info text of the promotion out of a templated string
* @param data A data blob
* @param iapData A data blob containing the iap offer
* @returns Creates a formatted paragraph containing the contents of the additional info page.
*/
function formattedAdditionalInfoFromData(objectGraph, data, iapData, endDate) {
if (isNothing(iapData)) {
return undefined;
}
const skuName = mediaAttributes.attributeAsString(iapData, "name");
const skuNameFormatted = isSome(skuName) ? "" + skuName + "" : undefined;
const skuDescription = mediaAttributes.attributeAsString(iapData, "description.standard");
const skuDescriptionFormatted = isSome(skuDescription) ? skuDescription + "
" : undefined;
const termsTitle = "" + objectGraph.loc.string("Promotion.Terms.Title") + "";
let terms;
const redemptionDateFormat = objectGraph.loc.string("OfferItems.FormattedDate.RedemptionDate.DateFormat");
if (isSome(skuName) && isSome(endDate)) {
const templateKeyMap = {
"@@redemptionDate@@": objectGraph.loc.formatDate(redemptionDateFormat, endDate),
"@@skuName@@": skuName,
};
terms = appPromotionCommon.replacingTemplatedKeys(mediaAttributes.attributeAsString(data, "additionalTerms"), templateKeyMap);
}
const combinedStrings = [skuNameFormatted, skuDescriptionFormatted, termsTitle, terms].filter(isSome).join("
");
return new models.Paragraph(combinedStrings, "text/x-apple-as3-nqml");
}
//# sourceMappingURL=offer-item-detail.js.map