summaryrefslogtreecommitdiff
path: root/node_modules/@jet-app/app-store/tmp/src/common/app-promotions/offer-item-detail.js
diff options
context:
space:
mode:
authorrxliuli <rxliuli@gmail.com>2025-11-04 05:03:50 +0800
committerrxliuli <rxliuli@gmail.com>2025-11-04 05:03:50 +0800
commitbce557cc2dc767628bed6aac87301a1be7c5431b (patch)
treeb51a051228d01fe3306cd7626d4a96768aadb944 /node_modules/@jet-app/app-store/tmp/src/common/app-promotions/offer-item-detail.js
init commit
Diffstat (limited to 'node_modules/@jet-app/app-store/tmp/src/common/app-promotions/offer-item-detail.js')
-rw-r--r--node_modules/@jet-app/app-store/tmp/src/common/app-promotions/offer-item-detail.js147
1 files changed, 147 insertions, 0 deletions
diff --git a/node_modules/@jet-app/app-store/tmp/src/common/app-promotions/offer-item-detail.js b/node_modules/@jet-app/app-store/tmp/src/common/app-promotions/offer-item-detail.js
new file mode 100644
index 0000000..ef400cb
--- /dev/null
+++ b/node_modules/@jet-app/app-store/tmp/src/common/app-promotions/offer-item-detail.js
@@ -0,0 +1,147 @@
+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) ? "<b>" + skuName + "</b>" : undefined;
+ const skuDescription = mediaAttributes.attributeAsString(iapData, "description.standard");
+ const skuDescriptionFormatted = isSome(skuDescription) ? skuDescription + "<br>" : undefined;
+ const termsTitle = "<b>" + objectGraph.loc.string("Promotion.Terms.Title") + "</b>";
+ 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("<br>");
+ return new models.Paragraph(combinedStrings, "text/x-apple-as3-nqml");
+}
+//# sourceMappingURL=offer-item-detail.js.map \ No newline at end of file