@sonic-equipment/ui 132.0.0 → 134.0.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 (130) hide show
  1. package/dist/address/address.d.ts +2 -13
  2. package/dist/algolia/{algolia-intialization.js → algolia-initialization.js} +7 -0
  3. package/dist/algolia/algolia-insights-provider.js +7 -0
  4. package/dist/algolia/algolia-search-provider.js +19 -0
  5. package/dist/algolia/use-algolia-insights.d.ts +13 -6
  6. package/dist/algolia/use-algolia-insights.js +93 -10
  7. package/dist/buttons/add-to-cart-button/connected-add-to-cart-button.js +1 -1
  8. package/dist/buttons/button/button.d.ts +4 -1
  9. package/dist/buttons/button/button.js +3 -2
  10. package/dist/country-selector/country-select/country-select.d.ts +1 -0
  11. package/dist/country-selector/country-select/country-select.js +2 -2
  12. package/dist/delivery-time/delivery-time.js +6 -5
  13. package/dist/display/info-display/info-display.d.ts +7 -0
  14. package/dist/display/info-display/info-display.js +8 -0
  15. package/dist/display/info-display/info-display.module.css.js +3 -0
  16. package/dist/exports.d.ts +20 -7
  17. package/dist/forms/checkbox/checkbox.d.ts +2 -1
  18. package/dist/forms/checkbox/checkbox.js +2 -2
  19. package/dist/forms/field-error/field-error.d.ts +2 -1
  20. package/dist/forms/field-error/field-error.js +3 -2
  21. package/dist/forms/input/input.d.ts +2 -0
  22. package/dist/forms/input/input.js +5 -3
  23. package/dist/forms/input/input.module.css.js +1 -1
  24. package/dist/forms/label/label.d.ts +3 -1
  25. package/dist/forms/label/label.js +3 -2
  26. package/dist/forms/switch/switch.d.ts +3 -1
  27. package/dist/forms/switch/switch.js +2 -2
  28. package/dist/forms/text-field/password-reveal-toggle/password-reveal-toggle.d.ts +10 -0
  29. package/dist/forms/text-field/password-reveal-toggle/password-reveal-toggle.js +18 -0
  30. package/dist/forms/text-field/password-reveal-toggle/password-reveal-toggle.module.css.js +3 -0
  31. package/dist/forms/text-field/text-field.d.ts +5 -3
  32. package/dist/forms/text-field/text-field.js +11 -3
  33. package/dist/forms/text-field/text-field.module.css.js +1 -1
  34. package/dist/forms/textarea/textarea.d.ts +1 -0
  35. package/dist/forms/textarea/textarea.js +3 -2
  36. package/dist/global-search/plugins/categories-plugin.js +2 -1
  37. package/dist/global-search/plugins/popular-categories-plugin.js +2 -0
  38. package/dist/global-search/plugins/query-suggestions-plugin.js +1 -0
  39. package/dist/global-search/plugins/quick-access-plugin.js +2 -2
  40. package/dist/global-search/search-result-panel/sections/with-results.js +0 -1
  41. package/dist/icons/stroke/stroke-dehashed-icon.js +7 -0
  42. package/dist/icons/stroke/stroke-hashed-icon.js +7 -0
  43. package/dist/index.js +22 -9
  44. package/dist/info-icon-tooltip/info-icon-tooltip.d.ts +7 -0
  45. package/dist/info-icon-tooltip/info-icon-tooltip.js +20 -0
  46. package/dist/info-icon-tooltip/info-icon-tooltip.module.css.js +3 -0
  47. package/dist/intl/translation-id.d.ts +1 -1
  48. package/dist/pages/checkout/cart-page/cart-page.js +6 -9
  49. package/dist/pages/checkout/cart-page/components/empty-cart-page.d.ts +1 -0
  50. package/dist/pages/checkout/cart-page/components/empty-cart-page.js +11 -0
  51. package/dist/pages/checkout/components/billing-and-invoice-information.d.ts +7 -0
  52. package/dist/pages/checkout/components/billing-and-invoice-information.js +12 -0
  53. package/dist/pages/checkout/components/billing-and-invoice-information.module.css.js +3 -0
  54. package/dist/pages/checkout/constants.d.ts +8 -0
  55. package/dist/pages/checkout/constants.js +10 -0
  56. package/dist/pages/checkout/layouts/checkout-page-layout/components/checkout-page-section.module.css.js +1 -1
  57. package/dist/pages/checkout/order-confirmation-page/order-confirmation-page-content.d.ts +5 -0
  58. package/dist/pages/checkout/order-confirmation-page/order-confirmation-page-content.js +83 -0
  59. package/dist/pages/checkout/order-confirmation-page/order-confirmation-page.d.ts +4 -0
  60. package/dist/pages/checkout/order-confirmation-page/order-confirmation-page.js +41 -0
  61. package/dist/pages/checkout/order-confirmation-page/order-confirmation-page.module.css.js +3 -0
  62. package/dist/{checkout → pages/checkout/payment-page/components}/adyen-payment.js +5 -5
  63. package/dist/pages/checkout/payment-page/components/adyen-payment.module.css.js +3 -0
  64. package/dist/{checkout → pages/checkout/payment-page/components}/payment.d.ts +4 -2
  65. package/dist/pages/checkout/payment-page/components/payment.js +288 -0
  66. package/dist/pages/checkout/payment-page/components/payment.module.css.js +3 -0
  67. package/dist/pages/checkout/payment-page/payment-page-content.d.ts +15 -0
  68. package/dist/pages/checkout/payment-page/payment-page-content.js +43 -0
  69. package/dist/pages/checkout/payment-page/payment-page.js +13 -41
  70. package/dist/{checkout → pages/checkout/payment-page/utils}/parse-amount.js +1 -1
  71. package/dist/pages/checkout/shipping-page/components/edit-address.js +11 -7
  72. package/dist/pages/checkout/shipping-page/hooks/use-patch-shipping-details.d.ts +12 -0
  73. package/dist/pages/checkout/shipping-page/hooks/use-patch-shipping-details.js +21 -0
  74. package/dist/pages/checkout/shipping-page/shipping-page-content.d.ts +14 -0
  75. package/dist/pages/checkout/shipping-page/shipping-page-content.js +40 -0
  76. package/dist/pages/checkout/shipping-page/shipping-page.js +55 -78
  77. package/dist/pages/checkout/shipping-page/shipping-page.module.css.js +1 -1
  78. package/dist/pages/components/page/page.d.ts +3 -2
  79. package/dist/pages/components/page/page.js +3 -2
  80. package/dist/pages/components/page-meta-data/page-meta-data.d.ts +3 -4
  81. package/dist/pages/components/page-meta-data/page-meta-data.js +2 -2
  82. package/dist/pages/product/product-details-page/components/product-details-panel/product-details-panel.js +11 -1
  83. package/dist/pages/product/product-details-page/product-details-page.js +2 -10
  84. package/dist/pages/product/product-details-page/product-details.js +10 -4
  85. package/dist/pages/product/product-listing-page/product-listing-page-data-types.d.ts +1 -1
  86. package/dist/pages/product/product-listing-page/product-listing-page.js +2 -10
  87. package/dist/pages/product/product-listing-page/product-listing-product-overview/product-listing-product-overview.js +0 -1
  88. package/dist/pages/product/product-listing-page/product-listing.js +8 -1
  89. package/dist/pages/product/search-result-page/search-result-product-overview/search-result-product-overview.js +0 -1
  90. package/dist/pages/product/search-result-page/search-results-page.js +4 -7
  91. package/dist/shared/api/bff/model/bff.model.d.ts +4 -4
  92. package/dist/shared/api/bff/services/bff-service.js +1 -4
  93. package/dist/shared/api/storefront/hooks/cart/use-fetch-cart-by-id.d.ts +8 -0
  94. package/dist/shared/api/storefront/hooks/cart/use-fetch-cart-by-id.js +20 -0
  95. package/dist/shared/api/storefront/hooks/cart/use-fetch-current-cart-count.d.ts +1 -1
  96. package/dist/shared/api/storefront/hooks/cart/use-fetch-current-cart-count.js +3 -3
  97. package/dist/shared/api/storefront/hooks/cart/use-fetch-current-cart.d.ts +2 -5
  98. package/dist/shared/api/storefront/hooks/cart/use-fetch-current-cart.js +3 -16
  99. package/dist/shared/api/storefront/hooks/cart/use-patch-cart.js +11 -8
  100. package/dist/shared/api/storefront/hooks/cart/use-place-order.js +2 -2
  101. package/dist/shared/fetch/request.d.ts +18 -13
  102. package/dist/shared/fetch/request.js +22 -9
  103. package/dist/shared/ga/use-data-layer.d.ts +7 -3
  104. package/dist/shared/ga/use-data-layer.js +6 -1
  105. package/dist/shared/model/address.d.ts +13 -0
  106. package/dist/shared/providers/react-query-container.d.ts +2 -1
  107. package/dist/shared/providers/react-query-container.js +2 -2
  108. package/dist/shared/utils/date.d.ts +2 -0
  109. package/dist/shared/utils/date.js +11 -1
  110. package/dist/shared/utils/promise.d.ts +2 -0
  111. package/dist/shared/utils/promise.js +9 -0
  112. package/dist/sign-in-form/sign-in-form.d.ts +19 -0
  113. package/dist/sign-in-form/sign-in-form.js +49 -0
  114. package/dist/sign-in-form/sign-in-form.module.css.js +3 -0
  115. package/dist/styles.css +532 -314
  116. package/dist/tooltip/tooltip.d.ts +3 -2
  117. package/dist/tooltip/tooltip.js +12 -6
  118. package/package.json +1 -1
  119. package/dist/checkout/adyen-payment.module.css.js +0 -3
  120. package/dist/checkout/payment.js +0 -213
  121. package/dist/checkout/payment.module.css.js +0 -3
  122. package/dist/shared/utils/wait.d.ts +0 -1
  123. package/dist/shared/utils/wait.js +0 -5
  124. /package/dist/algolia/{algolia-intialization.d.ts → algolia-initialization.d.ts} +0 -0
  125. /package/dist/{checkout → pages/checkout/payment-page/components}/adyen-payment.d.ts +0 -0
  126. /package/dist/{checkout → pages/checkout/payment-page/hooks}/use-get-adyen-redirect-result.d.ts +0 -0
  127. /package/dist/{checkout → pages/checkout/payment-page/hooks}/use-get-adyen-redirect-result.js +0 -0
  128. /package/dist/{checkout → pages/checkout/payment-page/hooks}/use-has-returned-from-adyen.d.ts +0 -0
  129. /package/dist/{checkout → pages/checkout/payment-page/hooks}/use-has-returned-from-adyen.js +0 -0
  130. /package/dist/{checkout → pages/checkout/payment-page/utils}/parse-amount.d.ts +0 -0
