summaryrefslogtreecommitdiff
path: root/node_modules/@jet-app/app-store/tmp/src/common/search/content/search-lockup-collection.js
blob: c5c85e79c50dbae6b38d604dd2f187ab34662a5d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
import { TodayCardDisplayStyle } from "./../../today/today-types";
/**
 * Builder for SearchLockupCollection.
 */
import { SearchLockupCollection } from "../../../api/models";
import { isDefinedNonNullNonEmpty, isNullOrEmpty } from "../../../foundation/json-parsing/server-data";
import { attributeAsArrayOrEmpty, attributeAsString } from "../../../foundation/media/attributes";
import { relationshipCollection } from "../../../foundation/media/relationships";
import { createArtworkForResource } from "../../content/artwork/artwork";
import { notesFromData } from "../../content/content";
import { currentEditorialCollectionTreatment, } from "../../../foundation/experimentation/search-results-experiments";
import { actionFromData, lockupsFromData } from "../../lockups/lockups";
import { addImpressionFields, impressionOptions } from "../../metrics/helpers/impressions";
import { popLocation, pushContentLocation } from "../../metrics/helpers/location";
import { cardDisplayStyleFromData } from "../../today/today-card-util";
import { editorialSearchResultTagline } from "./search-content-common";
/**
 * Whether or not a given result data should be rendered as `SearchLockupCollection` model.
 * Semantically, every `collection` should be rendered as a lockup collection, but collections are currently backed by many different types of articles.
 * @param resultData Data from results endpoint.
 * @param searchResponseMetadata Meta blob from initial search request.
 */
export function resultDataShouldRenderLockupCollection(objectGraph, resultData, searchResponseMetadata) {
    // Filter supported platforms
    if (!(objectGraph.host.isiOS || objectGraph.host.isVision)) {
        return false;
    }
    if (currentEditorialCollectionTreatment(objectGraph, searchResponseMetadata) !==
        1 /* EditorialCollectionExperimentType.Swoosh */) {
        return false;
    }
    switch (resultData.type) {
        case "groupings":
            // Groupings can only be rendered if `contentIds` is present
            const collectionAdamIds = attributeAsArrayOrEmpty(resultData, "contentIds");
            return isDefinedNonNullNonEmpty(collectionAdamIds);
        case "rooms":
        case "multirooms":
            // Rooms, and multirooms always render as collection.
            return true;
        case "editorial-items":
            // Some subtypes of editorial items render as collection.
            const cardDisplayStyle = cardDisplayStyleFromData(resultData);
            switch (cardDisplayStyle) {
                case TodayCardDisplayStyle.List:
                case TodayCardDisplayStyle.NumberedList:
                case TodayCardDisplayStyle.Grid:
                case TodayCardDisplayStyle.River:
                    return true;
                default:
                    return false;
            }
        default:
            return false;
    }
}
/**
 * Create a `SearchLockupCollection` from search results.
 * @param resultData Data from results endpoint.
 * @param lockupOptions Options for lockups shared throughout search results page.
 * @param metricsOptions Metrics context.
 */
export function lockupCollectionFromResultData(objectGraph, resultData, metricsOptions) {
    // Text
    const heading = lockupCollectionHeadingFromResultData(objectGraph, resultData);
    const headingArtwork = lockupCollectionHeadingArtworkFromResultData(objectGraph, resultData);
    const title = lockupCollectionTitleFromResultData(objectGraph, resultData);
    // Metrics for impression + location
    const lockupCollectionMetrics = impressionOptions(objectGraph, resultData, title, {
        targetType: "card",
        pageInformation: metricsOptions.pageInformation,
        locationTracker: metricsOptions.locationTracker,
    });
    pushContentLocation(objectGraph, lockupCollectionMetrics, title);
    // Click Action ("See All")
    const clickMetrics = {
        actionType: "navigate",
        targetType: "button",
        pageInformation: metricsOptions.pageInformation,
        locationTracker: metricsOptions.locationTracker,
        id: "See All",
        idType: "sequential",
    };
    const seeAllAction = actionFromData(objectGraph, resultData, clickMetrics, objectGraph.host.clientIdentifier);
    seeAllAction.title = objectGraph.loc.string("ACTION_SEE_ALL");
    // Lockups
    const listOptions = {
        lockupOptions: {
            metricsOptions: {
                pageInformation: metricsOptions.pageInformation,
                locationTracker: metricsOptions.locationTracker,
                targetType: "lockup",
            },
            skipDefaultClickAction: objectGraph.client.isVision,
            artworkUseCase: 8 /* ArtworkUseCase.SearchIcon */,
            hideCompatibilityBadge: objectGraph.client.isVision,
        },
        filter: 128 /* Filter.UnsupportedPlatform */,
    };
    let lockupData = relationshipCollection(resultData, "card-contents");
    if (isNullOrEmpty(lockupData)) {
        lockupData = relationshipCollection(resultData, "top-apps");
    }
    const items = lockupsFromData(objectGraph, lockupData, listOptions);
    popLocation(metricsOptions.locationTracker);
    // Lockup Collection
    const lockupCollection = new SearchLockupCollection(heading, title, items, seeAllAction, headingArtwork);
    addImpressionFields(objectGraph, lockupCollection, lockupCollectionMetrics);
    if (isNullOrEmpty(items)) {
        return null;
    }
    return lockupCollection;
}
// endregion
// region Heading
/**
 * Returns the title for given editorial results search results data.
 * @param resultData The result data to get a title for.
 */
function lockupCollectionTitleFromResultData(objectGraph, resultData) {
    const resultType = resultData.type;
    switch (resultType) {
        case "developers":
            return attributeAsString(resultData, "name");
        default:
            return notesFromData(objectGraph, resultData, "name");
    }
}
/**
 * Returns the heading for given editorial results search results data.
 * This builds on `editorialSearchResultTagline` with some additional search-specific logic
 * @param resultData The result data to get a heading for.
 */
function lockupCollectionHeadingFromResultData(objectGraph, resultData) {
    const resultType = resultData.type;
    if (resultType === "developers") {
        return objectGraph.loc.string("EDITORIAL_SEARCH_RESULT_TYPE_DEVELOPER_TITLE_CASE");
    }
    const editorialTagline = editorialSearchResultTagline(objectGraph, resultData);
    if (isDefinedNonNullNonEmpty(editorialTagline)) {
        return editorialTagline;
    }
    if (objectGraph.client.isVision) {
        return objectGraph.loc.string("EDITORIAL_SEARCH_RESULT_TYPE_COLLECTION_TITLE_CASE");
    }
    else {
        return objectGraph.loc.string("Search.EditorialSearchResultType.Heading.Collection");
    }
}
/**
 * Returns the heading artwork to use for a given editorial search results data.
 * @param resultData The result data to get heading artwork for.
 */
function lockupCollectionHeadingArtworkFromResultData(objectGraph, resultData) {
    if (!objectGraph.client.isVision) {
        return null;
    }
    const resultType = resultData.type;
    let imageName;
    switch (resultType) {
        case "developers":
            imageName = "person.crop.square";
            break;
        default:
            imageName = "appstore";
            break;
    }
    return createArtworkForResource(objectGraph, `systemimage://${imageName}`);
}
// endregion
//# sourceMappingURL=search-lockup-collection.js.map