@askdialog/dialog-sdk 2.18.1 → 2.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -1
- package/dist/Dialog.d.ts +9 -2
- package/dist/Dialog.d.ts.map +1 -1
- package/dist/Dialog.js +19 -0
- package/dist/EventsHandler.d.ts.map +1 -1
- package/dist/EventsHandler.js +1 -0
- package/dist/__tests__/dialogGetCart.spec.d.ts +2 -0
- package/dist/__tests__/dialogGetCart.spec.d.ts.map +1 -0
- package/dist/__tests__/dialogGetCart.spec.js +50 -0
- package/dist/__tests__/publicTypes.spec.js +2 -0
- package/dist/__tests__/searchController.spec.js +32 -8
- package/dist/searchController.d.ts.map +1 -1
- package/dist/searchController.js +26 -27
- package/dist/services/dialogConfig.d.ts +3 -0
- package/dist/services/dialogConfig.d.ts.map +1 -0
- package/dist/services/dialogConfig.js +11 -0
- package/dist/types/constructor.d.ts +8 -5
- package/dist/types/constructor.d.ts.map +1 -1
- package/dist/types/dialogConfig.d.ts +7 -0
- package/dist/types/dialogConfig.d.ts.map +1 -0
- package/dist/types/dialogConfig.js +1 -0
- package/dist/types/events.d.ts +16 -2
- package/dist/types/events.d.ts.map +1 -1
- package/dist/types/events.js +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/searchAnalytics.d.ts +8 -0
- package/dist/types/searchAnalytics.d.ts.map +1 -1
- package/dist/types/searchController.d.ts +15 -3
- package/dist/types/searchController.d.ts.map +1 -1
- package/dist/utils/searchControllerAnalytics.d.ts +2 -0
- package/dist/utils/searchControllerAnalytics.d.ts.map +1 -1
- package/dist/utils/searchControllerAnalytics.js +12 -0
- package/dist/utils/searchRequests.d.ts +2 -2
- package/dist/utils/searchRequests.d.ts.map +1 -1
- package/dist/utils/searchRequests.js +5 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -88,7 +88,7 @@ The optional `countryCode` (ISO 3166 alpha-2, e.g. `'FR'`, `'US'`) sets the regi
|
|
|
88
88
|
The addToCart function is triggered when a user clicks the AddToCart button.
|
|
89
89
|
The getProduct function is used to display product information in the assistant.
|
|
90
90
|
|
|
91
|
-
`callbacks` is **optional**: a search-only integration can construct the client with just `apiKey` and `locale`. Only `getProduct()` and `
|
|
91
|
+
`callbacks` is **optional**: a search-only integration can construct the client with just `apiKey` and `locale`. Only `getProduct()`, `addToCart()`, `changeCartQuantity()` and `getCart()` require their callback — they throw an explicit configuration error when it is absent; every other feature works without callbacks.
|
|
92
92
|
|
|
93
93
|
When the client is instantiated, it will automatically insert into the DOM the Dialog Assistant script, so you can interact with the assistant using `sendProductMessage` or `sendGenericMessage`. This assistant runtime always loads — it owns the shopper identity, consent handling and analytics bridge — while the heavy assistant UI stays lazy-loaded and is not fetched eagerly.
|
|
94
94
|
|
|
@@ -166,6 +166,33 @@ When set:
|
|
|
166
166
|
|
|
167
167
|
Omit the flag (or set it to `false`) to keep the default behavior — the add-to-cart CTA and analytics are unchanged.
|
|
168
168
|
|
|
169
|
+
### Reading the cart
|
|
170
|
+
|
|
171
|
+
The assistant reads the shopper's cart (lines, total, currency) to suggest products that go with it. On storefronts where it cannot read the cart itself — for example a headless storefront — pass the optional `callbacks.getCart`:
|
|
172
|
+
|
|
173
|
+
```ts
|
|
174
|
+
new Dialog({
|
|
175
|
+
apiKey: 'YOUR_API_KEY',
|
|
176
|
+
locale: 'fr-FR', currency: 'EUR',
|
|
177
|
+
callbacks: {
|
|
178
|
+
addToCart, getProduct,
|
|
179
|
+
getCart: async (): Promise<CartSnapshot | null> => ({
|
|
180
|
+
lines: [
|
|
181
|
+
{ productId: 'gid://shopify/Product/42', variantId: 'gid://shopify/ProductVariant/4242', quantity: 2, unitPrice: 12.5 },
|
|
182
|
+
],
|
|
183
|
+
totalAmount: 25, // line items after cart discounts, excluding shipping
|
|
184
|
+
currency: 'EUR', // ISO 4217
|
|
185
|
+
}),
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
- Amounts are in currency units (`12.5`, not cents); ids may be Shopify GIDs or raw ids, matching your product feed. Resolve `null` when the shopper has no cart.
|
|
191
|
+
- `client.canReadCart()` tells whether the callback was provided; `client.getCart()` resolves your snapshot, and rejects with a configuration error when the callback is absent.
|
|
192
|
+
- `getCart` is a read: `disableAddToCart` does not affect it.
|
|
193
|
+
|
|
194
|
+
Omit it to keep the default behavior.
|
|
195
|
+
|
|
169
196
|
### Getters
|
|
170
197
|
|
|
171
198
|
- apiKey
|
|
@@ -329,6 +356,7 @@ const controller = createSearchController({
|
|
|
329
356
|
surface: 'search_page', // where results are displayed
|
|
330
357
|
trackViewSearchResults: (params) => client.trackViewSearchResults(params),
|
|
331
358
|
trackSelectSearchResult: (params) => client.trackSelectSearchResult(params),
|
|
359
|
+
trackOpenedSearch: (params) => client.trackOpenedSearch(params),
|
|
332
360
|
},
|
|
333
361
|
navigate: (url) => router.push(url), // optional platform routing adapter
|
|
334
362
|
buildProductUrl: (hit) => `/products/${hit.handle}`, // optional, for hits without `url`
|
|
@@ -347,6 +375,8 @@ const unsubscribe = controller.subscribe((state) => {
|
|
|
347
375
|
}
|
|
348
376
|
});
|
|
349
377
|
|
|
378
|
+
input.onfocus = () => controller.open(); // search opened
|
|
379
|
+
closeButton.onclick = () => controller.close(); // reset without a request
|
|
350
380
|
input.oninput = () => controller.setQuery(input.value); // debounced
|
|
351
381
|
form.onsubmit = () => controller.submit(input.value); // immediate
|
|
352
382
|
nextButton.onclick = () => controller.setPage(controller.getState().page + 1);
|
|
@@ -364,6 +394,8 @@ Analytics send each product hit's `id` (the product id) as `product_id`; `naviga
|
|
|
364
394
|
Framework integrations:
|
|
365
395
|
|
|
366
396
|
- Subscribe to state changes and render results.
|
|
397
|
+
- Call `open()` when the search input gets focus. It emits `TRACK_OPENED_SEARCH` (`userId`, `surface`, `search_type`) on every focus; deduplication happens downstream.
|
|
398
|
+
- Call `close()` when the shopper dismisses search, instead of `setQuery('')`, which runs the empty-query search. It cancels pending requests, emits impressions already qualified and resets the state to idle; the next `open()` runs the empty-query search again.
|
|
367
399
|
- Call `observeResult(element, index)` for each result and `selectResult(index)` on selection. Use `{ navigate: false }` for middle-clicks and modified clicks. Call `preventDefault()` only when `selectResult` returns true.
|
|
368
400
|
- Pass `navigate` for router navigation. The integration owns URL synchronization.
|
|
369
401
|
- Create one controller per search surface and call `dispose()` on unmount.
|
package/dist/Dialog.d.ts
CHANGED
|
@@ -2,9 +2,10 @@ import { DialogConstructor } from "./types/constructor";
|
|
|
2
2
|
import { Theme } from "./types/theme";
|
|
3
3
|
import { DetailedLocaleInfo } from "./utils/localization";
|
|
4
4
|
import { Suggestion } from "./types/suggestion";
|
|
5
|
-
import {
|
|
5
|
+
import { DialogConfig } from "./types/dialogConfig";
|
|
6
|
+
import { AddToCartInput, CartSnapshot, ChangeCartQuantityInput, GenericQuestionPayload, LegacyCheckoutParams, OpenAssistantPayload, OpenWithSuggestionsParams, ProductQuestionPayload, SubmitCheckoutParams } from "./types/events";
|
|
6
7
|
import { SimplifiedProduct } from "./types/product";
|
|
7
|
-
import { SelectSearchResultParams, ViewSearchResultsParams } from "./types/searchAnalytics";
|
|
8
|
+
import { OpenedSearchParams, SelectSearchResultParams, ViewSearchResultsParams } from "./types/searchAnalytics";
|
|
8
9
|
import { EventsHandler } from "./EventsHandler";
|
|
9
10
|
import { SearchOptions, SearchRequest, SearchResponse } from "./types/search";
|
|
10
11
|
import { AssistantEvent } from "./types/assistantEvent";
|
|
@@ -35,6 +36,8 @@ export declare class Dialog {
|
|
|
35
36
|
getSuggestions(productId: string, options?: {
|
|
36
37
|
limit?: number;
|
|
37
38
|
}): Promise<Suggestion>;
|
|
39
|
+
/** The widget dialog config for this client's locale. */
|
|
40
|
+
getDialogConfig(): Promise<DialogConfig>;
|
|
38
41
|
/**
|
|
39
42
|
* Send one search request with names built by `searchIndexName`.
|
|
40
43
|
* Cancel through `options.signal`. HTTP errors reject with `DialogSearchError`;
|
|
@@ -61,10 +64,14 @@ export declare class Dialog {
|
|
|
61
64
|
addToCart(input: AddToCartInput): Promise<void>;
|
|
62
65
|
canChangeCartQuantity(): boolean;
|
|
63
66
|
changeCartQuantity(input: ChangeCartQuantityInput): Promise<void>;
|
|
67
|
+
canReadCart(): boolean;
|
|
68
|
+
getCart(): Promise<CartSnapshot | null>;
|
|
64
69
|
private _isCartWriteDisabled;
|
|
65
70
|
private _getCallbacksOrThrow;
|
|
66
71
|
registerAddToCartEvent(input: AddToCartInput): void;
|
|
67
72
|
registerSubmitCheckoutEvent(params: SubmitCheckoutParams | LegacyCheckoutParams): void;
|
|
73
|
+
/** Emit when the shopper opens search, e.g. focuses the search input. */
|
|
74
|
+
trackOpenedSearch(params: OpenedSearchParams): void;
|
|
68
75
|
/**
|
|
69
76
|
* Emit impressions batched by `createSearchImpressionTracker`.
|
|
70
77
|
* Use `items: []` for an empty result set.
|
package/dist/Dialog.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../src/Dialog.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EACL,kBAAkB,EAEnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EACL,cAAc,EACd,uBAAuB,EAEvB,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,yBAAyB,EACzB,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../src/Dialog.ts"],"names":[],"mappings":"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"}
|
package/dist/Dialog.js
CHANGED
|
@@ -6,6 +6,7 @@ import { getDetailedLocaleInfo, } from "./utils/localization";
|
|
|
6
6
|
import { ANONYMOUS_CUSTOMER_ID, CUSTOMER_ID } from "./constants/user";
|
|
7
7
|
import { DialogEvents, } from "./types/events";
|
|
8
8
|
import { EventsHandler } from "./EventsHandler";
|
|
9
|
+
import { loadDialogConfig } from "./services/dialogConfig";
|
|
9
10
|
import { loadSuggestions } from "./services/suggestions";
|
|
10
11
|
import { searchLexical } from "./services/search";
|
|
11
12
|
import { config } from "./config";
|
|
@@ -84,6 +85,10 @@ export class Dialog {
|
|
|
84
85
|
async getSuggestions(productId, options) {
|
|
85
86
|
return loadSuggestions(this._apiKey, this._locale, productId, options?.limit);
|
|
86
87
|
}
|
|
88
|
+
/** The widget dialog config for this client's locale. */
|
|
89
|
+
getDialogConfig() {
|
|
90
|
+
return loadDialogConfig(this._apiKey, this._locale);
|
|
91
|
+
}
|
|
87
92
|
/**
|
|
88
93
|
* Send one search request with names built by `searchIndexName`.
|
|
89
94
|
* Cancel through `options.signal`. HTTP errors reject with `DialogSearchError`;
|
|
@@ -186,6 +191,13 @@ export class Dialog {
|
|
|
186
191
|
return;
|
|
187
192
|
await this._getCallbacksOrThrow("changeCartQuantity").changeCartQuantity(input);
|
|
188
193
|
}
|
|
194
|
+
// A read, not a write: `disableAddToCart` does not gate it.
|
|
195
|
+
canReadCart() {
|
|
196
|
+
return this._callbacks?.getCart !== undefined;
|
|
197
|
+
}
|
|
198
|
+
async getCart() {
|
|
199
|
+
return this._getCallbacksOrThrow("getCart").getCart();
|
|
200
|
+
}
|
|
189
201
|
_isCartWriteDisabled(operation) {
|
|
190
202
|
if (!this._disableAddToCart)
|
|
191
203
|
return false;
|
|
@@ -228,6 +240,13 @@ export class Dialog {
|
|
|
228
240
|
currency: params.currency,
|
|
229
241
|
});
|
|
230
242
|
}
|
|
243
|
+
/** Emit when the shopper opens search, e.g. focuses the search input. */
|
|
244
|
+
trackOpenedSearch(params) {
|
|
245
|
+
this._eventsHandler.emitExternalEvent(DialogEvents.TRACK_OPENED_SEARCH, {
|
|
246
|
+
userId: this._userId,
|
|
247
|
+
...params,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
231
250
|
/**
|
|
232
251
|
* Emit impressions batched by `createSearchImpressionTracker`.
|
|
233
252
|
* Use `items: []` for an empty result set.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventsHandler.d.ts","sourceRoot":"","sources":["../src/EventsHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,aAAa,EAEb,4BAA4B,EAC7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAuB,WAAW,EAAgB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"EventsHandler.d.ts","sourceRoot":"","sources":["../src/EventsHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,aAAa,EAEb,4BAA4B,EAC7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAuB,WAAW,EAAgB,MAAM,gBAAgB,CAAC;AAkBhF,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,eAAe,CAAuB;gBAElC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAKpC,iBAAiB,CACtB,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EACzB,OAAO,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,GAC/B,IAAI;IAYA,mBAAmB,IAAI,IAAI;IAU3B,kBAAkB,IAAI,IAAI;IAIjC,OAAO,CAAC,sBAAsB;IAWvB,kBAAkB,CACvB,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,EAC5B,OAAO,CAAC,EAAE,4BAA4B,GACrC,IAAI;IAQA,gBAAgB,CACrB,QAAQ,EAAE,CACR,KAAK,EAAE,cAAc,CAAC,aAAa,GAAG,qBAAqB,CAAC,KACzD,IAAI,GACR,MAAM,IAAI;CA0Bd"}
|
package/dist/EventsHandler.js
CHANGED
|
@@ -6,6 +6,7 @@ import { DIALOG_CUSTOM_EVENT, DialogEvents } from "./types/events";
|
|
|
6
6
|
const BUFFERED_EVENT_TYPES = new Set([
|
|
7
7
|
DialogEvents.TRACK_ADD_TO_CART,
|
|
8
8
|
DialogEvents.TRACK_SUBMIT_CHECKOUT,
|
|
9
|
+
DialogEvents.TRACK_OPENED_SEARCH,
|
|
9
10
|
DialogEvents.TRACK_VIEW_SEARCH_RESULTS,
|
|
10
11
|
DialogEvents.TRACK_SELECT_SEARCH_RESULT,
|
|
11
12
|
]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialogGetCart.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/dialogGetCart.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { Dialog } from "../Dialog";
|
|
3
|
+
const buildDialog = (getCart, disableAddToCart = false) => {
|
|
4
|
+
const dialog = Object.create(Dialog.prototype);
|
|
5
|
+
Object.assign(dialog, {
|
|
6
|
+
_callbacks: {
|
|
7
|
+
addToCart: vi.fn(),
|
|
8
|
+
getProduct: vi.fn(),
|
|
9
|
+
...(getCart === undefined ? {} : { getCart }),
|
|
10
|
+
},
|
|
11
|
+
_disableAddToCart: disableAddToCart,
|
|
12
|
+
});
|
|
13
|
+
return dialog;
|
|
14
|
+
};
|
|
15
|
+
const snapshot = {
|
|
16
|
+
lines: [
|
|
17
|
+
{
|
|
18
|
+
productId: "gid://shopify/Product/42",
|
|
19
|
+
variantId: "gid://shopify/ProductVariant/4242",
|
|
20
|
+
quantity: 2,
|
|
21
|
+
unitPrice: 12.5,
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
totalAmount: 25,
|
|
25
|
+
currency: "EUR",
|
|
26
|
+
};
|
|
27
|
+
describe("Dialog.getCart", () => {
|
|
28
|
+
it("resolves the merchant's snapshot", async () => {
|
|
29
|
+
const getCart = vi.fn().mockResolvedValue(snapshot);
|
|
30
|
+
const dialog = buildDialog(getCart);
|
|
31
|
+
await expect(dialog.getCart()).resolves.toEqual(snapshot);
|
|
32
|
+
expect(getCart).toHaveBeenCalledOnce();
|
|
33
|
+
expect(dialog.canReadCart()).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
it("resolves null when the merchant has no cart", async () => {
|
|
36
|
+
const dialog = buildDialog(vi.fn().mockResolvedValue(null));
|
|
37
|
+
await expect(dialog.getCart()).resolves.toBeNull();
|
|
38
|
+
});
|
|
39
|
+
it("rejects with an explicit configuration error without the callback", async () => {
|
|
40
|
+
const dialog = buildDialog(undefined);
|
|
41
|
+
await expect(dialog.getCart()).rejects.toThrowError(/callbacks\.getCart/);
|
|
42
|
+
expect(dialog.canReadCart()).toBe(false);
|
|
43
|
+
});
|
|
44
|
+
it("is not affected by disableAddToCart", async () => {
|
|
45
|
+
const getCart = vi.fn().mockResolvedValue(snapshot);
|
|
46
|
+
const dialog = buildDialog(getCart, true);
|
|
47
|
+
await expect(dialog.getCart()).resolves.toEqual(snapshot);
|
|
48
|
+
expect(dialog.canReadCart()).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
@@ -10,6 +10,8 @@ describe("public API types", () => {
|
|
|
10
10
|
expectTypeOf().not.toMatchTypeOf();
|
|
11
11
|
expectTypeOf().toMatchTypeOf();
|
|
12
12
|
expectTypeOf().parameters.toMatchTypeOf();
|
|
13
|
+
expectTypeOf().returns.toEqualTypeOf();
|
|
14
|
+
expectTypeOf().toEqualTypeOf();
|
|
13
15
|
expectTypeOf().toEqualTypeOf();
|
|
14
16
|
expectTypeOf().parameters.toMatchTypeOf();
|
|
15
17
|
expectTypeOf().toMatchTypeOf();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* eslint max-lines: ["error",
|
|
1
|
+
/* eslint max-lines: ["error", 530] */
|
|
2
2
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
3
|
import { createSearchController } from "../searchController";
|
|
4
4
|
import { SearchStatus } from "../types/searchController";
|
|
@@ -224,16 +224,40 @@ describe("createSearchController", () => {
|
|
|
224
224
|
await settle();
|
|
225
225
|
expect(controller.getState().status).toBe(SearchStatus.EMPTY);
|
|
226
226
|
});
|
|
227
|
-
it("
|
|
227
|
+
it("runs the empty-query products search on open and tracks it with query_length 0", async () => {
|
|
228
|
+
const controller = createSearchController({
|
|
229
|
+
search,
|
|
230
|
+
language: "fr",
|
|
231
|
+
country: "FR",
|
|
232
|
+
sections: [{ index: "collections" }],
|
|
233
|
+
analytics: {
|
|
234
|
+
surface: "autocomplete",
|
|
235
|
+
trackViewSearchResults,
|
|
236
|
+
trackSelectSearchResult,
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
search.mockResolvedValue(response({ query: "" }));
|
|
240
|
+
controller.open();
|
|
241
|
+
await settle();
|
|
242
|
+
controller.open();
|
|
243
|
+
controller.selectResult(0, { navigate: false });
|
|
244
|
+
expect(search).toHaveBeenCalledTimes(1);
|
|
245
|
+
expect(search.mock.calls[0][0].requests).toEqual([
|
|
246
|
+
{ indexName: "products_fr_fr", query: "", page: 0, hitsPerPage: 12 },
|
|
247
|
+
]);
|
|
248
|
+
expect(controller.getState()).toMatchObject({
|
|
249
|
+
status: SearchStatus.SUCCESS,
|
|
250
|
+
query: "",
|
|
251
|
+
});
|
|
252
|
+
expect(trackSelectSearchResult).toHaveBeenCalledWith(expect.objectContaining({ query_length: 0 }));
|
|
253
|
+
});
|
|
254
|
+
it("searches from the first character after the debounce", async () => {
|
|
228
255
|
const controller = createController();
|
|
229
|
-
|
|
230
|
-
search.mockReturnValueOnce(inFlight.promise);
|
|
231
|
-
controller.submit("shoes");
|
|
256
|
+
search.mockResolvedValue(response({ query: "s" }));
|
|
232
257
|
controller.setQuery("s");
|
|
233
|
-
|
|
258
|
+
vi.advanceTimersByTime(DEBOUNCE_MS);
|
|
234
259
|
await settle();
|
|
235
|
-
expect(search).
|
|
236
|
-
expect(controller.getState().status).toBe(SearchStatus.IDLE);
|
|
260
|
+
expect(search.mock.calls[0][0].requests[0]).toMatchObject({ query: "s" });
|
|
237
261
|
});
|
|
238
262
|
it("resets pagination when a new query is submitted", async () => {
|
|
239
263
|
const controller = createController();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchController.d.ts","sourceRoot":"","sources":["../src/searchController.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EAGxB,MAAM,0BAA0B,CAAC;AASlC,wBAAgB,sBAAsB,CAAC,EACrC,MAAM,EACN,QAAQ,EACR,OAAO,EACP,SAAS,EACT,QAAQ,EACR,eAAe,EACf,UAAgB,EAChB,WAAgB,EAChB,QAAa,GACd,EAAE,uBAAuB,GAAG,gBAAgB,
|
|
1
|
+
{"version":3,"file":"searchController.d.ts","sourceRoot":"","sources":["../src/searchController.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EAGxB,MAAM,0BAA0B,CAAC;AASlC,wBAAgB,sBAAsB,CAAC,EACrC,MAAM,EACN,QAAQ,EACR,OAAO,EACP,SAAS,EACT,QAAQ,EACR,eAAe,EACf,UAAgB,EAChB,WAAgB,EAChB,QAAa,GACd,EAAE,uBAAuB,GAAG,gBAAgB,CA6K5C"}
|
package/dist/searchController.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { searchIndexName } from "./services/search";
|
|
2
2
|
import { SearchStatus, } from "./types/searchController";
|
|
3
3
|
import { createControllerAnalytics } from "./utils/searchControllerAnalytics";
|
|
4
|
-
import { buildSearchRequest, INITIAL_SEARCH_STATE,
|
|
4
|
+
import { buildSearchRequest, INITIAL_SEARCH_STATE, readSearchResults, requestedSections, } from "./utils/searchRequests";
|
|
5
5
|
export function createSearchController({ search, language, country, analytics, navigate, buildProductUrl, debounceMs = 100, hitsPerPage = 12, sections = [], }) {
|
|
6
6
|
const requestConfig = {
|
|
7
7
|
indexName: searchIndexName("products", language, country),
|
|
@@ -32,12 +32,15 @@ export function createSearchController({ search, language, country, analytics, n
|
|
|
32
32
|
abortController = undefined;
|
|
33
33
|
};
|
|
34
34
|
const run = async (query, page) => {
|
|
35
|
+
if (disposed) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
35
38
|
cancelPendingSearch();
|
|
36
39
|
abortController = new AbortController();
|
|
37
40
|
const id = requestId;
|
|
38
41
|
setState({ status: SearchStatus.LOADING, query, page });
|
|
39
42
|
try {
|
|
40
|
-
const requested =
|
|
43
|
+
const requested = requestedSections(query, sections);
|
|
41
44
|
const request = buildSearchRequest(query, page, requested, requestConfig);
|
|
42
45
|
const response = await search(request, {
|
|
43
46
|
signal: abortController.signal,
|
|
@@ -56,11 +59,9 @@ export function createSearchController({ search, language, country, analytics, n
|
|
|
56
59
|
});
|
|
57
60
|
}
|
|
58
61
|
catch (error) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
if (id !== requestId) {
|
|
63
|
-
return;
|
|
62
|
+
const aborted = error instanceof DOMException && error.name === "AbortError";
|
|
63
|
+
if (aborted || id !== requestId) {
|
|
64
|
+
return; // Cancellation and superseded requests are not search errors.
|
|
64
65
|
}
|
|
65
66
|
setState({
|
|
66
67
|
status: SearchStatus.ERROR,
|
|
@@ -76,37 +77,21 @@ export function createSearchController({ search, language, country, analytics, n
|
|
|
76
77
|
return;
|
|
77
78
|
}
|
|
78
79
|
cancelPendingSearch();
|
|
79
|
-
const query =
|
|
80
|
-
if (query === undefined) {
|
|
81
|
-
setState(INITIAL_SEARCH_STATE);
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
80
|
+
const query = rawQuery.trim();
|
|
84
81
|
pendingQuery = query;
|
|
85
82
|
debounceTimer = setTimeout(() => void run(query, 0), debounceMs);
|
|
86
83
|
},
|
|
87
84
|
submit(rawQuery) {
|
|
88
|
-
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
cancelPendingSearch();
|
|
92
|
-
const query = normalizeQuery(rawQuery);
|
|
93
|
-
if (query === undefined) {
|
|
94
|
-
setState(INITIAL_SEARCH_STATE);
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
void run(query, 0);
|
|
85
|
+
void run(rawQuery.trim(), 0);
|
|
98
86
|
},
|
|
99
87
|
setPage(page) {
|
|
100
|
-
if (disposed) {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
88
|
if (pendingQuery !== undefined) {
|
|
104
89
|
// Submit pending input on page zero before allowing pagination.
|
|
105
90
|
void run(pendingQuery, 0);
|
|
106
91
|
return;
|
|
107
92
|
}
|
|
108
|
-
if (state.
|
|
109
|
-
return; // No
|
|
93
|
+
if (state.status === SearchStatus.IDLE) {
|
|
94
|
+
return; // No search to paginate.
|
|
110
95
|
}
|
|
111
96
|
void run(state.query, page);
|
|
112
97
|
},
|
|
@@ -144,6 +129,20 @@ export function createSearchController({ search, language, country, analytics, n
|
|
|
144
129
|
};
|
|
145
130
|
},
|
|
146
131
|
getState: () => state,
|
|
132
|
+
open() {
|
|
133
|
+
controllerAnalytics.open();
|
|
134
|
+
if ((state.status === SearchStatus.IDLE ||
|
|
135
|
+
state.status === SearchStatus.ERROR) &&
|
|
136
|
+
state.query === "" &&
|
|
137
|
+
pendingQuery === undefined) {
|
|
138
|
+
void run("", 0);
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
close() {
|
|
142
|
+
cancelPendingSearch();
|
|
143
|
+
controllerAnalytics.close();
|
|
144
|
+
setState(INITIAL_SEARCH_STATE);
|
|
145
|
+
},
|
|
147
146
|
dispose() {
|
|
148
147
|
disposed = true;
|
|
149
148
|
cancelPendingSearch();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialogConfig.d.ts","sourceRoot":"","sources":["../../src/services/dialogConfig.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAKrD,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,MAAM,EACd,QAAQ,MAAM,KACb,OAAO,CAAC,YAAY,CAWtB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { config } from "../config";
|
|
2
|
+
const DIALOG_CONFIG_PATH = "/widget/dialog-config";
|
|
3
|
+
const API_KEY_HEADER = "x-dialog-api-key";
|
|
4
|
+
export const loadDialogConfig = async (apiKey, locale) => {
|
|
5
|
+
const query = new URLSearchParams({ locale });
|
|
6
|
+
const response = await fetch(`${config.monolithApiUrl}${DIALOG_CONFIG_PATH}?${query.toString()}`, { headers: { [API_KEY_HEADER]: apiKey } });
|
|
7
|
+
if (!response.ok) {
|
|
8
|
+
throw new Error(`Dialog config request failed (${response.status}).`);
|
|
9
|
+
}
|
|
10
|
+
return (await response.json());
|
|
11
|
+
};
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { AddToCartInput, ChangeCartQuantityInput } from "./events";
|
|
1
|
+
import { AddToCartInput, CartSnapshot, ChangeCartQuantityInput } from "./events";
|
|
2
2
|
import { SimplifiedProduct } from "./product";
|
|
3
3
|
import { Theme } from "./theme";
|
|
4
4
|
export interface DialogCallbacks {
|
|
5
5
|
addToCart: (input: AddToCartInput) => Promise<void>;
|
|
6
6
|
getProduct: (productId: string, variantId?: string) => Promise<SimplifiedProduct>;
|
|
7
7
|
changeCartQuantity?: (input: ChangeCartQuantityInput) => Promise<void>;
|
|
8
|
+
/** Resolves the shopper's current cart, or `null` when there is none. */
|
|
9
|
+
getCart?: () => Promise<CartSnapshot | null>;
|
|
8
10
|
}
|
|
9
11
|
export interface CurrentProduct {
|
|
10
12
|
/** The catalog product id — must match the id in the Dialog product feed. */
|
|
@@ -26,10 +28,11 @@ export interface DialogConstructor {
|
|
|
26
28
|
countryCode?: string;
|
|
27
29
|
/**
|
|
28
30
|
* Commerce callbacks. Optional: a search-only integration can omit them —
|
|
29
|
-
* the assistant runtime still loads, and `getProduct()`, `addToCart()
|
|
30
|
-
* `changeCartQuantity()` throw a configuration error when
|
|
31
|
-
* absent. `changeCartQuantity`
|
|
32
|
-
* `canChangeCartQuantity()`
|
|
31
|
+
* the assistant runtime still loads, and `getProduct()`, `addToCart()`,
|
|
32
|
+
* `changeCartQuantity()` and `getCart()` throw a configuration error when
|
|
33
|
+
* their callback is absent. `changeCartQuantity` and `getCart` are optional
|
|
34
|
+
* within the set: check `canChangeCartQuantity()` / `canReadCart()` before
|
|
35
|
+
* calling them.
|
|
33
36
|
*/
|
|
34
37
|
callbacks?: DialogCallbacks;
|
|
35
38
|
theme?: Partial<Theme>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constructor.d.ts","sourceRoot":"","sources":["../../src/types/constructor.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"constructor.d.ts","sourceRoot":"","sources":["../../src/types/constructor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,YAAY,EACZ,uBAAuB,EACxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,UAAU,EAAE,CACV,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,KACf,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAChC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAEzC,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;OAMG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type SearchBusinessRanking = "best_sellers" | "newest" | "price_asc" | "price_desc";
|
|
2
|
+
/** The part of the widget dialog config the SDK reads. */
|
|
3
|
+
export interface DialogConfig {
|
|
4
|
+
/** Absent when the merchant chose no business ranking. */
|
|
5
|
+
searchBusinessRanking?: SearchBusinessRanking;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=dialogConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialogConfig.d.ts","sourceRoot":"","sources":["../../src/types/dialogConfig.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAC7B,cAAc,GACd,QAAQ,GACR,WAAW,GACX,YAAY,CAAC;AAEjB,0DAA0D;AAC1D,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;CAC/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/types/events.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SelectSearchResultEventPayload, ViewSearchResultsEventPayload } from "./searchAnalytics";
|
|
1
|
+
import { OpenedSearchEventPayload, SelectSearchResultEventPayload, ViewSearchResultsEventPayload } from "./searchAnalytics";
|
|
2
2
|
export declare const DIALOG_CUSTOM_EVENT = "enableDialogAssistantEvent";
|
|
3
3
|
export declare enum DialogEvents {
|
|
4
4
|
OPEN_ASSISTANT = "open_assistant",
|
|
@@ -8,6 +8,7 @@ export declare enum DialogEvents {
|
|
|
8
8
|
SEND_GENERIC_QUESTION = "GENERIC_QUESTION",
|
|
9
9
|
TRACK_ADD_TO_CART = "TRACK_ADD_TO_CART",
|
|
10
10
|
TRACK_SUBMIT_CHECKOUT = "TRACK_SUBMIT_CHECKOUT",
|
|
11
|
+
TRACK_OPENED_SEARCH = "TRACK_OPENED_SEARCH",
|
|
11
12
|
TRACK_VIEW_SEARCH_RESULTS = "TRACK_VIEW_SEARCH_RESULTS",
|
|
12
13
|
TRACK_SELECT_SEARCH_RESULT = "TRACK_SELECT_SEARCH_RESULT"
|
|
13
14
|
}
|
|
@@ -78,6 +79,19 @@ export interface ChangeCartQuantityInput {
|
|
|
78
79
|
variantId?: string;
|
|
79
80
|
quantity: number;
|
|
80
81
|
}
|
|
82
|
+
export interface CartSnapshotLine {
|
|
83
|
+
productId: string;
|
|
84
|
+
variantId: string;
|
|
85
|
+
quantity: number;
|
|
86
|
+
unitPrice: number;
|
|
87
|
+
}
|
|
88
|
+
export interface CartSnapshot {
|
|
89
|
+
lines: CartSnapshotLine[];
|
|
90
|
+
/** Line items after cart discounts, excluding shipping. */
|
|
91
|
+
totalAmount: number;
|
|
92
|
+
/** ISO 4217. */
|
|
93
|
+
currency: string;
|
|
94
|
+
}
|
|
81
95
|
export interface TrackEventPayload extends AddToCartProductDetails {
|
|
82
96
|
userId?: string;
|
|
83
97
|
productId: string;
|
|
@@ -117,7 +131,7 @@ export interface LegacyCheckoutParams {
|
|
|
117
131
|
currency?: string;
|
|
118
132
|
variantId?: string;
|
|
119
133
|
}
|
|
120
|
-
export type DialogEventPayload = ProductQuestionPayload | GenericQuestionPayload | DiagnosticPayload | OpenAssistantPayload | OpenWithSuggestionsPayload | TrackEventPayload | SubmitCheckoutEventPayload | ViewSearchResultsEventPayload | SelectSearchResultEventPayload;
|
|
134
|
+
export type DialogEventPayload = ProductQuestionPayload | GenericQuestionPayload | DiagnosticPayload | OpenAssistantPayload | OpenWithSuggestionsPayload | TrackEventPayload | SubmitCheckoutEventPayload | OpenedSearchEventPayload | ViewSearchResultsEventPayload | SelectSearchResultEventPayload;
|
|
121
135
|
export interface DialogEvent<T = DialogEventPayload> {
|
|
122
136
|
type: DialogEvents;
|
|
123
137
|
payload: T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":"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"}
|
package/dist/types/events.js
CHANGED
|
@@ -8,6 +8,7 @@ export var DialogEvents;
|
|
|
8
8
|
DialogEvents["SEND_GENERIC_QUESTION"] = "GENERIC_QUESTION";
|
|
9
9
|
DialogEvents["TRACK_ADD_TO_CART"] = "TRACK_ADD_TO_CART";
|
|
10
10
|
DialogEvents["TRACK_SUBMIT_CHECKOUT"] = "TRACK_SUBMIT_CHECKOUT";
|
|
11
|
+
DialogEvents["TRACK_OPENED_SEARCH"] = "TRACK_OPENED_SEARCH";
|
|
11
12
|
DialogEvents["TRACK_VIEW_SEARCH_RESULTS"] = "TRACK_VIEW_SEARCH_RESULTS";
|
|
12
13
|
DialogEvents["TRACK_SELECT_SEARCH_RESULT"] = "TRACK_SELECT_SEARCH_RESULT";
|
|
13
14
|
})(DialogEvents || (DialogEvents = {}));
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC"}
|
package/dist/types/index.js
CHANGED
|
@@ -17,6 +17,11 @@ export interface SearchAnalyticsEnvelope {
|
|
|
17
17
|
/** Number of code points in the trimmed query. */
|
|
18
18
|
query_length: number;
|
|
19
19
|
}
|
|
20
|
+
/** The shopper opened search (focused the search input). */
|
|
21
|
+
export interface OpenedSearchParams {
|
|
22
|
+
surface: SearchSurface;
|
|
23
|
+
search_type: SearchType;
|
|
24
|
+
}
|
|
20
25
|
/** Position is one-based across pages: page 2 at 20 hits/page starts at 21. */
|
|
21
26
|
export interface SearchResultItem {
|
|
22
27
|
product_id: string;
|
|
@@ -39,4 +44,7 @@ export interface ViewSearchResultsEventPayload extends ViewSearchResultsParams {
|
|
|
39
44
|
export interface SelectSearchResultEventPayload extends SelectSearchResultParams {
|
|
40
45
|
userId?: string;
|
|
41
46
|
}
|
|
47
|
+
export interface OpenedSearchEventPayload extends OpenedSearchParams {
|
|
48
|
+
userId?: string;
|
|
49
|
+
}
|
|
42
50
|
//# sourceMappingURL=searchAnalytics.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchAnalytics.d.ts","sourceRoot":"","sources":["../../src/types/searchAnalytics.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,uEAKlB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,eAAO,MAAM,YAAY,sBAAuB,CAAC;AAEjD,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,OAAO,EAAE,aAAa,CAAC;IACvB,6CAA6C;IAC7C,WAAW,EAAE,UAAU,CAAC;IACxB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,+EAA+E;AAC/E,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAwB,SAAQ,uBAAuB;IACtE,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAED,qCAAqC;AACrC,MAAM,WAAW,wBAAyB,SAAQ,uBAAuB;IACvE,KAAK,EAAE,CAAC,gBAAgB,CAAC,CAAC;CAC3B;AAGD,MAAM,WAAW,6BAA8B,SAAQ,uBAAuB;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,8BACf,SAAQ,wBAAwB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
|
1
|
+
{"version":3,"file":"searchAnalytics.d.ts","sourceRoot":"","sources":["../../src/types/searchAnalytics.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,uEAKlB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,eAAO,MAAM,YAAY,sBAAuB,CAAC;AAEjD,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,OAAO,EAAE,aAAa,CAAC;IACvB,6CAA6C;IAC7C,WAAW,EAAE,UAAU,CAAC;IACxB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,4DAA4D;AAC5D,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,aAAa,CAAC;IACvB,WAAW,EAAE,UAAU,CAAC;CACzB;AAED,+EAA+E;AAC/E,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAwB,SAAQ,uBAAuB;IACtE,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAED,qCAAqC;AACrC,MAAM,WAAW,wBAAyB,SAAQ,uBAAuB;IACvE,KAAK,EAAE,CAAC,gBAAgB,CAAC,CAAC;CAC3B;AAGD,MAAM,WAAW,6BAA8B,SAAQ,uBAAuB;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,8BACf,SAAQ,wBAAwB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAyB,SAAQ,kBAAkB;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SearchIndex, SearchOptions, SearchProductHit, SearchRequest, SearchResponse, SearchResult, SearchSections } from "./search";
|
|
2
|
-
import { SearchSurface, SelectSearchResultParams, ViewSearchResultsParams } from "./searchAnalytics";
|
|
2
|
+
import { OpenedSearchParams, SearchSurface, SelectSearchResultParams, ViewSearchResultsParams } from "./searchAnalytics";
|
|
3
3
|
export declare const SearchStatus: {
|
|
4
4
|
readonly IDLE: "idle";
|
|
5
5
|
readonly LOADING: "loading";
|
|
@@ -15,7 +15,7 @@ export interface SearchSection {
|
|
|
15
15
|
}
|
|
16
16
|
export interface SearchControllerState {
|
|
17
17
|
status: SearchStatus;
|
|
18
|
-
/** Last submitted query, excluding pending input. */
|
|
18
|
+
/** Last submitted query, excluding pending input; `""` once the empty-query results run. */
|
|
19
19
|
query: string;
|
|
20
20
|
/** Zero-based page of the last request. */
|
|
21
21
|
page: number;
|
|
@@ -30,6 +30,8 @@ export interface SearchControllerAnalytics {
|
|
|
30
30
|
surface: SearchSurface;
|
|
31
31
|
trackViewSearchResults: (params: ViewSearchResultsParams) => void;
|
|
32
32
|
trackSelectSearchResult: (params: SelectSearchResultParams) => void;
|
|
33
|
+
/** Called by `open()`; optional so existing custom adapters keep compiling. */
|
|
34
|
+
trackOpenedSearch?: (params: OpenedSearchParams) => void;
|
|
33
35
|
}
|
|
34
36
|
export interface SearchControllerOptions {
|
|
35
37
|
/** Search function bound to its client, or a custom transport. */
|
|
@@ -49,7 +51,17 @@ export interface SearchControllerOptions {
|
|
|
49
51
|
}
|
|
50
52
|
/** Manage search requests, pagination and analytics independently of rendering. */
|
|
51
53
|
export interface SearchController {
|
|
52
|
-
/**
|
|
54
|
+
/**
|
|
55
|
+
* Record that the shopper opened search; call it when the search input gets focus.
|
|
56
|
+
* With no query yet, it runs the empty-query products search.
|
|
57
|
+
*/
|
|
58
|
+
open(): void;
|
|
59
|
+
/**
|
|
60
|
+
* Close search without a request: cancel pending and in-flight searches,
|
|
61
|
+
* flush qualified impressions and reset the state to idle with an empty query.
|
|
62
|
+
*/
|
|
63
|
+
close(): void;
|
|
64
|
+
/** Submit after the debounce delay; an empty query runs the empty-query search. */
|
|
53
65
|
setQuery(rawQuery: string): void;
|
|
54
66
|
/** Submit immediately. */
|
|
55
67
|
submit(rawQuery: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchController.d.ts","sourceRoot":"","sources":["../../src/types/searchController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,cAAc,EACf,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,YAAY;;;;IAIvB,yCAAyC;;;CAGjC,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAE5E,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,YAAY,CAAC;IACrB,
|
|
1
|
+
{"version":3,"file":"searchController.d.ts","sourceRoot":"","sources":["../../src/types/searchController.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,11 @@ import { SearchProductHit, SearchResult } from "../types/search";
|
|
|
2
2
|
import { SearchControllerAnalytics } from "../types/searchController";
|
|
3
3
|
/** Internal binding for search impressions and selections. */
|
|
4
4
|
export interface ControllerAnalyticsBinding {
|
|
5
|
+
open(): void;
|
|
5
6
|
onResponse(result: SearchResult<SearchProductHit>): void;
|
|
6
7
|
observeResult(element: Element, result: SearchResult<SearchProductHit>, index: number): void;
|
|
7
8
|
select(result: SearchResult<SearchProductHit>, index: number): void;
|
|
9
|
+
close(): void;
|
|
8
10
|
dispose(): void;
|
|
9
11
|
}
|
|
10
12
|
export declare function createControllerAnalytics(analytics: SearchControllerAnalytics): ControllerAnalyticsBinding;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchControllerAnalytics.d.ts","sourceRoot":"","sources":["../../src/utils/searchControllerAnalytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAKjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAMtE,8DAA8D;AAC9D,MAAM,WAAW,0BAA0B;IACzC,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IACzD,aAAa,CACX,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,YAAY,CAAC,gBAAgB,CAAC,EACtC,KAAK,EAAE,MAAM,GACZ,IAAI,CAAC;IACR,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACpE,OAAO,IAAI,IAAI,CAAC;CACjB;AAYD,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,yBAAyB,GACnC,0BAA0B,
|
|
1
|
+
{"version":3,"file":"searchControllerAnalytics.d.ts","sourceRoot":"","sources":["../../src/utils/searchControllerAnalytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAKjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAMtE,8DAA8D;AAC9D,MAAM,WAAW,0BAA0B;IACzC,IAAI,IAAI,IAAI,CAAC;IACb,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IACzD,aAAa,CACX,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,YAAY,CAAC,gBAAgB,CAAC,EACtC,KAAK,EAAE,MAAM,GACZ,IAAI,CAAC;IACR,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACpE,KAAK,IAAI,IAAI,CAAC;IACd,OAAO,IAAI,IAAI,CAAC;CACjB;AAYD,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,yBAAyB,GACnC,0BAA0B,CA4D5B"}
|
|
@@ -16,6 +16,12 @@ export function createControllerAnalytics(analytics) {
|
|
|
16
16
|
return impressions;
|
|
17
17
|
};
|
|
18
18
|
return {
|
|
19
|
+
open() {
|
|
20
|
+
analytics.trackOpenedSearch?.({
|
|
21
|
+
surface: analytics.surface,
|
|
22
|
+
search_type: "lexical",
|
|
23
|
+
});
|
|
24
|
+
},
|
|
19
25
|
onResponse(result) {
|
|
20
26
|
envelope = {
|
|
21
27
|
query_id: result.queryID,
|
|
@@ -45,6 +51,12 @@ export function createControllerAnalytics(analytics) {
|
|
|
45
51
|
tracker().forceImpression(item);
|
|
46
52
|
analytics.trackSelectSearchResult({ ...envelope, items: [item] });
|
|
47
53
|
},
|
|
54
|
+
close() {
|
|
55
|
+
// Emit qualified impressions, drop the rest; the next response starts a new tracker.
|
|
56
|
+
impressions?.disconnect();
|
|
57
|
+
impressions = undefined;
|
|
58
|
+
envelope = undefined;
|
|
59
|
+
},
|
|
48
60
|
dispose() {
|
|
49
61
|
impressions?.disconnect();
|
|
50
62
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SearchProductHit, SearchRequest, SearchResponse, SearchResult, SearchSections } from "../types/search";
|
|
2
|
-
import { SearchControllerState, SearchSection } from "../types/searchController";
|
|
2
|
+
import { SearchControllerOptions, SearchControllerState, SearchSection } from "../types/searchController";
|
|
3
3
|
export declare const INITIAL_SEARCH_STATE: SearchControllerState;
|
|
4
|
-
export declare const
|
|
4
|
+
export declare const requestedSections: (query: string, sections?: SearchControllerOptions["sections"]) => readonly SearchSection[];
|
|
5
5
|
interface SearchRequestConfig {
|
|
6
6
|
indexName: string;
|
|
7
7
|
language: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchRequests.d.ts","sourceRoot":"","sources":["../../src/utils/searchRequests.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,cAAc,EACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,qBAAqB,EACrB,aAAa,EAEd,MAAM,2BAA2B,CAAC;AAEnC,eAAO,MAAM,oBAAoB,EAAE,qBAOlC,CAAC;
|
|
1
|
+
{"version":3,"file":"searchRequests.d.ts","sourceRoot":"","sources":["../../src/utils/searchRequests.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,cAAc,EACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,aAAa,EAEd,MAAM,2BAA2B,CAAC;AAEnC,eAAO,MAAM,oBAAoB,EAAE,qBAOlC,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,OAAO,MAAM,EACb,WAAU,uBAAuB,CAAC,UAAU,CAAM,KACjD,SAAS,aAAa,EAMxB,CAAC;AAEF,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,aAAa;IACrB,QAAQ,EAAE,YAAY,CAAC,gBAAgB,CAAC,CAAC;IACzC,QAAQ,EAAE,cAAc,GAAG,SAAS,CAAC;CACtC;AAED,eAAO,MAAM,kBAAkB,GAC7B,OAAO,MAAM,EACb,MAAM,MAAM,EACZ,UAAU,SAAS,aAAa,EAAE,EAClC,+CAA+C,mBAAmB,KACjE,aAUD,CAAC;AAEH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,cAAc,EACtB,WAAW,SAAS,aAAa,EAAE,EACnC,kCAAkC,mBAAmB,KACpD,aAyBF,CAAC"}
|
|
@@ -8,11 +8,11 @@ export const INITIAL_SEARCH_STATE = {
|
|
|
8
8
|
sections: undefined,
|
|
9
9
|
error: undefined,
|
|
10
10
|
};
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
return
|
|
11
|
+
export const requestedSections = (query, sections = []) => {
|
|
12
|
+
if (query === "") {
|
|
13
|
+
return []; // The empty query only lists products.
|
|
14
|
+
}
|
|
15
|
+
return typeof sections === "function" ? sections() : sections;
|
|
16
16
|
};
|
|
17
17
|
export const buildSearchRequest = (query, page, sections, { indexName, language, country, hitsPerPage }) => ({
|
|
18
18
|
requests: [
|