summaryrefslogtreecommitdiff
path: root/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon
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/search/metadata-ribbon
init commit
Diffstat (limited to 'node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon')
-rw-r--r--node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/category-metadata-ribbon-item.js38
-rw-r--r--node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/chart-metadata-ribbon-item.js75
-rw-r--r--node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/developer-metadata-ribbon-item.js37
-rw-r--r--node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/divider-metadata-ribbon-item.js8
-rw-r--r--node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/editors-choice-metadata-ribbon-item.js21
-rw-r--r--node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/game-controller-metadata-ribbon-item.js36
-rw-r--r--node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/metadata-ribbon-item-factory.js24
-rw-r--r--node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/metadata-ribbon.js27
-rw-r--r--node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/ranked-secondary-category-metadata-ribbon-item.js22
-rw-r--r--node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/search-tags-ribbon.js72
-rw-r--r--node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/secondary-short-categories-metadata-ribbon-item.js27
-rw-r--r--node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/short-category-metadata-ribbon-item.js36
-rw-r--r--node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/star-rating-metadata-ribbon-item.js20
-rw-r--r--node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/tag-metadata-ribbon-item.js18
14 files changed, 461 insertions, 0 deletions
diff --git a/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/category-metadata-ribbon-item.js b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/category-metadata-ribbon-item.js
new file mode 100644
index 0000000..70c47c8
--- /dev/null
+++ b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/category-metadata-ribbon-item.js
@@ -0,0 +1,38 @@
+import { isSome } from "@jet/environment";
+import { MetadataRibbonItem } from "../../../api/models";
+import { isNullOrEmpty } from "../../../foundation/json-parsing/server-data";
+import { categoryArtworkData } from "../../categories";
+import * as content from "../../content/content";
+import { categoryFromData } from "../../lockups/lockups";
+import * as metricsHelpersImpressions from "../../metrics/helpers/impressions";
+export function createMetadataRibbonItems(objectGraph, data, lockup, dedupeSet, metricsOptions) {
+ const artworkData = categoryArtworkData(objectGraph, data, true);
+ const hasArtwork = isSome(artworkData);
+ const labelText = categoryFromData(objectGraph, data);
+ if (isNullOrEmpty(labelText)) {
+ return null;
+ }
+ if (labelText != null) {
+ if (dedupeSet.has(labelText)) {
+ return null;
+ }
+ else {
+ dedupeSet.add(labelText);
+ }
+ }
+ const viewType = hasArtwork ? "imageWithLabel" : "textLabel";
+ const categoryItem = new MetadataRibbonItem(viewType);
+ categoryItem.moduleType = "genreDisplayName";
+ categoryItem.labelText = labelText;
+ if (hasArtwork) {
+ const artwork = content.artworkFromApiArtwork(objectGraph, artworkData, {
+ useCase: 20 /* content.ArtworkUseCase.CategoryIcon */,
+ });
+ artwork.crop = "sr";
+ categoryItem.artwork = artwork;
+ }
+ const impressionOptions = metricsHelpersImpressions.impressionOptionsForMetadataRibbonItem(metricsOptions, "genreDisplayName", categoryItem.labelText, "static");
+ metricsHelpersImpressions.addImpressionFieldsToSearchMetadataRibbonItem(objectGraph, categoryItem, impressionOptions);
+ return [categoryItem];
+}
+//# sourceMappingURL=category-metadata-ribbon-item.js.map \ No newline at end of file
diff --git a/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/chart-metadata-ribbon-item.js b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/chart-metadata-ribbon-item.js
new file mode 100644
index 0000000..26f815c
--- /dev/null
+++ b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/chart-metadata-ribbon-item.js
@@ -0,0 +1,75 @@
+import { isSome, isNothing } from "@jet/environment/types/optional";
+import { MetadataRibbonItem } from "../../../api/models";
+import * as serverData from "../../../foundation/json-parsing/server-data";
+import { contentAttributeAsDictionary } from "../../content/attributes";
+import { badgeChartKeyForClientIdentifier } from "../../content/content";
+import * as metricsHelpersImpressions from "../../metrics/helpers/impressions";
+export function createMetadataRibbonItems(objectGraph, data, lockup, dedupeSet, metricsOptions) {
+ var _a, _b;
+ const chartData = chartFromData(objectGraph, data);
+ if (serverData.isNullOrEmpty(chartData)) {
+ return null;
+ }
+ const position = serverData.asNumber(chartData, "position");
+ /// Per product, if the app isn't charting in the top 50, we don't want to use the chart module
+ if (isNothing(position) || position > 50) {
+ return null;
+ }
+ const genreName = (_a = serverData.asString(chartData, "genreShortName")) !== null && _a !== void 0 ? _a : serverData.asString(chartData, "genreName");
+ if (genreName != null) {
+ if (dedupeSet.has(genreName)) {
+ return null;
+ }
+ else {
+ dedupeSet.add(genreName);
+ }
+ }
+ let chartItem;
+ if (objectGraph.bag.isLLMSearchTagsEnabled) {
+ chartItem = new MetadataRibbonItem("highlightedText");
+ }
+ else {
+ chartItem = new MetadataRibbonItem("borderedTextLabel");
+ }
+ chartItem.moduleType = "chartPositions";
+ // Only use an ad override locale if this is an ad.
+ const adsOverrideLanguage = isSome((_b = lockup.searchAdOpportunity) === null || _b === void 0 ? void 0 : _b.searchAd) || isSome(lockup.searchAd)
+ ? objectGraph.bag.adsOverrideLanguage
+ : null;
+ const useAdsLocale = isSome(adsOverrideLanguage);
+ const loc = useAdsLocale ? objectGraph.adsLoc : objectGraph.loc;
+ // MAINTAINER'S NOTE: This was previously guarded by the iOS only `search_tags` feature flag that has been enabled by default on iOS only.
+ if (objectGraph.client.isiOS) {
+ const chartPositionText = loc
+ .string("MetadataRibbon.ChartPosition")
+ .replace("@@chartPosition@@", objectGraph.loc.formattedCountForPreferredLocale(objectGraph, position, adsOverrideLanguage));
+ if (objectGraph.bag.isLLMSearchTagsEnabled) {
+ chartItem.highlightedText = chartPositionText;
+ chartItem.labelText = loc
+ .string("MetadataRibbon.ChartPositionAndCategory.Tags")
+ .replace("@@chartPosition@@", objectGraph.loc.formattedCountForPreferredLocale(objectGraph, position, adsOverrideLanguage))
+ .replace("@@category@@", genreName);
+ }
+ else {
+ chartItem.labelText = genreName;
+ chartItem.borderedText = chartPositionText;
+ }
+ }
+ chartItem.secondaryViewPlacement = "leading";
+ const impressionOptions = metricsHelpersImpressions.impressionOptionsForMetadataRibbonItem(metricsOptions, "chartPosition", chartItem.labelText, "static");
+ metricsHelpersImpressions.addImpressionFieldsToSearchMetadataRibbonItem(objectGraph, chartItem, impressionOptions);
+ return [chartItem];
+}
+export function chartFromData(objectGraph, data) {
+ const chartPositionsByStore = contentAttributeAsDictionary(objectGraph, data, "chartPositions");
+ if (serverData.isNullOrEmpty(chartPositionsByStore)) {
+ return null;
+ }
+ const storeChartKey = badgeChartKeyForClientIdentifier(objectGraph, objectGraph.host.clientIdentifier);
+ if (serverData.isNullOrEmpty(storeChartKey)) {
+ return null;
+ }
+ const chartData = serverData.asDictionary(chartPositionsByStore, storeChartKey);
+ return chartData;
+}
+//# sourceMappingURL=chart-metadata-ribbon-item.js.map \ No newline at end of file
diff --git a/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/developer-metadata-ribbon-item.js b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/developer-metadata-ribbon-item.js
new file mode 100644
index 0000000..3a451a2
--- /dev/null
+++ b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/developer-metadata-ribbon-item.js
@@ -0,0 +1,37 @@
+import { isNothing, isSome } from "@jet/environment";
+import * as models from "../../../api/models";
+import { attributeAsString } from "../../../foundation/media/attributes";
+import * as contentArtwork from "../../content/artwork/artwork";
+import * as metricsHelpersImpressions from "../../metrics/helpers/impressions";
+export function createMetadataRibbonItems(objectGraph, data, lockup, dedupeSet, metricsOptions) {
+ var _a;
+ let developerName = lockup.developerName;
+ if (isNothing(developerName)) {
+ developerName = (_a = attributeAsString(data, "artistName")) !== null && _a !== void 0 ? _a : attributeAsString(data, "developerName");
+ }
+ if (developerName != null) {
+ if (dedupeSet.has(developerName)) {
+ return null;
+ }
+ else {
+ dedupeSet.add(developerName);
+ }
+ }
+ if (isSome(developerName) && developerName.length > 0) {
+ const developerItem = new models.MetadataRibbonItem("imageWithLabel");
+ developerItem.moduleType = "developerInfo";
+ developerItem.labelText = developerName;
+ developerItem.artwork = contentArtwork.createArtworkForResource(objectGraph, "systemimage://person.crop.square");
+ const characterCountThreshold = 6;
+ developerItem.maxCharacterCount = 16;
+ developerItem.truncationLegibilityCharacterCountThreshold = Math.min(characterCountThreshold, developerName.length);
+ developerItem.allowsTruncation = developerName.length >= characterCountThreshold;
+ const impressionOptions = metricsHelpersImpressions.impressionOptionsForMetadataRibbonItem(metricsOptions, "developerInfo", developerItem.labelText, "static");
+ metricsHelpersImpressions.addImpressionFieldsToSearchMetadataRibbonItem(objectGraph, developerItem, impressionOptions);
+ return [developerItem];
+ }
+ else {
+ return null;
+ }
+}
+//# sourceMappingURL=developer-metadata-ribbon-item.js.map \ No newline at end of file
diff --git a/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/divider-metadata-ribbon-item.js b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/divider-metadata-ribbon-item.js
new file mode 100644
index 0000000..91f5a5f
--- /dev/null
+++ b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/divider-metadata-ribbon-item.js
@@ -0,0 +1,8 @@
+import { MetadataRibbonItem } from "../../../api/models";
+export function createMetadataRibbonItems(objectGraph, data, lockup, dedupeSet, metricsOptions) {
+ const dividerItem = new MetadataRibbonItem("divider");
+ dividerItem.moduleType = "divider";
+ dividerItem.labelText = "|";
+ return [dividerItem];
+}
+//# sourceMappingURL=divider-metadata-ribbon-item.js.map \ No newline at end of file
diff --git a/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/editors-choice-metadata-ribbon-item.js b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/editors-choice-metadata-ribbon-item.js
new file mode 100644
index 0000000..764624e
--- /dev/null
+++ b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/editors-choice-metadata-ribbon-item.js
@@ -0,0 +1,21 @@
+import { isSome } from "@jet/environment/types/optional";
+import * as models from "../../../api/models";
+import * as metricsHelpersImpressions from "../../metrics/helpers/impressions";
+export function createMetadataRibbonItems(objectGraph, data, lockup, dedupeSet, metricsOptions) {
+ var _a;
+ if (lockup.isEditorsChoice) {
+ const editorsChoiceItem = new models.MetadataRibbonItem("editorsChoice");
+ editorsChoiceItem.moduleType = "editorialBadgeInfo";
+ // Only use an ad override locale if this is an ad.
+ editorsChoiceItem.useAdsLocale =
+ (isSome((_a = lockup.searchAdOpportunity) === null || _a === void 0 ? void 0 : _a.searchAd) || isSome(lockup.searchAd)) &&
+ isSome(objectGraph.bag.adsOverrideLanguage);
+ const impressionOptions = metricsHelpersImpressions.impressionOptionsForMetadataRibbonItem(metricsOptions, "editorialBadgeInfo", "Editors Choice", "static");
+ metricsHelpersImpressions.addImpressionFieldsToSearchMetadataRibbonItem(objectGraph, editorsChoiceItem, impressionOptions);
+ return [editorsChoiceItem];
+ }
+ else {
+ return null;
+ }
+}
+//# sourceMappingURL=editors-choice-metadata-ribbon-item.js.map \ No newline at end of file
diff --git a/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/game-controller-metadata-ribbon-item.js b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/game-controller-metadata-ribbon-item.js
new file mode 100644
index 0000000..40d18c0
--- /dev/null
+++ b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/game-controller-metadata-ribbon-item.js
@@ -0,0 +1,36 @@
+import { isSome } from "@jet/environment/types/optional";
+import * as models from "../../../api/models";
+import * as contentArtwork from "../../content/artwork/artwork";
+import * as contentAttributes from "../../content/attributes";
+import * as metricsHelpersImpressions from "../../metrics/helpers/impressions";
+export function createMetadataRibbonItems(objectGraph, data, lockup, dedupeSet, metricsOptions) {
+ var _a;
+ let isGameControllerSupported = false;
+ switch (contentAttributes.contentAttributeAsString(objectGraph, data, "remoteControllerRequirement")) {
+ case "CONTROLLER_REQUIRED":
+ case "CONTROLLER_OPTIONAL":
+ isGameControllerSupported = true;
+ break;
+ default:
+ break;
+ }
+ if (contentAttributes.contentAttributeAsBooleanOrFalse(objectGraph, data, "supportsGameController")) {
+ isGameControllerSupported = true;
+ }
+ if (!isGameControllerSupported) {
+ return null;
+ }
+ const gameControllerItem = new models.MetadataRibbonItem("imageWithLabel");
+ gameControllerItem.moduleType = "supportsGameController";
+ // Only use an ad override locale if this is an ad.
+ const useAdsLocale = (isSome(lockup.searchAd) || isSome((_a = lockup.searchAdOpportunity) === null || _a === void 0 ? void 0 : _a.searchAd)) &&
+ isSome(objectGraph.bag.adsOverrideLanguage);
+ gameControllerItem.labelText = useAdsLocale
+ ? objectGraph.adsLoc.string("BADGE_MFI_SUPPORTED")
+ : objectGraph.loc.string("BADGE_MFI_SUPPORTED");
+ gameControllerItem.artwork = contentArtwork.createArtworkForResource(objectGraph, "systemimage://gamecontroller.fill");
+ const impressionOptions = metricsHelpersImpressions.impressionOptionsForMetadataRibbonItem(metricsOptions, "supportsGameController", "Supports Game Controller", "static");
+ metricsHelpersImpressions.addImpressionFieldsToSearchMetadataRibbonItem(objectGraph, gameControllerItem, impressionOptions);
+ return [gameControllerItem];
+}
+//# sourceMappingURL=game-controller-metadata-ribbon-item.js.map \ No newline at end of file
diff --git a/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/metadata-ribbon-item-factory.js b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/metadata-ribbon-item-factory.js
new file mode 100644
index 0000000..5c6f3a6
--- /dev/null
+++ b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/metadata-ribbon-item-factory.js
@@ -0,0 +1,24 @@
+import * as categoryMetadataRibbonItem from "./category-metadata-ribbon-item";
+import * as chartMetadataRibbonItem from "./chart-metadata-ribbon-item";
+import * as developerMetadataRibbonItem from "./developer-metadata-ribbon-item";
+import * as dividerMetadataRibbonItem from "./divider-metadata-ribbon-item";
+import * as editorsChoiceMetadataRibbonItem from "./editors-choice-metadata-ribbon-item";
+import * as gameControllerMetadataRibbonItem from "./game-controller-metadata-ribbon-item";
+import * as secondaryShortCategoriesMetadataRibbonItem from "./secondary-short-categories-metadata-ribbon-item";
+import * as shortCategoryMetadataRibbonItem from "./short-category-metadata-ribbon-item";
+import * as starRatingMetadataRibbonItem from "./star-rating-metadata-ribbon-item";
+import * as tagMetadataRibbonItem from "./tag-metadata-ribbon-item";
+export const standardList = {
+ // every key in Key must be present
+ chartPositions: chartMetadataRibbonItem.createMetadataRibbonItems,
+ genreDisplayName: categoryMetadataRibbonItem.createMetadataRibbonItems,
+ genreShortDisplayName: shortCategoryMetadataRibbonItem.createMetadataRibbonItems,
+ secondaryGenreShortDisplayNames: secondaryShortCategoriesMetadataRibbonItem.createMetadataRibbonItems,
+ developerInfo: developerMetadataRibbonItem.createMetadataRibbonItems,
+ editorialBadgeInfo: editorsChoiceMetadataRibbonItem.createMetadataRibbonItems,
+ userRating: starRatingMetadataRibbonItem.createMetadataRibbonItems,
+ supportsGameController: gameControllerMetadataRibbonItem.createMetadataRibbonItems,
+ tag: tagMetadataRibbonItem.createMetadataRibbonItems,
+ divider: dividerMetadataRibbonItem.createMetadataRibbonItems,
+};
+//# sourceMappingURL=metadata-ribbon-item-factory.js.map \ No newline at end of file
diff --git a/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/metadata-ribbon.js b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/metadata-ribbon.js
new file mode 100644
index 0000000..1b487cb
--- /dev/null
+++ b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/metadata-ribbon.js
@@ -0,0 +1,27 @@
+import * as serverData from "../../../foundation/json-parsing/server-data";
+import { standardList } from "./metadata-ribbon-item-factory";
+export function createMetadataRibbonItemsForLockup(objectGraph, data, lockup, itemTypes, options, metadataRibbonItemFactory = standardList) {
+ if (serverData.isNullOrEmpty(itemTypes)) {
+ return [];
+ }
+ const metadataRibbonItems = [];
+ const dedupeSet = new Set();
+ for (const itemSlot of itemTypes) {
+ if (serverData.isNullOrEmpty(itemSlot)) {
+ continue;
+ }
+ for (const itemType of itemSlot) {
+ const metadataRibbonFactory = metadataRibbonItemFactory[itemType];
+ if (serverData.isNull(metadataRibbonFactory)) {
+ continue;
+ }
+ const results = metadataRibbonFactory(objectGraph, data, lockup, dedupeSet, options.metricsOptions);
+ if (serverData.isDefinedNonNull(results)) {
+ metadataRibbonItems.push(...results);
+ break;
+ }
+ }
+ }
+ return metadataRibbonItems;
+}
+//# sourceMappingURL=metadata-ribbon.js.map \ No newline at end of file
diff --git a/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/ranked-secondary-category-metadata-ribbon-item.js b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/ranked-secondary-category-metadata-ribbon-item.js
new file mode 100644
index 0000000..217876d
--- /dev/null
+++ b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/ranked-secondary-category-metadata-ribbon-item.js
@@ -0,0 +1,22 @@
+import { MetadataRibbonItem } from "../../../api/models";
+import * as metricsHelpersImpressions from "../../metrics/helpers/impressions";
+import { isNothing, isSome } from "@jet/environment";
+/**
+ * Creates a metadata ribbon item for ranked secondary category metadata ribbon type.
+ * This particular function takes in the type string since we grab it from the data in the search-tags-ribbon.
+ */
+export function createMetadataRibbonItemsForRankedSecondaryCategory(objectGraph, data, lockup, dedupeSet, metricsOptions) {
+ if (isNothing(data) || data.length === 0 || dedupeSet.has(data)) {
+ return null;
+ }
+ const tagItem = new MetadataRibbonItem("textLabel");
+ tagItem.moduleType = "rankedSecondaryGenre";
+ if (isSome(data)) {
+ tagItem.labelText = data;
+ const impressionOptions = metricsHelpersImpressions.impressionOptionsForMetadataRibbonItem(metricsOptions, "rankedSecondaryGenre", tagItem.labelText, "static");
+ metricsHelpersImpressions.addImpressionFieldsToSearchMetadataRibbonItem(objectGraph, tagItem, impressionOptions);
+ }
+ dedupeSet.add(data);
+ return [tagItem];
+}
+//# sourceMappingURL=ranked-secondary-category-metadata-ribbon-item.js.map \ No newline at end of file
diff --git a/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/search-tags-ribbon.js b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/search-tags-ribbon.js
new file mode 100644
index 0000000..3901446
--- /dev/null
+++ b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/search-tags-ribbon.js
@@ -0,0 +1,72 @@
+import { isSome } from "@jet/environment";
+import * as serverData from "../../../foundation/json-parsing/server-data";
+import * as metricsHelpersLocation from "../../metrics/helpers/location";
+import { standardList } from "./metadata-ribbon-item-factory";
+import * as rankedSecondaryCategoryMetadataRibbonItem from "./ranked-secondary-category-metadata-ribbon-item";
+export function createSearchTagsRibbonItemsForLockup(objectGraph, data, lockup, itemSlots, options, metadataRibbonItemFactory = standardList) {
+ if (serverData.isNullOrEmpty(itemSlots)) {
+ return [];
+ }
+ const tagData = serverData.asArrayOrEmpty(data.meta, "associations.tags.data");
+ const metadataRibbonItems = [];
+ // We need to keep track of how many tags we have so we can assign the tag properly
+ let tagIndex = 0;
+ let rankedSecondaryGenreIndex = 0;
+ // We are going to pass in a set of strings for items we have already added to the ribbon so we never duplicate items
+ const dedupeSet = new Set();
+ for (const itemSlot of itemSlots) {
+ const itemTypes = Array.isArray(itemSlot) ? itemSlot : [itemSlot];
+ if (serverData.isNullOrEmpty(itemTypes)) {
+ continue;
+ }
+ for (const itemType of itemTypes) {
+ // If we find a tag, we pass in the tag data specifically
+ // If we find a rankedSecondaryGenre, we want to call the factory function specifically.
+ const isTag = itemType === "tag";
+ const isRankedSecondaryGenre = itemType === "rankedSecondaryGenre";
+ let results;
+ let metadataItemData = data;
+ let metadataItemString = "";
+ if (isRankedSecondaryGenre) {
+ const searchExperimentDataForLockup = serverData.asDictionary(data, "meta");
+ if (isSome(searchExperimentDataForLockup === null || searchExperimentDataForLockup === void 0 ? void 0 : searchExperimentDataForLockup.rankedSecondaryGenreShortDisplayNames)) {
+ metadataItemString =
+ searchExperimentDataForLockup === null || searchExperimentDataForLockup === void 0 ? void 0 : searchExperimentDataForLockup.rankedSecondaryGenreShortDisplayNames[rankedSecondaryGenreIndex];
+ }
+ if (isSome(metadataItemString)) {
+ results =
+ rankedSecondaryCategoryMetadataRibbonItem.createMetadataRibbonItemsForRankedSecondaryCategory(objectGraph, metadataItemString, lockup, dedupeSet, options.metricsOptions);
+ rankedSecondaryGenreIndex = rankedSecondaryGenreIndex + 1;
+ }
+ else {
+ results = [];
+ }
+ }
+ else {
+ const metadataRibbonFactory = metadataRibbonItemFactory[itemType];
+ if (serverData.isNull(metadataRibbonFactory)) {
+ continue;
+ }
+ if (isTag) {
+ metadataItemData = tagData[tagIndex];
+ }
+ else {
+ metadataItemData = data;
+ }
+ results = metadataRibbonFactory(objectGraph, metadataItemData, lockup, dedupeSet, options.metricsOptions);
+ tagIndex = isTag ? tagIndex + 1 : tagIndex;
+ }
+ if (serverData.isDefinedNonNull(results)) {
+ metadataRibbonItems.push(...results);
+ for (const result of results) {
+ if (isSome(result.impressionMetrics)) {
+ metricsHelpersLocation.nextPosition(options.metricsOptions.locationTracker);
+ }
+ }
+ break;
+ }
+ }
+ }
+ return metadataRibbonItems;
+}
+//# sourceMappingURL=search-tags-ribbon.js.map \ No newline at end of file
diff --git a/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/secondary-short-categories-metadata-ribbon-item.js b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/secondary-short-categories-metadata-ribbon-item.js
new file mode 100644
index 0000000..c5469c7
--- /dev/null
+++ b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/secondary-short-categories-metadata-ribbon-item.js
@@ -0,0 +1,27 @@
+import { MetadataRibbonItem } from "../../../api/models";
+import { isNullOrEmpty } from "../../../foundation/json-parsing/server-data";
+import { attributeAsArrayOrEmpty } from "../../../foundation/media/attributes";
+import * as metricsHelpersImpressions from "../../metrics/helpers/impressions";
+import * as metricsHelpersLocation from "../../metrics/helpers/location";
+export function createMetadataRibbonItems(objectGraph, data, lockup, dedupeSet, metricsOptions) {
+ const secondaryGenres = attributeAsArrayOrEmpty(data, "secondaryGenreShortDisplayNames");
+ if (isNullOrEmpty(secondaryGenres)) {
+ return null;
+ }
+ const secondaryCategoryItems = secondaryGenres.map((secondaryGenre) => {
+ const categoryItem = new MetadataRibbonItem("textLabel");
+ // Workaround for changing the moduleType to secondaryGenreShortDisplayNames from secondaryGenreShortDisplayName
+ // otherwise native doesnt layout the secondary genres correctly
+ // will be fixed with rdar://127458403 (Allow unknown metadataribbon items)
+ categoryItem.moduleType = "genreShortDisplayName";
+ categoryItem.labelText = secondaryGenre;
+ const impressionOptions = metricsHelpersImpressions.impressionOptionsForMetadataRibbonItem(metricsOptions, "genreDisplayName", categoryItem.labelText, "static");
+ metricsHelpersImpressions.addImpressionFieldsToSearchMetadataRibbonItem(objectGraph, categoryItem, impressionOptions);
+ metricsHelpersLocation.nextPosition(metricsOptions.locationTracker);
+ return categoryItem;
+ });
+ return secondaryCategoryItems.filter((category) => {
+ return category.labelText != null && !dedupeSet.has(category.labelText);
+ });
+}
+//# sourceMappingURL=secondary-short-categories-metadata-ribbon-item.js.map \ No newline at end of file
diff --git a/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/short-category-metadata-ribbon-item.js b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/short-category-metadata-ribbon-item.js
new file mode 100644
index 0000000..16a148a
--- /dev/null
+++ b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/short-category-metadata-ribbon-item.js
@@ -0,0 +1,36 @@
+import { isNothing, isSome } from "@jet/environment";
+import { MetadataRibbonItem } from "../../../api/models";
+import { attributeAsString } from "../../../foundation/media/attributes";
+import { categoryArtworkData } from "../../categories";
+import { artworkFromApiArtwork } from "../../content/content";
+import * as metricsHelpersImpressions from "../../metrics/helpers/impressions";
+export function createMetadataRibbonItems(objectGraph, data, lockup, dedupeSet, metricsOptions) {
+ const artworkData = categoryArtworkData(objectGraph, data, true);
+ const hasArtwork = isSome(artworkData);
+ const shortGenre = attributeAsString(data, "genreShortDisplayName");
+ if (shortGenre != null) {
+ if (dedupeSet.has(shortGenre)) {
+ return null;
+ }
+ else {
+ dedupeSet.add(shortGenre);
+ }
+ }
+ if (isNothing(shortGenre) || shortGenre.length === 0) {
+ return null;
+ }
+ const viewType = hasArtwork ? "imageWithLabel" : "textLabel";
+ const shortCategoryItem = new MetadataRibbonItem(viewType);
+ shortCategoryItem.moduleType = "genreShortDisplayName";
+ shortCategoryItem.labelText = shortGenre;
+ if (hasArtwork) {
+ shortCategoryItem.artwork = artworkFromApiArtwork(objectGraph, artworkData, {
+ useCase: 20 /* ArtworkUseCase.CategoryIcon */,
+ cropCode: "sr",
+ });
+ }
+ const impressionOptions = metricsHelpersImpressions.impressionOptionsForMetadataRibbonItem(metricsOptions, "genreDisplayName", shortCategoryItem.labelText, "static");
+ metricsHelpersImpressions.addImpressionFieldsToSearchMetadataRibbonItem(objectGraph, shortCategoryItem, impressionOptions);
+ return [shortCategoryItem];
+}
+//# sourceMappingURL=short-category-metadata-ribbon-item.js.map \ No newline at end of file
diff --git a/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/star-rating-metadata-ribbon-item.js b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/star-rating-metadata-ribbon-item.js
new file mode 100644
index 0000000..81587f8
--- /dev/null
+++ b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/star-rating-metadata-ribbon-item.js
@@ -0,0 +1,20 @@
+import { MetadataRibbonItem } from "../../../api/models";
+import * as serverData from "../../../foundation/json-parsing/server-data";
+import { contentAttributeAsBooleanOrFalse } from "../../content/attributes";
+import * as metricsHelpersImpressions from "../../metrics/helpers/impressions";
+export function createMetadataRibbonItems(objectGraph, data, lockup, dedupeSet, metricsOptions) {
+ const isPreorder = contentAttributeAsBooleanOrFalse(objectGraph, data, "isPreorder");
+ if (serverData.isDefinedNonNull(lockup.ratingCount) && serverData.isDefinedNonNull(lockup.rating) && !isPreorder) {
+ const starRatingItem = new MetadataRibbonItem("starRating");
+ starRatingItem.moduleType = "userRating";
+ starRatingItem.starRating = lockup.rating;
+ starRatingItem.labelText = lockup.ratingCount;
+ const impressionOptions = metricsHelpersImpressions.impressionOptionsForMetadataRibbonItem(metricsOptions, "userRating", "User Rating", "static");
+ metricsHelpersImpressions.addImpressionFieldsToSearchMetadataRibbonItem(objectGraph, starRatingItem, impressionOptions);
+ return [starRatingItem];
+ }
+ else {
+ return null;
+ }
+}
+//# sourceMappingURL=star-rating-metadata-ribbon-item.js.map \ No newline at end of file
diff --git a/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/tag-metadata-ribbon-item.js b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/tag-metadata-ribbon-item.js
new file mode 100644
index 0000000..37877c3
--- /dev/null
+++ b/node_modules/@jet-app/app-store/tmp/src/common/search/metadata-ribbon/tag-metadata-ribbon-item.js
@@ -0,0 +1,18 @@
+import { isNothing } from "@jet/environment";
+import { MetadataRibbonItem } from "../../../api/models";
+import * as mediaAttributes from "../../../foundation/media/attributes";
+import * as metricsHelpersImpressions from "../../metrics/helpers/impressions";
+export function createMetadataRibbonItems(objectGraph, data, lockup, dedupeSet, metricsOptions) {
+ const tagData = data;
+ const tagItem = new MetadataRibbonItem("textLabel");
+ tagItem.moduleType = "tag";
+ tagItem.labelText = mediaAttributes.attributeAsString(tagData, "name");
+ if (isNothing(tagItem.labelText) || tagItem.labelText.length === 0 || dedupeSet.has(tagItem.labelText)) {
+ return null;
+ }
+ const impressionOptions = metricsHelpersImpressions.impressionOptionsForMetadataRibbonItem(metricsOptions, tagData.id, tagItem.labelText, "tag_id");
+ metricsHelpersImpressions.addImpressionFieldsToSearchMetadataRibbonItem(objectGraph, tagItem, impressionOptions);
+ dedupeSet.add(tagItem.labelText);
+ return [tagItem];
+}
+//# sourceMappingURL=tag-metadata-ribbon-item.js.map \ No newline at end of file