@@ -142,10 +142,10 @@ export interface Usp {
142
142
  }
143
143
  export interface ProductDetailsPageDataResponse {
144
144
  breadCrumb: BreadCrumb[];
145
- included?: ProductSummary[];
146
- page?: PageModel;
145
+ included: ProductSummary[];
146
+ page: PageModel;
147
147
  product: ProductDetails;
148
- recentlyViewed?: ProductSummary[];
148
+ recentlyViewed: ProductSummary[];
149
149
  usps?: Usp[];
150
150
  }
151
151
  export interface ProductListingPageDataResponse {
@@ -156,7 +156,7 @@ export interface ProductListingPageDataResponse {
156
156
  categories: Category | null;
157
157
  categoryPages: string;
158
158
  hierarchicalCategories: string[];
159
- page?: PageModel;
159
+ page: PageModel;
160
160
  promoBanners: PromoBanners | null;
161
161
  }
162
162
  export {};
@@ -40,7 +40,7 @@ async function fetchProductListingPageData({ cultureCode, pageUrl, }) {
40
40
  url: `${config.BFF_API_URL}/plp/?pageUrl=${pageUrl}`,
41
41
  });
42
42
  return {
43
- breadCrumb: body.breadCrumb,
43
+ ...body,
44
44
  category: body.categories
45
45
  ? {
46
46
  href: body.categories.path,
@@ -53,9 +53,6 @@ async function fetchProductListingPageData({ cultureCode, pageUrl, }) {
53
53
  title: body.categories.shortDescription,
54
54
  }
55
55
  : undefined,
56
- categoryPages: body.categoryPages,
57
- hierarchicalCategories: body.hierarchicalCategories,
58
- page: body.page,
59
56
  promoBanners: body.promoBanners
60
57
  ? {
61
58
  top: body.promoBanners.top || undefined,
@@ -0,0 +1,8 @@
1
+ import { CartModel } from '../../model/storefront.model';
2
+ export interface UseFetchCartByIdArgs<T> {
3
+ enabled?: boolean;
4
+ forceRecalculation?: boolean;
5
+ id: string;
6
+ select?: (data: CartModel) => T;
7
+ }
8
+ export declare function useFetchCartById<T = CartModel>({ enabled, forceRecalculation, id, select, }: UseFetchCartByIdArgs<T>): import("@tanstack/react-query").UseQueryResult<T, Error>;
@@ -0,0 +1,20 @@
1
+ import { useQuery } from '@tanstack/react-query';
2
+ import { TIME } from '../../../../utils/time.js';
3
+ import { fetchCart } from '../../services/cart-service.js';
4
+
5
+ function useFetchCartById({ enabled = true, forceRecalculation = true, id, select, }) {
6
+ return useQuery({
7
+ enabled,
8
+ gcTime: 15 * TIME.MINUTE,
9
+ placeholderData: prev => prev,
10
+ queryFn: () => {
11
+ return fetchCart({ forceRecalculation, id });
12
+ },
13
+ queryKey: ['carts', id],
14
+ retry: 3,
15
+ select: select || (cartModel => cartModel),
16
+ staleTime: 15 * TIME.MINUTE,
17
+ });
18
+ }
19
+
20
+ export { useFetchCartById };
@@ -1 +1 @@
1
- export declare function useFetchCurrentCartCount(): number | undefined;
1
+ export declare function useFetchCurrentCartCount(): number;
@@ -1,8 +1,8 @@
1
- import { useFetchCurrentCartLines } from './use-fetch-current-cart-lines.js';
1
+ import { useFetchCurrentCart } from './use-fetch-current-cart.js';
2
2
 
3
3
  function useFetchCurrentCartCount() {
4
- const { data } = useFetchCurrentCartLines();
5
- return data?.reduce((acc, cartLine) => acc + (cartLine.qtyOrdered || 0), 0);
4
+ const { data } = useFetchCurrentCart();
5
+ return data?.totalCountDisplay || 0;
6
6
  }
7
7
 
8
8
  export { useFetchCurrentCartCount };
@@ -1,6 +1,3 @@
1
1
  import { CartModel } from '../../model/storefront.model';
2
- export declare function useFetchCurrentCart<T = CartModel>({ enabled, forceRecalculation, select, }?: {
3
- enabled?: boolean;
4
- forceRecalculation?: boolean;
5
- select?: (data: CartModel) => T;
6
- }): import("@tanstack/react-query").UseQueryResult<T, Error>;
2
+ import { UseFetchCartByIdArgs } from './use-fetch-cart-by-id';
3
+ export declare function useFetchCurrentCart<T = CartModel>(args?: Omit<UseFetchCartByIdArgs<T>, 'id'>): import("@tanstack/react-query").UseQueryResult<T, Error>;
@@ -1,20 +1,7 @@
1
- import { useQuery } from '@tanstack/react-query';
2
- import { TIME } from '../../../../utils/time.js';
3
- import { fetchCurrentCart } from '../../services/cart-service.js';
1
+ import { useFetchCartById } from './use-fetch-cart-by-id.js';
4
2
 
5
- function useFetchCurrentCart({ enabled = true, forceRecalculation = true, select, } = {}) {
6
- return useQuery({
7
- enabled,
8
- gcTime: 15 * TIME.MINUTE,
9
- placeholderData: prev => prev,
10
- queryFn: () => {
11
- return fetchCurrentCart({ forceRecalculation });
12
- },
13
- queryKey: ['carts', 'current'],
14
- retry: 3,
15
- select: select || (cartModel => cartModel),
16
- staleTime: 15 * TIME.MINUTE,
17
- });
3
+ function useFetchCurrentCart(args) {
4
+ return useFetchCartById({ ...args, id: 'current' });
18
5
  }
19
6
 
20
7
  export { useFetchCurrentCart };
@@ -1,17 +1,20 @@
1
+ import { useCallback } from 'react';
1
2
  import { useAwaitableMutation } from '../../../shared/hooks/use-awaitable-mutation.js';
2
3
  import { patchCart } from '../../services/cart-service.js';
3
4
 
4
5
  function usePatchCart({ skipInvalidation = false, } = {}) {
6
+ const onError = useCallback(({ args: [{ cart }], queryClient }) => {
7
+ queryClient.invalidateQueries({ queryKey: ['carts', cart.id] });
8
+ }, []);
9
+ const onSuccess = useCallback(({ args: [{ cart }], queryClient }) => {
10
+ if (skipInvalidation)
11
+ return;
12
+ queryClient.removeQueries({ queryKey: ['carts', cart.id] });
13
+ }, [skipInvalidation]);
5
14
  return useAwaitableMutation({
6
15
  mutationFn: patchCart,
7
- onError: ({ args: [{ cart }], queryClient }) => {
8
- queryClient.invalidateQueries({ queryKey: ['carts', cart.id] });
9
- },
10
- onSuccess: ({ args: [{ cart }], data: updatedCart, queryClient }) => {
11
- if (skipInvalidation)
12
- return;
13
- queryClient.setQueriesData({ exact: true, queryKey: ['carts', updatedCart.id] }, { ...updatedCart, cartLines: cart.cartLines });
14
- },
16
+ onError,
17
+ onSuccess,
15
18
  });
16
19
  }
17
20
 
@@ -4,10 +4,10 @@ import { placeOrder } from '../../services/cart-service.js';
4
4
 
5
5
  const usePlaceOrder = () => {
6
6
  const onComplete = useCallback(({ args: [{ cart }], queryClient }) => {
7
- queryClient.invalidateQueries({ queryKey: ['carts', cart.id] });
7
+ queryClient.removeQueries({ queryKey: ['carts', cart.id] });
8
8
  }, []);
9
9
  const onSuccess = useCallback(({ data: updatedCart, queryClient }) => {
10
- queryClient.setQueryData(['carts', updatedCart.id], updatedCart);
10
+ queryClient.removeQueries({ queryKey: ['carts', updatedCart.id] });
11
11
  }, []);
12
12
  return useAwaitableMutation({
13
13
  mutationFn: placeOrder,
@@ -49,10 +49,10 @@ export declare class InternalServerErrorRequestError extends RequestError {
49
49
  constructor(responseOrError: Response | unknown, options?: RequestErrorOptions);
50
50
  }
51
51
  export type RequestHeaders = Record<string, string | null | undefined>;
52
- type RequestHeadersWithBody = RequestHeaders & {
52
+ export type RequestHeadersWithBody = RequestHeaders & {
53
53
  'Content-Type': string;
54
54
  };
55
- interface BaseRequestOptions {
55
+ export interface BaseRequestOptions {
56
56
  cache?: RequestCache;
57
57
  credentials?: RequestCredentials;
58
58
  headers?: RequestHeaders;
@@ -65,38 +65,43 @@ interface BaseRequestOptions {
65
65
  timeout?: number;
66
66
  url: string;
67
67
  }
68
- interface RequestOptionsWithFormData extends BaseRequestOptions {
68
+ export interface RequestOptionsWithFormData extends BaseRequestOptions {
69
69
  body: FormData;
70
70
  headers: RequestHeaders;
71
71
  }
72
- interface RequestOptionsWithBody extends BaseRequestOptions {
72
+ export interface RequestOptionsWithBody extends BaseRequestOptions {
73
73
  body: unknown;
74
74
  headers: RequestHeadersWithBody;
75
75
  }
76
- interface RequestOptionsWithoutBody extends BaseRequestOptions {
76
+ export interface RequestOptionsWithoutBody extends BaseRequestOptions {
77
77
  body?: never;
78
78
  headers?: RequestHeaders;
79
79
  }
80
- type RequestOptions = RequestOptionsWithBody | RequestOptionsWithoutBody | RequestOptionsWithFormData;
81
- type AfterRequestHandler<T> = (args: {
80
+ export type RequestOptions = RequestOptionsWithBody | RequestOptionsWithoutBody | RequestOptionsWithFormData;
81
+ type BeforeRequestHandler = (options?: RequestOptions) => RequestOptions | void;
82
+ type BeforeRequestHandlerAsync = (options?: RequestOptions) => Promise<RequestOptions | void>;
83
+ export interface AfterRequestHandlerArgs<T> {
82
84
  body: T | undefined;
83
85
  error?: RequestError;
84
86
  options: RequestOptions;
85
87
  response?: Response;
86
- }) => void;
87
- type BeforeRequestHandler = (options?: RequestOptions) => RequestOptions | void;
88
- type RequestReturnType<T> = Promise<{
88
+ }
89
+ export type AfterRequestHandler<T> = (args: AfterRequestHandlerArgs<T>) => void;
90
+ export type AfterRequestHandlerAsync<T> = (args: AfterRequestHandlerArgs<T>) => Promise<void>;
91
+ export declare const isJsonBody: (options: RequestOptions) => boolean;
92
+ export declare const isFormData: (body: unknown) => body is FormData;
93
+ export type RequestReturnType<T> = Promise<{
89
94
  body: T;
90
95
  headers: Headers;
91
96
  status: number;
92
97
  statusText: string;
93
98
  }>;
94
- interface Request {
99
+ export interface Request {
95
100
  <T>(options: RequestOptions): RequestReturnType<T>;
96
- _afterHandlers: AfterRequestHandler<any>[];
97
- _beforeHandlers: BeforeRequestHandler[];
98
101
  after<T = any>(handler: AfterRequestHandler<T>): void;
102
+ after<T = any>(handler: AfterRequestHandlerAsync<T>): void;
99
103
  before(handler: BeforeRequestHandler): void;
104
+ before(handler: BeforeRequestHandlerAsync): void;
100
105
  headers: Omit<RequestHeaders, 'Content-Type'>;
101
106
  }
102
107
  export declare const request: Request;
@@ -1,4 +1,5 @@
1
1
  import qs from 'query-string';
2
+ import { isPromise } from '../utils/promise.js';
2
3
 
3
4
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
4
5
  const isResponse = (response) => Boolean(response?.json);
@@ -181,17 +182,20 @@ const createBody = (options) => {
181
182
  throw new Error(`request: Unknown body type for request ${url}. Unable to send request.`);
182
183
  };
183
184
  const createHeaders = (...headers) => {
184
- const allHeaders = {};
185
+ const allHeaders = new Headers();
185
186
  for (const header of headers) {
186
187
  if (!header)
187
188
  continue;
188
189
  for (const key of Object.keys(header)) {
189
190
  if (header[key])
190
- allHeaders[key] = header[key];
191
+ allHeaders.append(key, String(header[key]));
191
192
  }
192
193
  }
193
194
  return allHeaders;
194
195
  };
196
+ const beforeHandlers = [];
197
+ /* eslint-disable @typescript-eslint/no-explicit-any */
198
+ const afterHandlers = [];
195
199
  /* Because of a bug in the rollup dts package the following code must be put inside of a IIFE.
196
200
  * The bug occurs when assigning properties to the request function at the top level of this file.
197
201
  * request.headers = {}
@@ -204,7 +208,12 @@ const request = (function createRequestFunction() {
204
208
  let error;
205
209
  let isTimeout = false;
206
210
  try {
207
- options = request._beforeHandlers.reduce((options, handler) => handler(options) || options, options);
211
+ for await (const handler of beforeHandlers) {
212
+ const promiseOrOptions = handler(options);
213
+ options = isPromise(promiseOrOptions)
214
+ ? (await promiseOrOptions) || options
215
+ : promiseOrOptions || options;
216
+ }
208
217
  options.timeout = options.timeout || 1000 * 60 * 2;
209
218
  const url = qs.stringifyUrl({ query: options.params, url: options.url });
210
219
  const controller = new AbortController();
@@ -245,19 +254,23 @@ const request = (function createRequestFunction() {
245
254
  throw error;
246
255
  }
247
256
  finally {
248
- request._afterHandlers.forEach(handler => handler({ body, error, options, response }));
257
+ for await (const handler of afterHandlers) {
258
+ const promiseOrVoid = handler({ body, error, options, response });
259
+ if (isPromise(promiseOrVoid))
260
+ await promiseOrVoid;
261
+ }
249
262
  }
250
263
  };
251
264
  request.headers = {};
252
- request._afterHandlers = [];
253
- request._beforeHandlers = [];
254
265
  request.after = (handler) => {
255
- request._afterHandlers.push(handler);
266
+ afterHandlers.push(
267
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
268
+ handler);
256
269
  };
257
270
  request.before = (handler) => {
258
- request._beforeHandlers.push(handler);
271
+ beforeHandlers.push(handler);
259
272
  };
260
273
  return request;
261
274
  })();
262
275
 
263
- export { BadRequestError, ForbiddenRequestError, InternalServerErrorRequestError, NotFoundRequestError, RequestError, TimeoutRequestError, UnauthorizedRequestError, UnprocessableContentRequestError, isRequestError, request };
276
+ export { BadRequestError, ForbiddenRequestError, InternalServerErrorRequestError, NotFoundRequestError, RequestError, TimeoutRequestError, UnauthorizedRequestError, UnprocessableContentRequestError, isFormData, isJsonBody, isRequestError, request };
@@ -8,9 +8,13 @@ interface GAProductModel {
8
8
  unitListPriceDisplay: string;
9
9
  }
10
10
  interface GACartModel {
11
- cartLines: CartModel['cartLines'];
11
+ cartLines?: CartModel['cartLines'];
12
12
  currencySymbol: string;
13
+ orderGrandTotal: number;
13
14
  orderSubTotal: number;
15
+ shippingAndHandling: number;
16
+ totalTax: number;
17
+ trackId: string;
14
18
  }
15
19
  interface GACartLineModel {
16
20
  erpNumber: string;
@@ -26,12 +30,12 @@ interface CreateEcommerceEventArgsWithCartLine {
26
30
  event: GAEcommerceEvent;
27
31
  }
28
32
  interface CreateEcommerceEventArgsWithCart {
33
+ cart: GACartModel;
29
34
  event: GAEcommerceEvent;
30
- product: GAProductModel;
31
35
  }
32
36
  interface CreateEcommerceEventArgsWithProduct {
33
- cart: GACartModel;
34
37
  event: GAEcommerceEvent;
38
+ product: GAProductModel;
35
39
  }
36
40
  interface CreateEcommerceEvent {
37
41
  (args: CreateEcommerceEventArgsWithCart): GAEcommerceEvent;
@@ -12,7 +12,8 @@ function useDataLayer(eventOrArgs) {
12
12
  ...event,
13
13
  ecommerce: {
14
14
  ...event.ecommerce,
15
- currency: event.ecommerce?.currency ?? cart.currencySymbol,
15
+ currency: event.ecommerce?.currency ??
16
+ currencySymbolToISO[cart.currencySymbol],
16
17
  customer: event.ecommerce?.customer ?? customerNumber,
17
18
  items: cart.cartLines?.map(cartLine => ({
18
19
  item_id: cartLine.erpNumber,
@@ -20,6 +21,10 @@ function useDataLayer(eventOrArgs) {
20
21
  price: cartLine.pricing?.unitNetPrice,
21
22
  quantity: cartLine.qtyOrdered ?? 0,
22
23
  })) ?? [],
24
+ shipping: cart.shippingAndHandling,
25
+ tax: cart.totalTax,
26
+ transaction_id: cart.trackId,
27
+ value: cart.orderGrandTotal,
23
28
  },
24
29
  value: event.value ?? cart.orderSubTotal ?? 0,
25
30
  };
@@ -1,2 +1,15 @@
1
1
  export declare const validatePhone: (value: string) => boolean;
2
2
  export declare const validateEmail: (value: string) => boolean;
3
+ export interface AddressType {
4
+ address1?: string;
5
+ address2?: string;
6
+ address3?: string;
7
+ city?: string;
8
+ companyName?: string;
9
+ country?: string;
10
+ email?: string;
11
+ firstName?: string;
12
+ lastName?: string;
13
+ phone?: string;
14
+ postalCode?: string;
15
+ }
@@ -1,4 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
- export declare function ReactQueryContainer({ children }: {
2
+ export declare function ReactQueryContainer({ children, enableDevTools, }: {
3
3
  children: ReactNode;
4
+ enableDevTools?: boolean;
4
5
  }): import("react/jsx-runtime").JSX.Element;
@@ -15,8 +15,8 @@ const queryClient = new QueryClient({
15
15
  },
16
16
  },
17
17
  });
18
- function ReactQueryContainer({ children }) {
19
- return (jsxs(QueryClientProvider, { client: queryClient, children: [environment !== 'production' && (jsx(ReactQueryDevtools, { initialIsOpen: false })), children] }));
18
+ function ReactQueryContainer({ children, enableDevTools = environment !== 'production', }) {
19
+ return (jsxs(QueryClientProvider, { client: queryClient, children: [enableDevTools && jsx(ReactQueryDevtools, { initialIsOpen: false }), children] }));
20
20
  }
21
21
 
22
22
  export { ReactQueryContainer };
@@ -1,3 +1,4 @@
1
+ import { CultureCode } from '../../intl/types';
1
2
  export type DateUnit = 'day' | 'week' | 'month';
2
3
  export type DateUnitObject = {
3
4
  number: number;
@@ -9,3 +10,4 @@ export type DateThreshold = {
9
10
  };
10
11
  export declare function getDateUnitObject(date: Date): DateUnitObject;
11
12
  export declare function convertDateUnitToPluralOrSingle(unit: DateUnit, number: number): 'day' | 'days' | 'week' | 'weeks' | 'month' | 'months';
13
+ export declare function formatDateToLocaleString(date?: Date, cultureCode?: CultureCode): string;
@@ -54,5 +54,15 @@ function convertDateUnitToPluralOrSingle(unit, number) {
54
54
  return 'months';
55
55
  }
56
56
  }
57
+ function formatDateToLocaleString(date, cultureCode) {
58
+ if (!date || !cultureCode)
59
+ return '';
60
+ return date.toLocaleDateString(cultureCode, {
61
+ day: 'numeric',
62
+ month: 'long',
63
+ weekday: 'long',
64
+ year: 'numeric',
65
+ });
66
+ }
57
67
 
58
- export { convertDateUnitToPluralOrSingle, getDateUnitObject };
68
+ export { convertDateUnitToPluralOrSingle, formatDateToLocaleString, getDateUnitObject };
@@ -0,0 +1,2 @@
1
+ export declare function wait(ms: number): Promise<unknown>;
2
+ export declare function isPromise<T>(value: any): value is Promise<T>;
@@ -0,0 +1,9 @@
1
+ function wait(ms) {
2
+ return new Promise(resolve => setTimeout(resolve, ms));
3
+ }
4
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5
+ function isPromise(value) {
6
+ return value && typeof value.then === 'function';
7
+ }
8
+
9
+ export { isPromise, wait };
@@ -0,0 +1,19 @@
1
+ interface LoginData {
2
+ email: string;
3
+ guestSignin: false;
4
+ password: string;
5
+ remember?: boolean;
6
+ }
7
+ interface GuestLoginData {
8
+ guestSignin: true;
9
+ }
10
+ export interface SignInFormProps {
11
+ allowGuestSignIn?: boolean;
12
+ initialEmail?: string;
13
+ initialRemember?: boolean;
14
+ onSubmit?: ({ data }: {
15
+ data: LoginData | GuestLoginData;
16
+ }) => void;
17
+ }
18
+ export declare function SignInForm({ allowGuestSignIn, initialEmail, initialRemember, onSubmit, }: SignInFormProps): import("react/jsx-runtime").JSX.Element;
19
+ export {};
@@ -0,0 +1,49 @@
1
+ "use client";
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+ import { Form } from 'react-aria-components';
4
+ import clsx from 'clsx';
5
+ import { Button } from '../buttons/button/button.js';
6
+ import { Link } from '../buttons/link/link.js';
7
+ import { Switch } from '../forms/switch/switch.js';
8
+ import { TextField } from '../forms/text-field/text-field.js';
9
+ import { useFormattedMessage } from '../intl/use-formatted-message.js';
10
+ import { Heading } from '../typography/heading/heading.js';
11
+ import styles from './sign-in-form.module.css.js';
12
+
13
+ const GUEST_SIGN_IN_BUTTON_NAME = 'guestSignin';
14
+ function SignInForm({ allowGuestSignIn = false, initialEmail, initialRemember, onSubmit = () => { }, }) {
15
+ const t = useFormattedMessage();
16
+ const handleSubmit = (event) => {
17
+ event.preventDefault();
18
+ const form = event.currentTarget;
19
+ const formData = new FormData(form);
20
+ // in case of guest sign-in submit
21
+ const submitter = event.nativeEvent.submitter;
22
+ if (submitter?.name === GUEST_SIGN_IN_BUTTON_NAME) {
23
+ return onSubmit({
24
+ data: {
25
+ guestSignin: true,
26
+ },
27
+ });
28
+ }
29
+ // regular sign-in
30
+ const email = formData.get('email')?.toString();
31
+ const password = formData.get('password')?.toString();
32
+ const remember = Boolean(formData.get('remember'));
33
+ if (!email)
34
+ throw new Error('Email value is required');
35
+ if (!password)
36
+ throw new Error('Password value is required');
37
+ onSubmit({
38
+ data: {
39
+ email,
40
+ guestSignin: false,
41
+ password,
42
+ remember,
43
+ },
44
+ });
45
+ };
46
+ return (jsxs(Form, { "aria-label": t('sign in'), autoComplete: "off", className: clsx(styles['sign-in-form'], styles['form']), onSubmit: handleSubmit, validationBehavior: "native", children: [jsx("header", { className: styles['form-header'], children: jsx(Heading, { "data-test-selector": "PageTitle", italic: true, size: "m", tag: "h1", uppercase: true, children: t('sign in') }) }), jsxs("fieldset", { className: clsx(styles['form-fieldset'], styles['columns']), children: [jsx("div", { className: styles['form-segment'], children: jsx(TextField, { "data-test-selector": "signIn_userName", defaultValue: initialEmail, isRequired: true, label: t('Email'), name: "email", showLabel: true, type: "email" }) }), jsx("div", { className: styles['form-segment'], children: jsx(TextField, { "data-test-selector": "signIn_password", isRequired: true, label: t('Password'), name: "password", showLabel: true, type: "password" }) })] }), jsxs("footer", { className: styles['form-footer'], children: [jsx("div", { className: styles['form-segment'], children: jsx(Switch, { className: styles['floating'], defaultSelected: initialRemember, name: "remember", value: "true", children: t('Remember me') }) }), jsx("div", { className: styles['form-segment'], children: jsx(Button, { "data-test-selector": "signIn_submit", type: "submit", withArrow: true, children: t('sign in') }) }), jsxs("div", { className: styles['form-segment'], children: [jsx("p", { children: jsx(Link, { "data-test-selector": "signIn_forgotPassword", hasUnderline: true, href: "#", children: t('Forgot password?') }) }), jsxs("p", { children: [t('New user?'), ' ', jsx(Link, { "data-test-selector": "signInCreateNewAccount_createNewAccount", hasUnderline: true, href: "#", children: t('create account') })] })] }), allowGuestSignIn && (jsx("div", { className: styles['form-segment'], children: jsx(Button, { color: "secondary", isValidating: false, name: GUEST_SIGN_IN_BUTTON_NAME, type: "submit", value: "true", variant: "outline", children: t('Or sign in as guest') }) }))] })] }));
47
+ }
48
+
49
+ export { SignInForm };
@@ -0,0 +1,3 @@
1
+ var styles = {"sign-in-form":"sign-in-form-module-4DkkP","form":"sign-in-form-module-bGXUd","form-segment":"sign-in-form-module-TumIz","floating":"sign-in-form-module-bIzyz","form-fieldset":"sign-in-form-module-EoTYu","columns":"sign-in-form-module-9eIx-","form-footer":"sign-in-form-module-aYBAy"};
2
+
3
+ export { styles as default };