@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.
Files changed (38) hide show
  1. package/README.md +33 -1
  2. package/dist/Dialog.d.ts +9 -2
  3. package/dist/Dialog.d.ts.map +1 -1
  4. package/dist/Dialog.js +19 -0
  5. package/dist/EventsHandler.d.ts.map +1 -1
  6. package/dist/EventsHandler.js +1 -0
  7. package/dist/__tests__/dialogGetCart.spec.d.ts +2 -0
  8. package/dist/__tests__/dialogGetCart.spec.d.ts.map +1 -0
  9. package/dist/__tests__/dialogGetCart.spec.js +50 -0
  10. package/dist/__tests__/publicTypes.spec.js +2 -0
  11. package/dist/__tests__/searchController.spec.js +32 -8
  12. package/dist/searchController.d.ts.map +1 -1
  13. package/dist/searchController.js +26 -27
  14. package/dist/services/dialogConfig.d.ts +3 -0
  15. package/dist/services/dialogConfig.d.ts.map +1 -0
  16. package/dist/services/dialogConfig.js +11 -0
  17. package/dist/types/constructor.d.ts +8 -5
  18. package/dist/types/constructor.d.ts.map +1 -1
  19. package/dist/types/dialogConfig.d.ts +7 -0
  20. package/dist/types/dialogConfig.d.ts.map +1 -0
  21. package/dist/types/dialogConfig.js +1 -0
  22. package/dist/types/events.d.ts +16 -2
  23. package/dist/types/events.d.ts.map +1 -1
  24. package/dist/types/events.js +1 -0
  25. package/dist/types/index.d.ts +1 -0
  26. package/dist/types/index.d.ts.map +1 -1
  27. package/dist/types/index.js +1 -0
  28. package/dist/types/searchAnalytics.d.ts +8 -0
  29. package/dist/types/searchAnalytics.d.ts.map +1 -1
  30. package/dist/types/searchController.d.ts +15 -3
  31. package/dist/types/searchController.d.ts.map +1 -1
  32. package/dist/utils/searchControllerAnalytics.d.ts +2 -0
  33. package/dist/utils/searchControllerAnalytics.d.ts.map +1 -1
  34. package/dist/utils/searchControllerAnalytics.js +12 -0
  35. package/dist/utils/searchRequests.d.ts +2 -2
  36. package/dist/utils/searchRequests.d.ts.map +1 -1
  37. package/dist/utils/searchRequests.js +5 -5
  38. 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 `addToCart()` require their callback — they throw an explicit configuration error when it is absent; every other feature works without callbacks.
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 { AddToCartInput, ChangeCartQuantityInput, GenericQuestionPayload, LegacyCheckoutParams, OpenAssistantPayload, OpenWithSuggestionsParams, ProductQuestionPayload, SubmitCheckoutParams } from "./types/events";
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.
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../src/Dialog.ts"],"names":[],"mappings":"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"}
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;AAiBhF,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"}
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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dialogGetCart.spec.d.ts.map
@@ -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", 490] */
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("resets to idle and invalidates in-flight work when the query gets too short", async () => {
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
- const inFlight = deferred();
230
- search.mockReturnValueOnce(inFlight.promise);
231
- controller.submit("shoes");
256
+ search.mockResolvedValue(response({ query: "s" }));
232
257
  controller.setQuery("s");
233
- inFlight.resolve(response());
258
+ vi.advanceTimersByTime(DEBOUNCE_MS);
234
259
  await settle();
235
- expect(search).toHaveBeenCalledTimes(1);
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,CA4K5C"}
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"}
@@ -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, normalizeQuery, readSearchResults, } from "./utils/searchRequests";
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 = typeof sections === "function" ? sections() : sections;
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
- if (error instanceof DOMException && error.name === "AbortError") {
60
- return; // Cancellation is not a search error.
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 = normalizeQuery(rawQuery);
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
- if (disposed) {
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.query === "") {
109
- return; // No query to paginate.
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,3 @@
1
+ import { DialogConfig } from "../types/dialogConfig";
2
+ export declare const loadDialogConfig: (apiKey: string, locale: string) => Promise<DialogConfig>;
3
+ //# sourceMappingURL=dialogConfig.d.ts.map
@@ -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()` and
30
- * `changeCartQuantity()` throw a configuration error when their callback is
31
- * absent. `changeCartQuantity` is optional within the set: check
32
- * `canChangeCartQuantity()` before calling it.
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,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AACnE,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;CACxE;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;;;;;;OAMG;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"}
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 {};
@@ -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":"AAAA,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,EAC9B,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,mBAAmB,+BAA+B,CAAC;AAEhE,oBAAY,YAAY;IACtB,cAAc,mBAAmB;IACjC,qBAAqB,0BAA0B;IAC/C,eAAe,oBAAoB;IACnC,YAAY,qBAAqB;IACjC,qBAAqB,qBAAqB;IAC1C,iBAAiB,sBAAsB;IACvC,qBAAqB,0BAA0B;IAC/C,yBAAyB,8BAA8B;IACvD,0BAA0B,+BAA+B;CAC1D;AACD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,MAAM,WAAW,sBAAuB,SAAQ,sBAAsB;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAClC,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AAED,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,oBAAoB,GAAG,mBAAmB,GAAG,cAAc,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,oBAAoB,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;CACb;AAQD,MAAM,WAAW,uBAAuB;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAKD,MAAM,WAAW,cAAe,SAAQ,uBAAuB;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAQD,MAAM,WAAW,iBAAkB,SAAQ,uBAAuB;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAKD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD,MAAM,WAAW,0BAA0B;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAGD,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,kBAAkB,GAC1B,sBAAsB,GACtB,sBAAsB,GACtB,iBAAiB,GACjB,oBAAoB,GACpB,0BAA0B,GAC1B,iBAAiB,GACjB,0BAA0B,GAC1B,6BAA6B,GAC7B,8BAA8B,CAAC;AAEnC,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,kBAAkB;IACjD,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,CAAC,CAAC;CACZ"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,8BAA8B,EAC9B,6BAA6B,EAC9B,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,mBAAmB,+BAA+B,CAAC;AAEhE,oBAAY,YAAY;IACtB,cAAc,mBAAmB;IACjC,qBAAqB,0BAA0B;IAC/C,eAAe,oBAAoB;IACnC,YAAY,qBAAqB;IACjC,qBAAqB,qBAAqB;IAC1C,iBAAiB,sBAAsB;IACvC,qBAAqB,0BAA0B;IAC/C,mBAAmB,wBAAwB;IAC3C,yBAAyB,8BAA8B;IACvD,0BAA0B,+BAA+B;CAC1D;AACD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,MAAM,WAAW,sBAAuB,SAAQ,sBAAsB;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAClC,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AAED,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,oBAAoB,GAAG,mBAAmB,GAAG,cAAc,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,oBAAoB,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;CACb;AAQD,MAAM,WAAW,uBAAuB;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAKD,MAAM,WAAW,cAAe,SAAQ,uBAAuB;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAQD,MAAM,WAAW,iBAAkB,SAAQ,uBAAuB;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAKD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD,MAAM,WAAW,0BAA0B;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAGD,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,kBAAkB,GAC1B,sBAAsB,GACtB,sBAAsB,GACtB,iBAAiB,GACjB,oBAAoB,GACpB,0BAA0B,GAC1B,iBAAiB,GACjB,0BAA0B,GAC1B,wBAAwB,GACxB,6BAA6B,GAC7B,8BAA8B,CAAC;AAEnC,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,kBAAkB;IACjD,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,CAAC,CAAC;CACZ"}
@@ -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 = {}));
@@ -7,4 +7,5 @@ export * from "./search";
7
7
  export * from "./searchAnalytics";
8
8
  export * from "./searchController";
9
9
  export * from "./assistantEvent";
10
+ export * from "./dialogConfig";
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -7,3 +7,4 @@ export * from "./search";
7
7
  export * from "./searchAnalytics";
8
8
  export * from "./searchController";
9
9
  export * from "./assistantEvent";
10
+ export * from "./dialogConfig";
@@ -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
- /** Submit after the debounce delay. */
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":"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"}
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,CAgD5B"}
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 normalizeQuery: (rawQuery: string) => string | undefined;
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;AAKF,eAAO,MAAM,cAAc,GAAI,UAAU,MAAM,KAAG,MAAM,GAAG,SAI1D,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"}
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
- // Match the API minimum query length.
12
- const MIN_QUERY_CODE_POINTS = 2;
13
- export const normalizeQuery = (rawQuery) => {
14
- const query = rawQuery.trim();
15
- return [...query].length >= MIN_QUERY_CODE_POINTS ? query : undefined;
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: [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@askdialog/dialog-sdk",
3
- "version": "2.18.1",
3
+ "version": "2.20.0",
4
4
  "private": false,
5
5
  "description": "Dialog SDK",
6
6
  "main": "dist/index.js",