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
|
import { isNothing } from "@jet/environment";
import * as models from "../../api/models";
import { FetchTimingMetricsBuilder } from "@jet/environment/metrics/fetch-timing-metrics-builder";
import { injectSEOData } from "../../api/models/web-renderable-page";
import { AbstractPageBuilder } from "../../common/builders/abstract-page-builder";
import * as search from "../../common/search/search";
import { makeCanonicalSearchResultsPageUrl, searchResultsPageRoutes } from "../../common/search/search-page-url";
import * as searchResultsFetching from "../../common/search/search-results-fetching";
import { injectWebNavigation } from "../../common/web-navigation/inject-web-navigation";
import { replacePlatformSelectorDestinationWithSearchResults } from "../../common/web-navigation/search-results-platform-selection";
import { withActiveIntent } from "../../foundation/dependencies/active-intent";
import { validateNeedsVisionRestriction } from "../../foundation/media/util";
/** Handles `SearchResultsIntent` to fetch the search results. This is for shelves v1. */
export class SearchResultsIntentController {
constructor() {
this.$intentKind = "SearchResultsIntent";
}
async perform(intent, objectGraph) {
return await fetchSearchResults(objectGraph, intent.requestDescriptor);
}
}
/** Handles `SearchResultsMoreIntent` to fetch more of the search results. This is for shelves v1. */
export class SearchResultsMoreIntentController {
constructor() {
this.$intentKind = "SearchResultsMoreIntent";
}
async perform(intent, objectGraph) {
return await fetchMoreSearchResults(objectGraph, intent.pageToken);
}
}
/** Handles `SegmentedSearchResultsPageIntent` to fetch the segmented search results. */
export class SegmentedSearchResultsPageIntentController {
constructor() {
this.$intentKind = "SegmentedSearchResultsPageIntent";
}
async perform(intent, objectGraph) {
return await fetchSegmentedSearchResults(objectGraph, intent.requestDescriptor);
}
}
/** Handles `SearchResultsPageIntent` to fetch the search results. This is for shelves 2.0. */
export class SearchResultsPageIntentController {
constructor() {
this.$intentKind = "SearchResultsPageIntent";
this.routes = searchResultsPageRoutes;
}
async perform(intent, objectGraphWithoutActiveIntnet) {
if (objectGraphWithoutActiveIntnet.client.isWeb && !intent.platform) {
// Search on the "web" client requires a platform; if we don't have one from the `Intent`, we should
// assume we want `iphone` results
intent.platform = "iphone";
}
return await withActiveIntent(objectGraphWithoutActiveIntnet, intent, async (objectGraph) => {
var _a;
validateNeedsVisionRestriction(objectGraph);
const searchResultsPage = await fetchSearchResultsPage(objectGraph, intent);
if (isNothing(searchResultsPage.canonicalURL)) {
searchResultsPage.canonicalURL = makeCanonicalSearchResultsPageUrl(objectGraph, intent);
}
if (objectGraph.client.isWeb) {
const webNavigation = injectWebNavigation(objectGraph, searchResultsPage, intent.platform);
webNavigation.searchAction.destination.term = intent.term;
replacePlatformSelectorDestinationWithSearchResults(objectGraph, webNavigation, intent);
injectSEOData(searchResultsPage, (_a = objectGraph.seo) === null || _a === void 0 ? void 0 : _a.getSEODataForSearchResultsPage(objectGraph, searchResultsPage, null));
}
return searchResultsPage;
});
}
actionFor(intent, objectGraph) {
const flowAction = new models.FlowAction("search");
flowAction.destination = intent;
flowAction.pageUrl = makeCanonicalSearchResultsPageUrl(objectGraph, intent);
return flowAction;
}
}
/** Handles `SearchResultsPageMoreIntent` to fetch more of the search results. This is for shelves 2.0. */
export class SearchResultsPageMoreIntentController {
constructor() {
this.$intentKind = "SearchResultsPageMoreIntent";
}
async perform(intent, objectGraph) {
return await fetchMoreSearchResultsPage(objectGraph, intent.pageToken);
}
}
/** Fetches search results for shelves v1. */
async function fetchSearchResults(objectGraph, requestDescriptor) {
const fetchTimingMetricsBuilder = new FetchTimingMetricsBuilder();
const modifiedObjectGraph = objectGraph.addingFetchTimingMetricsBuilder(fetchTimingMetricsBuilder);
const combinedSearchData = await searchResultsFetching.fetchSequentialSearchResultsData(modifiedObjectGraph, requestDescriptor);
if (combinedSearchData === null) {
return search.emptyResults(modifiedObjectGraph, requestDescriptor.facets);
}
return await search.searchResultsFromResponse(modifiedObjectGraph, combinedSearchData);
}
/** Fetches search results for segmented search results on visionOS */
async function fetchSegmentedSearchResults(objectGraph, requestDescriptor) {
const combinedSearchData = await searchResultsFetching.fetchSegmentedSearchResults(objectGraph, requestDescriptor);
if (combinedSearchData === null) {
return search.emptySegmentedResultsPage(objectGraph);
}
return await search.segmentedSearchResultsPageFromResponse(objectGraph, combinedSearchData);
}
/** Fetches more search results for shelves v1. */
async function fetchMoreSearchResults(objectGraph, token) {
return await search.paginatedSearchResultsWithToken(objectGraph, token);
}
/** Fetches search results for shelves 2.0. */
async function fetchSearchResultsPage(objectGraph, requestDescriptor) {
const fetchTimingMetricsBuilder = new FetchTimingMetricsBuilder();
const modifiedObjectGraph = objectGraph.addingFetchTimingMetricsBuilder(fetchTimingMetricsBuilder);
const combinedSearchData = await searchResultsFetching.fetchSequentialSearchResultsData(modifiedObjectGraph, requestDescriptor);
if (combinedSearchData === null) {
return search.emptyResultsPage(objectGraph, requestDescriptor.facets);
}
return await search.searchResultsPageFromResponse(modifiedObjectGraph, combinedSearchData);
}
/** Fetches more search results for shelves 2.0. */
async function fetchMoreSearchResultsPage(objectGraph, token) {
return await search.paginatedSearchResultsPageWithToken(objectGraph, token);
}
export class SearchResultsBuilder extends AbstractPageBuilder {
constructor(objectGraph, runtime) {
super("SearchResultsBuilder");
runtime.exportingService("SearchData", {
/** Fetches search results for shelves v1. */
async fetchResults(options) {
return await fetchSearchResults(objectGraph, options);
},
/** Fetches more search results for shelves v1. */
async fetchMoreResults(options) {
return await fetchMoreSearchResults(objectGraph, options.pageToken);
},
/** Fetches search results for shelves 2.0. */
async fetchSearchResultsPage(options) {
return await fetchSearchResultsPage(objectGraph, options);
},
/** Fetches more search results for shelves 2.0. */
async fetchMoreOfSearchResultsPage(options) {
return await fetchMoreSearchResultsPage(objectGraph, options.pageToken);
},
});
}
async handlePage(objectGraph, url, parameters, matchedRuleIdentifier, referrerData, isIncomingURL) {
throw new Error("No page routes specified");
}
pageRoute(objectGraph) {
return [];
}
pageType() {
return "unknown";
}
}
//# sourceMappingURL=search-results-controller.js.map
|