@websolutespa/bom-mixer-checkout 2.0.1-next.2 → 3.0.1

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/CHANGELOG.md CHANGED
@@ -1,35 +1,26 @@
1
1
  # @websolutespa/bom-mixer-checkout
2
2
 
3
- ## 2.0.1-next.2
3
+ ## 3.0.1
4
4
 
5
5
  ### Patch Changes
6
6
 
7
- - Updating: dependencies and build step
8
-
9
- ## 2.0.1-next.1
10
-
11
- ### Patch Changes
12
-
13
- - Fixing: types
14
-
15
- ## 2.0.1-next.0
7
+ - Updating: dependencies
8
+ - Updated dependencies
9
+ - @websolutespa/bom-mixer-emails@3.0.1
10
+ - @websolutespa/bom-mixer-models@3.0.2
11
+ - @websolutespa/bom-mixer-forms@3.0.1
12
+ - @websolutespa/bom-mixer-hooks@3.0.1
13
+ - @websolutespa/bom-mixer-icons@3.0.1
14
+ - @websolutespa/bom-mixer-store@3.0.1
15
+ - @websolutespa/bom-mixer-auth@3.0.1
16
+ - @websolutespa/bom-mixer-ui@3.0.1
17
+ - @websolutespa/bom-core@3.0.1
18
+
19
+ ## 3.0.0
16
20
 
17
21
  ### Major Changes
18
22
 
19
- - e74b305: Release: Payload 3.7.0
20
-
21
- ### Patch Changes
22
-
23
- - Updated dependencies [e74b305]
24
- - @websolutespa/bom-mixer-emails@2.0.1-next.0
25
- - @websolutespa/bom-mixer-models@2.0.1-next.0
26
- - @websolutespa/bom-mixer-forms@2.0.1-next.0
27
- - @websolutespa/bom-mixer-hooks@2.0.1-next.0
28
- - @websolutespa/bom-mixer-icons@2.0.1-next.0
29
- - @websolutespa/bom-mixer-store@2.0.1-next.0
30
- - @websolutespa/bom-mixer-auth@2.0.1-next.0
31
- - @websolutespa/bom-mixer-ui@2.0.1-next.0
32
- - @websolutespa/bom-core@2.0.1-next.0
23
+ - Release: Bom 3.0
33
24
 
34
25
  ## 1.9.3
35
26
 
@@ -1,6 +1,6 @@
1
1
  import { IArticle, ICartItem, ICheckoutItem, ICheckoutPartial, ICheckoutPaymentRedirect, IDelivery, IDiscount, IOrderDetail, IPayment, IRetailer } from "../retailer-DdroKqxH.js";
2
2
  import { IEquatable, IPaginationResult, QueryParams } from "@websolutespa/bom-core";
3
- import * as _websolutespa_bom_mixer_store_server3 from "@websolutespa/bom-mixer-store/server";
3
+ import * as _websolutespa_bom_mixer_store_server0 from "@websolutespa/bom-mixer-store/server";
4
4
  import { IEmailComponent, IEmailLayoutComponent } from "@websolutespa/bom-mixer-emails";
5
5
 
6
6
  //#region src/models/article/article.service.d.ts
@@ -13,13 +13,13 @@ declare function getArticlesPagination(params?: QueryParams): Promise<IPaginatio
13
13
  declare function getItems(items: ICartItem[], market: string, locale: string, user?: {
14
14
  id: IEquatable;
15
15
  }): Promise<ICheckoutItem[]>;
16
- declare function checkoutItemsHandler(): _websolutespa_bom_mixer_store_server3.IHandler<any>;
16
+ declare function checkoutItemsHandler(): _websolutespa_bom_mixer_store_server0.IHandler<any>;
17
17
  //# sourceMappingURL=cart.service.d.ts.map
18
18
  //#endregion
19
19
  //#region src/models/checkout/checkout.service.d.ts
20
- declare function checkoutInfoHandler(): _websolutespa_bom_mixer_store_server3.IHandler<any>;
20
+ declare function checkoutInfoHandler(): _websolutespa_bom_mixer_store_server0.IHandler<any>;
21
21
  declare function updateCheckout(checkout: ICheckoutPartial, action: string, market: string, locale: string): Promise<ICheckoutPartial>;
22
- declare function checkoutUpdateHandler(): _websolutespa_bom_mixer_store_server3.IHandler<any>;
22
+ declare function checkoutUpdateHandler(): _websolutespa_bom_mixer_store_server0.IHandler<any>;
23
23
  declare function checkoutSubmitHandler<T>({
24
24
  Component,
25
25
  Layout,
@@ -30,7 +30,7 @@ declare function checkoutSubmitHandler<T>({
30
30
  Layout: IEmailLayoutComponent;
31
31
  from?: string;
32
32
  bcc?: string;
33
- }): _websolutespa_bom_mixer_store_server3.IHandler<any>;
33
+ }): _websolutespa_bom_mixer_store_server0.IHandler<any>;
34
34
  declare function paymentResult(checkout: ICheckoutPartial, market: string, locale: string): Promise<ICheckoutPaymentRedirect>;
35
35
  //# sourceMappingURL=checkout.service.d.ts.map
36
36
  //#endregion
@@ -38,7 +38,7 @@ declare function paymentResult(checkout: ICheckoutPartial, market: string, local
38
38
  declare function getDeliveries(params?: QueryParams): Promise<IDelivery[]>;
39
39
  declare function getDelivery(id: IEquatable, params?: QueryParams): Promise<IDelivery | undefined>;
40
40
  declare function getDeliveriesPagination(params?: QueryParams): Promise<IPaginationResult<IDelivery>>;
41
- declare function checkoutDeliveryHandler(): _websolutespa_bom_mixer_store_server3.IHandler<any>;
41
+ declare function checkoutDeliveryHandler(): _websolutespa_bom_mixer_store_server0.IHandler<any>;
42
42
  //# sourceMappingURL=delivery.service.d.ts.map
43
43
  //#endregion
44
44
  //#region src/models/discount/discount.service.d.ts
@@ -46,7 +46,7 @@ declare function getDiscounts(params?: QueryParams): Promise<IDiscount[]>;
46
46
  declare function getDiscount(id: IEquatable, params?: QueryParams): Promise<IDiscount | undefined>;
47
47
  declare function getDiscountsPagination(params?: QueryParams): Promise<IPaginationResult<IDiscount>>;
48
48
  declare function setDiscountCode(discountCode: string, checkout: ICheckoutPartial, market: string, locale: string): Promise<ICheckoutPartial>;
49
- declare function checkoutDiscountHandler(): _websolutespa_bom_mixer_store_server3.IHandler<any>;
49
+ declare function checkoutDiscountHandler(): _websolutespa_bom_mixer_store_server0.IHandler<any>;
50
50
  //# sourceMappingURL=discount.service.d.ts.map
51
51
  //#endregion
52
52
  //#region src/models/order/order.service.d.ts
@@ -58,14 +58,14 @@ declare function getOrder(id: IEquatable, params?: QueryParams): Promise<IOrderD
58
58
  declare function getPayments(params?: QueryParams): Promise<IPayment[]>;
59
59
  declare function getPayment(id: IEquatable, params?: QueryParams): Promise<IPayment | undefined>;
60
60
  declare function getPaymentsPagination(params?: QueryParams): Promise<IPaginationResult<IPayment>>;
61
- declare function checkoutPaymentsHandler(): _websolutespa_bom_mixer_store_server3.IHandler<any>;
61
+ declare function checkoutPaymentsHandler(): _websolutespa_bom_mixer_store_server0.IHandler<any>;
62
62
  //# sourceMappingURL=payment.service.d.ts.map
63
63
  //#endregion
64
64
  //#region src/models/retailer/retailer.service.d.ts
65
65
  declare function getRetailers(params?: QueryParams): Promise<IRetailer[]>;
66
66
  declare function getRetailer(id: IEquatable, params?: QueryParams): Promise<IRetailer | undefined>;
67
67
  declare function getRetailersPagination(params?: QueryParams): Promise<IPaginationResult<IRetailer>>;
68
- declare function checkoutRetailersHandler(): _websolutespa_bom_mixer_store_server3.IHandler<any>;
68
+ declare function checkoutRetailersHandler(): _websolutespa_bom_mixer_store_server0.IHandler<any>;
69
69
  //# sourceMappingURL=retailer.service.d.ts.map
70
70
 
71
71
  //#endregion
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { IArticle, ICartAddItem, ICartItem, ICheckout, ICheckoutDelivery, ICheckoutDiscount, ICheckoutInfo, ICheckoutItem, ICheckoutPartial, ICheckoutPayment, ICheckoutPaymentRedirect, ICheckoutRetailer, IDelivery, IDiscount, IDiscountType, IOrder, IOrderDetail, IOrderStatus, IOrderStatusValue, IPayment, IRetailer, ITenant } from "./retailer-DdroKqxH.js";
2
2
  import { DrawerProps, UIStyledComponentProps } from "@websolutespa/bom-mixer-ui";
3
- import * as react1 from "react";
3
+ import * as react0 from "react";
4
4
  import * as zustand0 from "zustand";
5
- import * as zustand_middleware1 from "zustand/middleware";
5
+ import * as zustand_middleware0 from "zustand/middleware";
6
6
  import { StateStorage } from "zustand/middleware";
7
7
  import { IUser, IUserAddress } from "@websolutespa/bom-mixer-auth";
8
8
  import { IAddressOptions } from "@websolutespa/bom-mixer-models";
@@ -176,15 +176,15 @@ type CartActions = {
176
176
  type CartState = CartProps & {
177
177
  actions: CartActions;
178
178
  };
179
- declare const CartContext: react1.Context<(Omit<zustand0.StoreApi<CartState>, "persist"> & {
179
+ declare const CartContext: react0.Context<(Omit<zustand0.StoreApi<CartState>, "persist"> & {
180
180
  persist: {
181
- setOptions: (options: Partial<zustand_middleware1.PersistOptions<CartState, unknown>>) => void;
181
+ setOptions: (options: Partial<zustand_middleware0.PersistOptions<CartState, unknown>>) => void;
182
182
  clearStorage: () => void;
183
183
  rehydrate: () => Promise<void> | void;
184
184
  hasHydrated: () => boolean;
185
185
  onHydrate: (fn: (state: CartState) => void) => () => void;
186
186
  onFinishHydration: (fn: (state: CartState) => void) => () => void;
187
- getOptions: () => Partial<zustand_middleware1.PersistOptions<CartState, unknown>>;
187
+ getOptions: () => Partial<zustand_middleware0.PersistOptions<CartState, unknown>>;
188
188
  };
189
189
  }) | null>;
190
190
  type CartProviderProps = React.PropsWithChildren<{
@@ -197,7 +197,7 @@ type CartProviderProps = React.PropsWithChildren<{
197
197
  declare function CartProvider({
198
198
  children,
199
199
  ...props
200
- }: CartProviderProps): react1.JSX.Element;
200
+ }: CartProviderProps): react0.JSX.Element;
201
201
  declare function useCart<T>(selector: (state: CartState) => T): T;
202
202
  //#endregion
203
203
  //#region src/hooks/useCheckout/useCheckout.d.ts
@@ -214,15 +214,15 @@ type CheckoutActions = {
214
214
  type CheckoutState = CheckoutProps & {
215
215
  actions: CheckoutActions;
216
216
  };
217
- declare const CheckoutContext: react1.Context<(Omit<zustand0.StoreApi<CheckoutState>, "persist"> & {
217
+ declare const CheckoutContext: react0.Context<(Omit<zustand0.StoreApi<CheckoutState>, "persist"> & {
218
218
  persist: {
219
- setOptions: (options: Partial<zustand_middleware1.PersistOptions<CheckoutState, unknown>>) => void;
219
+ setOptions: (options: Partial<zustand_middleware0.PersistOptions<CheckoutState, unknown>>) => void;
220
220
  clearStorage: () => void;
221
221
  rehydrate: () => Promise<void> | void;
222
222
  hasHydrated: () => boolean;
223
223
  onHydrate: (fn: (state: CheckoutState) => void) => () => void;
224
224
  onFinishHydration: (fn: (state: CheckoutState) => void) => () => void;
225
- getOptions: () => Partial<zustand_middleware1.PersistOptions<CheckoutState, unknown>>;
225
+ getOptions: () => Partial<zustand_middleware0.PersistOptions<CheckoutState, unknown>>;
226
226
  };
227
227
  }) | null>;
228
228
  type CheckoutProviderProps = React.PropsWithChildren<{
@@ -234,7 +234,7 @@ type CheckoutProviderProps = React.PropsWithChildren<{
234
234
  declare function CheckoutProvider({
235
235
  children,
236
236
  ...props
237
- }: CheckoutProviderProps): react1.JSX.Element;
237
+ }: CheckoutProviderProps): react0.JSX.Element;
238
238
  declare function useCheckout<T>(selector: (state: CheckoutState) => T): T;
239
239
  //#endregion
240
240
  //#region src/hooks/useTenant/useTenant.d.ts
@@ -249,15 +249,15 @@ type TenantActions = {
249
249
  type TenantState = TenantProps & {
250
250
  actions: TenantActions;
251
251
  };
252
- declare const TenantContext: react1.Context<(Omit<zustand0.StoreApi<TenantState>, "persist"> & {
252
+ declare const TenantContext: react0.Context<(Omit<zustand0.StoreApi<TenantState>, "persist"> & {
253
253
  persist: {
254
- setOptions: (options: Partial<zustand_middleware1.PersistOptions<TenantState, unknown>>) => void;
254
+ setOptions: (options: Partial<zustand_middleware0.PersistOptions<TenantState, unknown>>) => void;
255
255
  clearStorage: () => void;
256
256
  rehydrate: () => Promise<void> | void;
257
257
  hasHydrated: () => boolean;
258
258
  onHydrate: (fn: (state: TenantState) => void) => () => void;
259
259
  onFinishHydration: (fn: (state: TenantState) => void) => () => void;
260
- getOptions: () => Partial<zustand_middleware1.PersistOptions<TenantState, unknown>>;
260
+ getOptions: () => Partial<zustand_middleware0.PersistOptions<TenantState, unknown>>;
261
261
  };
262
262
  }) | null>;
263
263
  type TenantProviderProps = React.PropsWithChildren<{
@@ -268,7 +268,7 @@ type TenantProviderProps = React.PropsWithChildren<{
268
268
  declare function TenantProvider({
269
269
  children,
270
270
  ...props
271
- }: TenantProviderProps): react1.JSX.Element;
271
+ }: TenantProviderProps): react0.JSX.Element;
272
272
  declare function useTenant<T>(selector: (state: TenantState) => T): T;
273
273
  //#endregion
274
274
  //#region src/order/order-address.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/cart/cart-drawer.tsx","../src/cart/cart-item.tsx","../src/checkout/checkout-basket.tsx","../src/checkout/checkout-basket-item.tsx","../src/checkout/checkout-delivery.tsx","../src/checkout/checkout-discount.tsx","../src/checkout/checkout-empty.tsx","../src/checkout/checkout-error.tsx","../src/checkout/checkout-forgot.tsx","../src/checkout/checkout-forgot-success.tsx","../src/checkout/checkout-info.tsx","../src/checkout/checkout-login.tsx","../src/checkout/checkout-payment.tsx","../src/checkout/checkout-register.tsx","../src/checkout/checkout-register-success.tsx","../src/checkout/checkout-review.tsx","../src/checkout/checkout-success.tsx","../src/checkout/checkout-user-info.tsx","../src/checkout/checkout-wizard.tsx","../src/hooks/useCart/useCart.tsx","../src/hooks/useCheckout/useCheckout.tsx","../src/hooks/useTenant/useTenant.tsx","../src/order/order-address.tsx","../src/order/order-item.tsx","../src/order/order-register.tsx","../src/order/order-summary.tsx","../src/order/order-summary-item.tsx"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/cart/cart-drawer.tsx","../src/cart/cart-item.tsx","../src/checkout/checkout-basket.tsx","../src/checkout/checkout-basket-item.tsx","../src/checkout/checkout-delivery.tsx","../src/checkout/checkout-discount.tsx","../src/checkout/checkout-empty.tsx","../src/checkout/checkout-error.tsx","../src/checkout/checkout-forgot.tsx","../src/checkout/checkout-forgot-success.tsx","../src/checkout/checkout-info.tsx","../src/checkout/checkout-login.tsx","../src/checkout/checkout-payment.tsx","../src/checkout/checkout-register.tsx","../src/checkout/checkout-register-success.tsx","../src/checkout/checkout-review.tsx","../src/checkout/checkout-success.tsx","../src/checkout/checkout-user-info.tsx","../src/checkout/checkout-wizard.tsx","../src/hooks/useCart/useCart.tsx","../src/hooks/useCheckout/useCheckout.tsx","../src/hooks/useTenant/useTenant.tsx","../src/order/order-address.tsx","../src/order/order-item.tsx","../src/order/order-register.tsx","../src/order/order-summary.tsx","../src/order/order-summary-item.tsx"],"sourcesContent":[],"mappings":"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"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["useStore","tenant?: ITenant","persistedState: any","currentState: TenantState","selector: (state: TenantState) => T","DEFAULT_PROPS: CartProps","useStore","article: IArticle","qty: number","item: IArticle","item: ICartItem","persistedState: any","currentState: CartState","selector: (state: CartState) => T","CartItem: React.FC<{ item: ICartItem }>","qty: number","Link","e: React.ChangeEvent<HTMLInputElement>","CartDrawer: React.FC<CartDrawerProps>","props: CartDrawerProps","useStore","checkout: ICheckoutPartial","persistedState: any","currentState: CheckoutState","selector: (state: CheckoutState) => T","CheckoutBasketItem: React.FC<{ item: ICheckoutItem }>","qty: number","CheckoutBasket: React.FC<CheckoutBasketProps>","CheckoutDelivery: React.FC<CheckoutDeliveryProps>","event: React.FormEvent<HTMLFormElement> | React.MouseEvent<HTMLElement>","delivery","response: ICheckoutPartial","error","event: React.ChangeEvent<HTMLInputElement>","CheckoutDiscount: React.FC<CheckoutDiscountProps>","event: React.FormEvent<HTMLFormElement> | React.MouseEvent<HTMLElement>","error","CheckoutEmpty: React.FC<CheckoutEmptyProps>","CheckoutError: React.FC<CheckoutErrorProps>","CheckoutForgot: React.FC<Props>","CheckoutForgotSuccess: React.FC<Props>","CheckoutLogin: React.FC<Props>","user: IUser","CheckoutRegister: React.FC<Props>","CheckoutRegisterSuccess: React.FC<Props>","CheckoutUserInfo: React.FC<CheckoutUserInfoProps>","value: any","rootValue: any","event: React.FormEvent<HTMLFormElement> | React.MouseEvent<HTMLElement>","error","CheckoutInfo: React.FC<CheckoutInfoProps>","view: string","view","info: ICheckoutInfo","user: IUser","user","CheckoutPayment: React.FC<CheckoutPaymentProps>","event: React.FormEvent<HTMLFormElement> | React.MouseEvent<HTMLElement>","payment","error","event: React.ChangeEvent<HTMLInputElement>","CheckoutReview: React.FC<CheckoutReviewProps>","event: React.FormEvent<HTMLFormElement> | React.MouseEvent<HTMLElement>","retailer","error","event: React.ChangeEvent<HTMLInputElement>","item: ICheckoutItem","i: number","OrderAddress: React.FC<OrderAddressProps>","OrderRegister: React.FC<OrderRegisterProps>","event: React.FormEvent<HTMLFormElement>","error","OrderSummaryItem: React.FC<{ item: ICheckoutItem }>","OrderSummary: React.FC<OrderSummaryProps>","CheckoutSuccess: React.FC<CheckoutSuccessProps>","CheckoutWizard: React.FC<CheckoutWizardProps>","checkout: ICheckoutPartial","checkout","items: ICheckoutItem[]","info: ICheckoutInfo","delivery: ICheckoutDelivery","retailer: ICheckoutRetailer","payment: ICheckoutPayment","OrderItem: React.FC<OrderItemProps>"],"sources":["../src/hooks/useTenant/useTenant.tsx","../src/hooks/useCart/useCart.tsx","../src/cart/cart-item.tsx","../src/cart/cart-drawer.tsx","../src/hooks/useCheckout/useCheckout.tsx","../src/checkout/checkout-basket-item.tsx","../src/checkout/checkout-basket.tsx","../src/checkout/checkout-delivery.tsx","../src/checkout/checkout-discount.tsx","../src/checkout/checkout-empty.tsx","../src/checkout/checkout-error.tsx","../src/checkout/checkout-forgot.tsx","../src/checkout/checkout-forgot-success.tsx","../src/checkout/checkout-login.tsx","../src/checkout/checkout-register.tsx","../src/checkout/checkout-register-success.tsx","../src/checkout/checkout-user-info.tsx","../src/checkout/checkout-info.tsx","../src/checkout/checkout-payment.tsx","../src/checkout/checkout-review.tsx","../src/order/order-address.tsx","../src/order/order-register.tsx","../src/order/order-summary-item.tsx","../src/order/order-summary.tsx","../src/checkout/checkout-success.tsx","../src/checkout/checkout-wizard.tsx","../src/models/order/order.ts","../src/order/order-item.tsx"],"sourcesContent":["import { createContext, useContext, useRef } from 'react';\r\nimport { createStore, useStore } from 'zustand';\r\nimport { StateStorage, createJSONStorage, persist } from 'zustand/middleware';\r\nimport { ITenant } from '../../models';\r\n\r\ntype TenantInitialProps = Partial<\r\n Omit<TenantProps, 'hydrated'>\r\n>;\r\n\r\ntype TenantProps = {\r\n hydrated: boolean;\r\n name?: string;\r\n tenant?: ITenant;\r\n};\r\n\r\ntype TenantActions = {\r\n setTenant(tenant?: ITenant): void;\r\n};\r\n\r\ntype TenantState = TenantProps & {\r\n actions: TenantActions,\r\n};\r\n\r\ntype TenantStore = ReturnType<typeof createTenantStore>;\r\n\r\nconst createTenantStore = ({ storage, ...initialProps }: { storage?: StateStorage } & TenantInitialProps) => {\r\n const DEFAULT_PROPS = {\r\n hydrated: false,\r\n };\r\n const useStore = createStore<TenantState>()(\r\n persist(\r\n (set, get) => ({\r\n ...DEFAULT_PROPS,\r\n ...initialProps,\r\n actions: {\r\n setTenant: (tenant?: ITenant) => set(state => ({ tenant })),\r\n },\r\n }),\r\n {\r\n name: `${initialProps.name || 'website'}-tenant`,\r\n storage: createJSONStorage(() => storage || localStorage),\r\n /*\r\n getStorage: () => {\r\n // console.log('useTenant.getStorage');\r\n return storage || localStorage;\r\n },\r\n */\r\n onRehydrateStorage: () => () => {\r\n useStore.setState({ hydrated: true });\r\n // console.log('onRehydrateStorage', useStore, useStore.getState());\r\n },\r\n merge: (persistedState: any, currentState: TenantState) => {\r\n if (persistedState.tenant && typeof persistedState.tenant === 'object') {\r\n currentState.tenant = { ...persistedState.tenant };\r\n }\r\n currentState.hydrated = true;\r\n return currentState;\r\n },\r\n }\r\n )\r\n );\r\n return useStore;\r\n};\r\n\r\nexport const TenantContext = createContext<TenantStore | null>(null);\r\n\r\ntype TenantProviderProps = React.PropsWithChildren<{\r\n tenant?: ITenant;\r\n name?: string;\r\n storage?: StateStorage;\r\n}>;\r\n\r\nfunction TenantProvider({ children, ...props }: TenantProviderProps) {\r\n const storeRef = useRef<TenantStore>(undefined);\r\n if (!storeRef.current) {\r\n storeRef.current = createTenantStore(props);\r\n }\r\n return (\r\n <TenantContext.Provider value={storeRef.current}>\r\n {children}\r\n </TenantContext.Provider>\r\n );\r\n}\r\n\r\nfunction useTenant<T>(selector: (state: TenantState) => T): T {\r\n let store = useContext(TenantContext);\r\n if (!store) {\r\n store = createTenantStore({});\r\n }\r\n return useStore(store, selector);\r\n}\r\n\r\nexport { TenantProvider, useTenant };\r\n\r\n","import { isObject } from '@websolutespa/bom-core';\r\nimport { createContext, useContext, useEffect, useRef, useState } from 'react';\r\nimport { createStore, useStore } from 'zustand';\r\nimport { StateStorage, createJSONStorage, persist } from 'zustand/middleware';\r\nimport { IArticle, ICartItem, ITenant } from '../../models';\r\nimport { useTenant } from '../useTenant/useTenant';\r\n\r\ntype CartProps = {\r\n hydrated: boolean;\r\n items: ICartItem[];\r\n name?: string;\r\n tenant?: ITenant;\r\n checkoutUrl?: string;\r\n shopUrl?: string;\r\n};\r\n\r\ntype CartActions = {\r\n count(): number;\r\n has(item: IArticle): boolean;\r\n find(item: IArticle): ICartItem | undefined;\r\n add(item: IArticle, qty?: number): void;\r\n remove(item: ICartItem): number;\r\n update(item: ICartItem): void;\r\n clear(): void;\r\n};\r\n\r\ntype CartState = CartProps & {\r\n actions: CartActions;\r\n};\r\n\r\ntype CartStore = ReturnType<typeof createCartStore>;\r\n\r\nconst createCartStore = ({ storage, ...initialProps }: { storage?: StateStorage } & Partial<Omit<CartProps, 'hydrated'>>) => {\r\n const DEFAULT_PROPS: CartProps = {\r\n hydrated: false,\r\n items: [],\r\n };\r\n const useStore = createStore<CartState>()(\r\n persist(\r\n (set, get) => ({\r\n ...DEFAULT_PROPS,\r\n ...initialProps,\r\n actions: {\r\n add: (article: IArticle, qty: number = 1) => set(state => {\r\n const items = state.items.slice();\r\n const index = items.findIndex(x => x.article.id === article.id);\r\n if (index === -1) {\r\n items.push({ article, price: article.price, fullPrice: article.price, qty });\r\n } else {\r\n items[index].qty += qty;\r\n }\r\n return { items };\r\n }),\r\n clear: () => set(state => ({ items: [] })),\r\n count: () => {\r\n return get().items.length;\r\n },\r\n find: (item: IArticle) => {\r\n return get().items.find(x => x.article.id === item.id);\r\n },\r\n has: (item: IArticle) => {\r\n return get().items.find(x => x.article.id === item.id) != null;\r\n },\r\n remove: (item: ICartItem) => {\r\n let count = 0;\r\n set(state => {\r\n const items = state.items.slice();\r\n const index = items.findIndex(x => x.article.id === item.article.id);\r\n if (index !== -1) {\r\n items.splice(index, 1);\r\n }\r\n count = items.length;\r\n return { items };\r\n });\r\n return count;\r\n },\r\n update: (item: ICartItem) => set(state => {\r\n const items = state.items.slice();\r\n const index = items.findIndex(x => x.article.id === item.article.id);\r\n if (index !== -1) {\r\n items[index] = item;\r\n }\r\n return { items };\r\n }),\r\n },\r\n }),\r\n {\r\n name: `${initialProps.name || 'website'}-cart-${initialProps.tenant?.id || ''}`,\r\n storage: createJSONStorage(() => storage || localStorage),\r\n /*\r\n getStorage: () => {\r\n // console.log('useCart.getStorage');\r\n return storage || localStorage;\r\n },\r\n */\r\n onRehydrateStorage: () => () => {\r\n useStore.setState({ hydrated: true });\r\n // console.log('onRehydrateStorage', useStore, useStore.getState());\r\n },\r\n merge: (persistedState: any, currentState: CartState) => {\r\n if (persistedState.items && Array.isArray(persistedState.items)) {\r\n currentState.items = [...persistedState.items];\r\n }\r\n if (persistedState.tenant && isObject(persistedState.tenant)) {\r\n currentState.tenant = { ...persistedState.tenant };\r\n }\r\n currentState.hydrated = true;\r\n return currentState;\r\n },\r\n }\r\n )\r\n );\r\n return useStore;\r\n};\r\n\r\nexport const CartContext = createContext<CartStore | null>(null);\r\n\r\ntype CartProviderProps = React.PropsWithChildren<{\r\n items?: ICartItem[];\r\n checkoutUrl?: string;\r\n shopUrl?: string;\r\n name?: string;\r\n storage?: StateStorage;\r\n}>;\r\n\r\nfunction CartProvider({ children, ...props }: CartProviderProps) {\r\n const storeRef = useRef<CartStore>(undefined);\r\n if (!storeRef.current) {\r\n storeRef.current = createCartStore(props);\r\n }\r\n const [tenant, setTenant] = useState<ITenant | undefined>();\r\n const storeTenant = useTenant(state => state.tenant);\r\n useEffect(() => {\r\n if (tenant !== storeTenant) {\r\n setTenant(storeTenant);\r\n storeRef.current = createCartStore({ ...props, tenant: storeTenant });\r\n console.log('CartProvider setTenant', storeTenant);\r\n }\r\n }, [props, storeTenant, tenant]);\r\n return (\r\n <CartContext.Provider value={storeRef.current}>\r\n {children}\r\n </CartContext.Provider>\r\n );\r\n}\r\n\r\nfunction useCart<T>(selector: (state: CartState) => T): T {\r\n const store = useContext(CartContext);\r\n if (!store) throw new Error('Missing CartContext.Provider in the tree');\r\n return useStore(store, selector);\r\n}\r\n\r\nexport { CartProvider, useCart };\r\n\r\n","import { useCurrency, useDrawer, useMounted } from '@websolutespa/bom-mixer-hooks';\r\nimport { IconMinus, IconPlus, IconTrash } from '@websolutespa/bom-mixer-icons';\r\nimport { Button, Card, Flex, Input, Media, Text } from '@websolutespa/bom-mixer-ui';\r\nimport Link from 'next/link';\r\nimport { useCart } from '../hooks/useCart/useCart';\r\nimport { ICartItem } from '../models/cart/cart';\r\n\r\nexport const CartItem: React.FC<{ item: ICartItem }> = ({ item }: { item: ICartItem }) => {\r\n const currency = useCurrency();\r\n const mounted = useMounted();\r\n const [drawer, openDrawer, closeDrawer] = useDrawer();\r\n const { update, remove } = useCart(state => state.actions);\r\n\r\n function onSetQty(qty: number) {\r\n if (qty > 0) {\r\n update({ ...item, qty });\r\n } else {\r\n onRemove();\r\n }\r\n }\r\n\r\n function onRemove() {\r\n const count = remove(item);\r\n if (count < 1) {\r\n closeDrawer();\r\n }\r\n }\r\n\r\n const article = item.article;\r\n if (!article) {\r\n return;\r\n }\r\n return (\r\n <>\r\n <Card marginBottom=\"2rem\" paddingBottom=\"1rem\" borderBottom=\"1px solid var(--color-neutral-300)\">\r\n <Flex.Row alignItems=\"flex-start\">\r\n <Flex>\r\n {article.media && (\r\n <Media item={article.media} aspectRatio={1} width=\"80px\" height=\"80px\" flex=\"0 0 80px\" rounded />\r\n )}\r\n </Flex>\r\n <Card.Content flex=\"1\" padding=\"0 1rem\">\r\n <Link href={article.href}>\r\n <Text variant=\"paragraph20\" fontWeight=\"700\" onClick={closeDrawer}>{article.title}</Text>\r\n </Link>\r\n {article.abstract && (\r\n <Text variant=\"paragraph30\" marginBottom=\"1rem\" dangerouslySetInnerHTML={{ __html: article.abstract }} />\r\n )}\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Button onClick={() => onSetQty(item.qty - 1)} ><IconMinus width=\"20px\" height=\"20px\" /></Button>\r\n <Input width=\"60px\" padding=\"0.2rem\" placeholder=\"qty\" value={item.qty.toString()} onChange={(e: React.ChangeEvent<HTMLInputElement>) => onSetQty(Number(e.target.value))} />\r\n <Button size=\"xs\" onClick={() => onSetQty(item.qty + 1)} ><IconPlus width=\"20px\" height=\"20px\" /></Button>\r\n <Text width=\"80px\" textAlign=\"right\">{currency(item.price * item.qty)}</Text>\r\n {mounted && <Button onClick={onRemove}><IconTrash width=\"20px\" height=\"20px\" /></Button>}\r\n </Flex.Row>\r\n </Card.Content>\r\n </Flex.Row>\r\n </Card>\r\n </>\r\n );\r\n};\r\n","import { useCurrency, useLayout } from '@websolutespa/bom-mixer-hooks';\r\nimport { IconArrowRight, IconShoppingCart } from '@websolutespa/bom-mixer-icons';\r\nimport { Button, Divider, Drawer, DrawerProps, Flex, NavLink, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useCart } from '../hooks/useCart/useCart';\r\nimport { CartItem } from './cart-item';\r\n\r\nexport type CartDrawerProps = Partial<Omit<DrawerProps, | 'children'>>;\r\n\r\nexport const CartDrawer: React.FC<CartDrawerProps> = (props: CartDrawerProps) => {\r\n const layout = useLayout();\r\n const currency = useCurrency();\r\n const items = useCart((state) => state.items);\r\n const checkoutUrl = useCart((state) => state.checkoutUrl || layout.topLevelHrefs.checkout);\r\n const shopUrl = useCart((state) => state.shopUrl || layout.topLevelHrefs.shop_index);\r\n const totalAmount = items.reduce((p, c) => p + c.price * c.qty, 0);\r\n return (\r\n <Drawer name=\"cart\" placement=\"right\" {...props}>\r\n <Drawer.Header>\r\n <Drawer.Title>\r\n <Text variant=\"paragraph10\" fontWeight=\"700\" as=\"span\">Shopping cart</Text>\r\n </Drawer.Title>\r\n </Drawer.Header>\r\n <Drawer.Subtitle>\r\n <Divider>{items.length} items found</Divider>\r\n </Drawer.Subtitle>\r\n <Drawer.Content flex=\"1\" display=\"flex\" width=\"100vw\" maxWidth=\"400px\">\r\n <Flex.Col justifyContent=\"space-between\">\r\n {items && (\r\n <Flex.Col flex=\"1\">\r\n {items.map((item, i) =>\r\n <CartItem key={i} item={item} />\r\n )}\r\n </Flex.Col>\r\n )}\r\n <Flex.Row justifyContent=\"space-between\" alignItems=\"center\" padding=\"1rem 0 0.5rem 0\">\r\n <Text fontWeight=\"700\">Subtotal</Text>\r\n <Text fontWeight=\"700\">{currency(totalAmount)}</Text>\r\n </Flex.Row>\r\n <Flex.Row justifyContent=\"space-between\" alignItems=\"center\" padding=\"0.5rem 0 1.5rem 0\">\r\n <Text>Shipping and taxes calculated at checkout</Text>\r\n </Flex.Row>\r\n <NavLink href={checkoutUrl}>\r\n <Button as=\"a\" variant=\"primary\" size=\"lg\" position=\"sticky\" bottom=\"1rem\" justifyContent=\"center\" onClick={props.onClose}>\r\n <span>Checkout</span> <IconShoppingCart />\r\n </Button>\r\n </NavLink>\r\n <Flex.Row justifyContent=\"center\" alignItems=\"center\" padding=\"1rem 0\">\r\n <span>or</span>\r\n <NavLink href={shopUrl}>\r\n <Button as=\"a\" variant=\"link\" onClick={props.onClose}>\r\n <span>Continue shopping</span> <IconArrowRight />\r\n </Button>\r\n </NavLink>\r\n </Flex.Row>\r\n </Flex.Col>\r\n </Drawer.Content>\r\n </Drawer>\r\n );\r\n};\r\n","import { IAddressOptions } from '@websolutespa/bom-mixer-models';\r\nimport { createContext, useContext, useEffect, useRef, useState } from 'react';\r\nimport { createStore, useStore } from 'zustand';\r\nimport { StateStorage, createJSONStorage, persist } from 'zustand/middleware';\r\nimport { ICheckoutPartial, ITenant } from '../../models';\r\nimport { useTenant } from '../useTenant/useTenant';\r\n\r\ntype CheckoutInitialProps = Partial<\r\n Omit<CheckoutProps, 'hydrated' | 'data'>\r\n> & {\r\n data: IAddressOptions;\r\n};\r\n\r\ntype CheckoutProps = {\r\n hydrated: boolean;\r\n data: IAddressOptions;\r\n checkout: ICheckoutPartial;\r\n name?: string;\r\n tenant?: ITenant;\r\n};\r\n\r\ntype CheckoutActions = {\r\n setCheckout(checkout: ICheckoutPartial): void;\r\n};\r\n\r\ntype CheckoutState = CheckoutProps & {\r\n actions: CheckoutActions,\r\n};\r\n\r\ntype CheckoutStore = ReturnType<typeof createCheckoutStore>;\r\n\r\nconst createCheckoutStore = ({ storage, ...initialProps }: { storage?: StateStorage } & CheckoutInitialProps) => {\r\n const DEFAULT_PROPS = {\r\n hydrated: false,\r\n checkout: {},\r\n };\r\n const useStore = createStore<CheckoutState>()(\r\n persist(\r\n (set, get) => ({\r\n ...DEFAULT_PROPS,\r\n ...initialProps,\r\n actions: {\r\n setCheckout: (checkout: ICheckoutPartial) => set(state => {\r\n return {\r\n checkout: {\r\n ...checkout,\r\n tenant: state.tenant,\r\n },\r\n };\r\n }),\r\n },\r\n }),\r\n {\r\n name: `${initialProps.name || 'website'}-checkout-${initialProps.tenant?.id || ''}`,\r\n storage: createJSONStorage(() => storage || localStorage),\r\n /*\r\n getStorage: () => {\r\n // console.log('useCheckout.getStorage');\r\n return storage || localStorage;\r\n },\r\n */\r\n onRehydrateStorage: () => () => {\r\n useStore.setState({ hydrated: true });\r\n // console.log('onRehydrateStorage', useStore, useStore.getState());\r\n },\r\n merge: (persistedState: any, currentState: CheckoutState) => {\r\n if (persistedState.checkout && typeof persistedState.checkout === 'object') {\r\n currentState.checkout = { ...persistedState.checkout };\r\n }\r\n currentState.hydrated = true;\r\n return currentState;\r\n },\r\n }\r\n )\r\n );\r\n return useStore;\r\n};\r\n\r\nexport const CheckoutContext = createContext<CheckoutStore | null>(null);\r\n\r\ntype CheckoutProviderProps = React.PropsWithChildren<{\r\n data: IAddressOptions;\r\n checkout?: ICheckoutPartial;\r\n name?: string;\r\n storage?: StateStorage;\r\n}>;\r\n\r\nfunction CheckoutProvider({ children, ...props }: CheckoutProviderProps) {\r\n const storeRef = useRef<CheckoutStore>(undefined);\r\n if (!storeRef.current) {\r\n storeRef.current = createCheckoutStore(props);\r\n }\r\n const [tenant, setTenant] = useState<ITenant | undefined>();\r\n const storeTenant = useTenant(state => state.tenant);\r\n useEffect(() => {\r\n if (tenant !== storeTenant) {\r\n setTenant(storeTenant);\r\n storeRef.current = createCheckoutStore({ ...props, tenant: storeTenant });\r\n console.log('CheckoutProvider setTenant', storeTenant);\r\n }\r\n }, [props, storeTenant, tenant]);\r\n return (\r\n <CheckoutContext.Provider value={storeRef.current}>\r\n {children}\r\n </CheckoutContext.Provider>\r\n );\r\n}\r\n\r\nfunction useCheckout<T>(selector: (state: CheckoutState) => T): T {\r\n const store = useContext(CheckoutContext);\r\n if (!store) throw new Error('Missing CheckoutContext.Provider in the tree');\r\n return useStore(store, selector);\r\n}\r\n\r\nexport { CheckoutProvider, useCheckout };\r\n\r\n","import { useCurrency } from '@websolutespa/bom-mixer-hooks';\r\nimport { IconMinus, IconPlus, IconTrash } from '@websolutespa/bom-mixer-icons';\r\nimport { Button, Flex, Input, Link, Media, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useCart } from '../hooks';\r\nimport { ICheckoutItem } from '../models/checkout/checkout';\r\n\r\nexport const CheckoutBasketItem: React.FC<{ item: ICheckoutItem }> = ({ item }: { item: ICheckoutItem }) => {\r\n\r\n const currency = useCurrency();\r\n\r\n const { update, remove } = useCart(state => state.actions);\r\n\r\n function onSetQty(qty: number) {\r\n if (qty > 0) {\r\n update({ ...item, qty });\r\n } else {\r\n onRemove();\r\n }\r\n }\r\n\r\n function onRemove() {\r\n const count = remove(item);\r\n console.log('onRemove', count);\r\n }\r\n\r\n const article = item.article;\r\n\r\n return (\r\n <Flex.Row gap=\"2rem\" paddingBottom=\"1rem\" borderBottom=\"1px solid var(--color-neutral-300)\">\r\n <Flex flex=\"0 1 calc(100% - 420px)\">\r\n <Flex.Row gap=\"2rem\">\r\n {article.media && (\r\n <Media item={article.media} aspectRatio={1} width=\"120px\" height=\"120px\" flex=\"0 0 120px\" rounded />\r\n )}\r\n <Flex.Col alignItems=\"flex-start\">\r\n <Link href={article.href}>\r\n <Button as=\"a\" variant=\"nav\">\r\n <Text variant=\"paragraph20\" fontWeight=\"700\">{article.title}</Text>\r\n </Button>\r\n </Link>\r\n {article.abstract && (\r\n <Text variant=\"paragraph30\" dangerouslySetInnerHTML={{ __html: article.abstract }} />\r\n )}\r\n </Flex.Col>\r\n </Flex.Row>\r\n </Flex>\r\n <Flex.Col flexBasis=\"110px\" alignItems=\"flex-end\">\r\n <Text>{currency(item.price)}</Text>\r\n {item.fullPrice > item.price && <Text variant=\"paragraph40\" textDecoration=\"line-through\" color=\"var(--color-neutral-400)\">{currency(item.fullPrice)}</Text>}\r\n </Flex.Col>\r\n <Flex flexBasis=\"120px\" justifyContent=\"center\">\r\n <Flex.Row>\r\n <Button onClick={() => onSetQty(item.qty - 1)} ><IconMinus width=\"20px\" height=\"20px\" /></Button>\r\n <Input width=\"60px\" padding=\"0.2rem\" placeholder=\"qty\" value={item.qty.toString()} onChange={(e) => onSetQty(Number(e.target.value))} />\r\n <Button size=\"xs\" onClick={() => onSetQty(item.qty + 1)} ><IconPlus width=\"20px\" height=\"20px\" /></Button>\r\n </Flex.Row>\r\n </Flex>\r\n <Flex flexBasis=\"80px\" justifyContent=\"center\">\r\n <Button onClick={onRemove}><IconTrash width=\"20px\" height=\"20px\" /></Button>\r\n </Flex>\r\n <Flex.Col flexBasis=\"110px\" alignItems=\"flex-end\">\r\n <Text>{currency(item.price * item.qty)}</Text>\r\n {item.fullPrice > item.price && <Text variant=\"paragraph40\" textDecoration=\"line-through\" color=\"var(--color-neutral-400)\">{currency(item.fullPrice * item.qty)}</Text>}\r\n </Flex.Col>\r\n </Flex.Row>\r\n );\r\n};\r\n","import { useApi, useApiPost, useCurrency, useLabel, useLayout } from '@websolutespa/bom-mixer-hooks';\r\nimport { IconPercent, IconTruck } from '@websolutespa/bom-mixer-icons';\r\nimport { Box, Button, Container, Flex, Loading, NavLink, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useCart, useCheckout } from '../hooks';\r\nimport { ICheckoutItem, ICheckoutPartial } from '../models/checkout/checkout';\r\nimport { CheckoutBasketItem } from './checkout-basket-item';\r\n\r\nexport type CheckoutBasketProps = {\r\n onBasket?: (items: ICheckoutItem[]) => void;\r\n};\r\n\r\nexport const CheckoutBasket: React.FC<CheckoutBasketProps> = ({ onBasket }: CheckoutBasketProps) => {\r\n\r\n const label = useLabel();\r\n\r\n const layout = useLayout();\r\n\r\n const api = useApi();\r\n\r\n const currency = useCurrency();\r\n\r\n const cartItems = useCart((state) => state.items);\r\n const shopUrl = useCart((state) => state.shopUrl || layout.topLevelHrefs.shop_index);\r\n\r\n const checkout = useCheckout((state) => state.checkout);\r\n const { setCheckout } = useCheckout((state) => state.actions);\r\n\r\n const [items = [], loading] = useApiPost<ICheckoutItem[]>('/checkout/items', { ...checkout, items: cartItems });\r\n\r\n const subTotal = items.reduce((p, c) => {\r\n return p + c.price * c.qty;\r\n }, 0);\r\n\r\n const subTotalFull = items.reduce((p, c) => {\r\n return p + c.fullPrice * c.qty;\r\n }, 0);\r\n\r\n const onBasket_ = async () => {\r\n try {\r\n const response = await api.post<ICheckoutPartial>('/checkout/update', {\r\n action: 'basket',\r\n checkout: { ...checkout, items },\r\n });\r\n setCheckout(response);\r\n if (typeof onBasket === 'function') {\r\n onBasket(items);\r\n }\r\n } catch (error) {\r\n console.error('CheckoutBasket.onBasket_.error', error);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container minHeight=\"50vh\">\r\n {loading && <Loading />}\r\n {!loading && (\r\n <>\r\n <Flex.Row gap=\"2rem\" padding=\"1rem 0\" fontWeight=\"700\">\r\n <Text flex=\"0 1 calc(100% - 420px)\">Product</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">Unit price</Text>\r\n <Text flexBasis=\"120px\" textAlign=\"center\">Quantity</Text>\r\n <Text flexBasis=\"80px\" textAlign=\"center\">&nbsp;</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">Price</Text>\r\n </Flex.Row>\r\n <Flex.Col flex=\"1\" gap=\"1rem\">\r\n {items && items.map((item, i) =>\r\n <CheckoutBasketItem key={i} item={item} />\r\n )}\r\n <Flex.Row gap=\"1rem\" fontWeight=\"700\" marginBottom=\"1rem\">\r\n <Text flex=\"0 1 calc(100% - 420px)\">Subtotal</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">&nbsp;</Text>\r\n <Text flexBasis=\"120px\" textAlign=\"center\">&nbsp;</Text>\r\n <Text flexBasis=\"80px\" textAlign=\"center\">&nbsp;</Text>\r\n <Flex.Col flexBasis=\"110px\" alignItems=\"flex-end\" textAlign=\"right\">\r\n <Text>{currency(subTotal)}</Text>\r\n {subTotalFull > subTotal && <Text variant=\"paragraph40\" textDecoration=\"line-through\" color=\"var(--color-neutral-400)\">{currency(subTotalFull)}</Text>}\r\n </Flex.Col>\r\n </Flex.Row>\r\n </Flex.Col>\r\n <Flex.Col gap=\"1rem\">\r\n <Box borderRadius=\"0.5rem\" border=\"1px solid var(--color-neutral-300)\">\r\n <Flex.Row padding=\"1rem\">\r\n <IconTruck width=\"2rem\" height=\"2rem\" color=\"var(--color-primary-500)\" />\r\n <Box marginLeft=\"0.5rem\">\r\n <Text variant=\"paragraph20\" fontWeight=\"700\">The shipping is on us</Text>\r\n <Text variant=\"paragraph30\">Free, contactless delivery for payments over the minimum fare.</Text>\r\n </Box>\r\n </Flex.Row>\r\n </Box>\r\n <Box borderRadius=\"0.5rem\" border=\"1px solid var(--color-neutral-300)\">\r\n <Flex.Row padding=\"1rem\">\r\n <IconPercent width=\"2rem\" height=\"2rem\" color=\"var(--color-primary-500)\" />\r\n <Box marginLeft=\"0.5rem\">\r\n <Text variant=\"paragraph20\" fontWeight=\"700\">Do you have a discount code?</Text>\r\n <Text variant=\"paragraph30\">You can enter it in the following steps, before the final checkout.</Text>\r\n </Box>\r\n </Flex.Row>\r\n </Box>\r\n </Flex.Col>\r\n </>\r\n )}\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <NavLink href={shopUrl}>\r\n <Button as=\"a\" variant=\"link\">Continue shopping</Button>\r\n </NavLink>\r\n </Flex>\r\n <Flex>\r\n <Button variant=\"primary\" onClick={onBasket_}>Proceed</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { RequiredValidator, useFormSchema } from '@websolutespa/bom-mixer-forms';\r\nimport { useApi, useApiPost, useCurrency, useLabel } from '@websolutespa/bom-mixer-hooks';\r\nimport { Button, Container, FieldCard, Flex, Form, FormError, Loading, RadioCard, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useEffect, useState } from 'react';\r\nimport { useCheckout } from '../hooks';\r\nimport { ICheckoutDelivery, ICheckoutPartial } from '../models/checkout/checkout';\r\n\r\nexport type CheckoutDeliveryProps = {\r\n onDelivery?: (delivery: ICheckoutDelivery) => void;\r\n onPrevious?: () => void;\r\n};\r\n\r\nexport const CheckoutDelivery: React.FC<CheckoutDeliveryProps> = ({ onPrevious, onDelivery }: CheckoutDeliveryProps) => {\r\n const label = useLabel();\r\n\r\n const currency = useCurrency();\r\n\r\n const api = useApi();\r\n\r\n const checkout = useCheckout((state) => state.checkout);\r\n const { setCheckout } = useCheckout((state) => state.actions);\r\n\r\n const [options, loading] = useApiPost<{ deliveries: ICheckoutDelivery[] }>('/checkout/deliveries', checkout);\r\n\r\n const [error, setError] = useState<Error>();\r\n\r\n const required = RequiredValidator();\r\n\r\n const { form, setValue } = useFormSchema<{ delivery: ICheckoutDelivery }>({\r\n delivery: { schema: 'card', label: 'field.delivery', options: options?.deliveries, validators: [required] },\r\n }, [options]);\r\n\r\n useEffect(() => {\r\n if (checkout.delivery) {\r\n setValue({ delivery: checkout.delivery });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [options]);\r\n\r\n const onSubmit = async (event: React.FormEvent<HTMLFormElement> | React.MouseEvent<HTMLElement>) => {\r\n event.preventDefault();\r\n if (form.valid && form.value) {\r\n console.log('CheckoutDelivery.valid', form.value);\r\n try {\r\n setError(undefined);\r\n const delivery = form.value.delivery;\r\n const response: ICheckoutPartial = await api.post<ICheckoutPartial>('/checkout/update', {\r\n action: 'delivery',\r\n checkout: { ...checkout, delivery },\r\n });\r\n setCheckout(response);\r\n if (typeof onDelivery === 'function') {\r\n onDelivery(delivery);\r\n }\r\n } catch (error) {\r\n console.log('CheckoutDelivery.error', error);\r\n setError(error as Error);\r\n }\r\n } else {\r\n console.log('CheckoutDelivery.invalid');\r\n form.touched = true;\r\n }\r\n };\r\n\r\n const onPrevious_ = () => {\r\n if (typeof onPrevious === 'function') {\r\n onPrevious();\r\n }\r\n };\r\n\r\n const delivery = form.controls.delivery;\r\n\r\n const onDeliveryChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n form.controls.delivery.value = options?.deliveries.find(x => x.id.toString() === event.target.value);\r\n };\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container minHeight=\"50vh\">\r\n <Flex.Col justifyContent=\"space-between\">\r\n <Form form={form} onSubmit={onSubmit}>\r\n <Flex.Col flex=\"1\" rowGap=\"2rem\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Select the delivery method</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"60ch\">Specify your delivery or reference address to find your closest sales outlet for self-service pickup.</Text>\r\n {loading && <Loading />}\r\n {true && delivery &&\r\n <RadioCard.Group initialValue={delivery.value?.id.toString()} onChange={onDeliveryChange}>\r\n {options?.deliveries.map(option => (\r\n <RadioCard key={option.id} value={option.id.toString()}>\r\n <RadioCard.Title>{option.name}</RadioCard.Title>\r\n {option.abstract && <RadioCard.Abstract dangerouslySetInnerHTML={{ __html: option.abstract }}></RadioCard.Abstract>}\r\n {option.price > 0 && <RadioCard.Extra>{currency(option.price)}</RadioCard.Extra>}\r\n </RadioCard>\r\n ))}\r\n </RadioCard.Group>\r\n }\r\n {false && <FieldCard control={form.controls.delivery} />}\r\n {error && <FormError error={error}>{label('form.submit.error')}</FormError>}\r\n </Flex.Col>\r\n </Form>\r\n </Flex.Col>\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <Button variant=\"secondary\" onClick={onPrevious_}>Back</Button>\r\n </Flex>\r\n <Flex>\r\n <Button variant=\"primary\" onClick={onSubmit}>Proceed</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { RequiredValidator, useFormSchema } from '@websolutespa/bom-mixer-forms';\r\nimport { useApi, useLabel } from '@websolutespa/bom-mixer-hooks';\r\nimport { Button, FieldText, Flex } from '@websolutespa/bom-mixer-ui';\r\nimport { useState } from 'react';\r\nimport { useCheckout } from '../hooks';\r\nimport { ICheckout, ICheckoutDiscount } from '../models/checkout/checkout';\r\n\r\nexport type CheckoutDiscountProps = {\r\n onDiscount?: (discounts: ICheckoutDiscount[]) => void;\r\n};\r\n\r\nexport const CheckoutDiscount: React.FC<CheckoutDiscountProps> = ({ onDiscount }: CheckoutDiscountProps) => {\r\n const label = useLabel();\r\n\r\n const api = useApi();\r\n\r\n const checkout = useCheckout((state) => state.checkout);\r\n const { setCheckout } = useCheckout((state) => state.actions);\r\n\r\n // console.log('CheckoutDiscount', checkout);\r\n\r\n const [error, setError] = useState<Error>();\r\n\r\n const required = RequiredValidator();\r\n\r\n const { form } = useFormSchema<{ discountCode: number }>({\r\n discountCode: { schema: 'text', label: 'field.discountCode' },\r\n });\r\n\r\n const onSubmit = async (event: React.FormEvent<HTMLFormElement> | React.MouseEvent<HTMLElement>) => {\r\n event.preventDefault();\r\n if (form.valid && form.value) {\r\n // console.log('CheckoutDiscount.valid', form.value);\r\n try {\r\n setError(undefined);\r\n const response = await api.post<ICheckout>('/checkout/discount', { checkout, discountCode: form.value.discountCode });\r\n setCheckout(response);\r\n if (typeof onDiscount === 'function') {\r\n onDiscount(response.discounts);\r\n }\r\n form.reset();\r\n } catch (error) {\r\n console.log('CheckoutDiscount.error', error);\r\n setError(error as Error);\r\n }\r\n } else {\r\n console.log('CheckoutDiscount.invalid');\r\n form.touched = true;\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Flex.Row gap=\"1rem\">\r\n <FieldText control={form.controls.discountCode} after={<Button variant=\"secondary\" onClick={onSubmit}>{label('form.apply')}</Button>} />\r\n </Flex.Row>\r\n </>\r\n );\r\n};\r\n","import { useLabel, useLayout } from '@websolutespa/bom-mixer-hooks';\r\nimport { Button, Container, Flex, NavLink, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useCart } from '../hooks/useCart/useCart';\r\n\r\nexport type CheckoutEmptyProps = {\r\n};\r\n\r\nexport const CheckoutEmpty: React.FC<CheckoutEmptyProps> = () => {\r\n const label = useLabel();\r\n const layout = useLayout();\r\n const shopUrl = useCart((state) => state.shopUrl || layout.topLevelHrefs.shop_index);\r\n return (\r\n <>\r\n <Section>\r\n <Container minHeight=\"50vh\">\r\n <Flex.Col gap=\"1rem\" alignItems=\"center\" textAlign=\"center\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Your cart is empty.</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"80ch\">All’interno di Mixer Shop è possibile acquistare i campioni delle collezioni Tiles, 3D Elements e Paints, complementi d’arredo in materiali inediti, elementi decorativi esclusivi e oggettistica legata all’universo del brand.</Text>\r\n <NavLink href={shopUrl}>\r\n <Button as=\"a\" variant=\"primary\">Continue shopping</Button>\r\n </NavLink>\r\n </Flex.Col>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { useLabel } from '@websolutespa/bom-mixer-hooks';\r\nimport { Container, Flex, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { IOrder } from '../models/order/order';\r\n\r\nexport type CheckoutErrorProps = {\r\n order?: IOrder;\r\n};\r\n\r\nexport const CheckoutError: React.FC<CheckoutErrorProps> = ({ order }: CheckoutErrorProps) => {\r\n const label = useLabel();\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container minHeight=\"50vh\">\r\n {order ? (\r\n <Flex.Col gap=\"1rem\" alignItems=\"center\" textAlign=\"center\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Payment unsuccesful</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"80ch\">There was a problem processing this payment. Please contact your payment provider if needed.</Text>\r\n </Flex.Col>\r\n ) : (\r\n <Flex.Col gap=\"1rem\" alignItems=\"center\" textAlign=\"center\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Order not found</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"80ch\">There was a problem processing this order.</Text>\r\n </Flex.Col>\r\n )}\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { AuthForgot } from '@websolutespa/bom-mixer-auth';\r\nimport { Button, Container, Flex, Section } from '@websolutespa/bom-mixer-ui';\r\n\r\ntype Props = {\r\n onPasswordSent?: () => void;\r\n onNavToLogin?: () => void;\r\n onNavToRegister?: () => void;\r\n onNavToPrevious?: () => void;\r\n};\r\n\r\nexport const CheckoutForgot: React.FC<Props> = ({ onPasswordSent, onNavToLogin, onNavToRegister, onNavToPrevious }: Props) => {\r\n\r\n const onPasswordSent_ = () => {\r\n if (typeof onPasswordSent === 'function') {\r\n onPasswordSent();\r\n }\r\n };\r\n\r\n const onNavToLogin_ = () => {\r\n if (typeof onNavToLogin === 'function') {\r\n onNavToLogin();\r\n }\r\n };\r\n\r\n const onNavToRegister_ = () => {\r\n if (typeof onNavToRegister === 'function') {\r\n onNavToRegister();\r\n }\r\n };\r\n\r\n const onNavToPrevious_ = () => {\r\n if (typeof onNavToPrevious === 'function') {\r\n onNavToPrevious();\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container>\r\n <AuthForgot onPasswordSent={onPasswordSent_} onNavToLogin={onNavToLogin_} onNavToRegister={onNavToRegister_} />\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <Button variant=\"secondary\" onClick={onNavToPrevious_}>Back</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { AuthForgotSuccess } from '@websolutespa/bom-mixer-auth';\r\nimport { Button, Container, Flex, Section } from '@websolutespa/bom-mixer-ui';\r\n\r\ntype Props = {\r\n onNavToLogin?: () => void;\r\n onNavToPrevious?: () => void;\r\n};\r\n\r\nexport const CheckoutForgotSuccess: React.FC<Props> = ({ onNavToLogin, onNavToPrevious }: Props) => {\r\n\r\n const onNavToLogin_ = () => {\r\n if (typeof onNavToLogin === 'function') {\r\n onNavToLogin();\r\n }\r\n };\r\n\r\n const onNavToPrevious_ = () => {\r\n if (typeof onNavToPrevious === 'function') {\r\n onNavToPrevious();\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container>\r\n <AuthForgotSuccess onNavToLogin={onNavToLogin_} />\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <Button variant=\"secondary\" onClick={onNavToPrevious_}>Back</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { AuthLogin, IUser } from '@websolutespa/bom-mixer-auth';\r\nimport { Button, Container, Flex, Section } from '@websolutespa/bom-mixer-ui';\r\n\r\ntype Props = {\r\n onSignedIn?: (user: IUser) => void;\r\n onNavToForgot?: () => void;\r\n onNavToRegister?: () => void;\r\n onNavToPrevious?: () => void;\r\n};\r\n\r\nexport const CheckoutLogin: React.FC<Props> = ({ onSignedIn, onNavToForgot, onNavToRegister, onNavToPrevious }: Props) => {\r\n\r\n const onSignedIn_ = (user: IUser) => {\r\n if (typeof onSignedIn === 'function') {\r\n onSignedIn(user);\r\n }\r\n };\r\n\r\n const onNavToForgot_ = () => {\r\n if (typeof onNavToForgot === 'function') {\r\n onNavToForgot();\r\n }\r\n };\r\n\r\n const onNavToRegister_ = () => {\r\n if (typeof onNavToRegister === 'function') {\r\n onNavToRegister();\r\n }\r\n };\r\n\r\n const onNavToPrevious_ = () => {\r\n if (typeof onNavToPrevious === 'function') {\r\n onNavToPrevious();\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container>\r\n <AuthLogin onSignedIn={onSignedIn_} onNavToForgot={onNavToForgot_} onNavToRegister={onNavToRegister_} />\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <Button variant=\"secondary\" onClick={onNavToPrevious_}>Back</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { AuthRegister } from '@websolutespa/bom-mixer-auth';\r\nimport { Button, Container, Flex, Section } from '@websolutespa/bom-mixer-ui';\r\n\r\ntype Props = {\r\n onSignedUp?: () => void;\r\n onNavToLogin?: () => void;\r\n onNavToPrevious?: () => void;\r\n};\r\n\r\nexport const CheckoutRegister: React.FC<Props> = ({ onSignedUp, onNavToLogin, onNavToPrevious }: Props) => {\r\n\r\n const onSignedUp_ = () => {\r\n if (typeof onSignedUp === 'function') {\r\n onSignedUp();\r\n }\r\n };\r\n\r\n const onNavToLogin_ = () => {\r\n if (typeof onNavToLogin === 'function') {\r\n onNavToLogin();\r\n }\r\n };\r\n\r\n const onNavToPrevious_ = () => {\r\n if (typeof onNavToPrevious === 'function') {\r\n onNavToPrevious();\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container>\r\n <AuthRegister onSignedUp={onSignedUp_} onNavToLogin={onNavToLogin_} />\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <Button variant=\"secondary\" onClick={onNavToPrevious_}>Back</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { AuthRegisterSuccess } from '@websolutespa/bom-mixer-auth';\r\nimport { Button, Container, Flex, Section } from '@websolutespa/bom-mixer-ui';\r\n\r\ntype Props = {\r\n onNavToLogin?: () => void;\r\n onNavToPrevious?: () => void;\r\n};\r\n\r\nexport const CheckoutRegisterSuccess: React.FC<Props> = ({ onNavToLogin, onNavToPrevious }: Props) => {\r\n\r\n const onNavToLogin_ = () => {\r\n if (typeof onNavToLogin === 'function') {\r\n onNavToLogin();\r\n }\r\n };\r\n\r\n const onNavToPrevious_ = () => {\r\n if (typeof onNavToPrevious === 'function') {\r\n onNavToPrevious();\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container>\r\n <AuthRegisterSuccess onNavToLogin={onNavToLogin_} />\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <Button variant=\"secondary\" onClick={onNavToPrevious_}>Back</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { IUser, IUserAddress } from '@websolutespa/bom-mixer-auth';\r\nimport { EmailValidator, RequiredIfValidator, RequiredTrueValidator, RequiredValidator, useFormSchema } from '@websolutespa/bom-mixer-forms';\r\nimport { useApi, useApiPost, useLabel } from '@websolutespa/bom-mixer-hooks';\r\nimport { IAddressOptions } from '@websolutespa/bom-mixer-models';\r\nimport { Button, Container, FieldCollection, Flex, Form, FormError, FormTester, Grid, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useEffect, useState } from 'react';\r\nimport { useCheckout } from '../hooks';\r\nimport { ICheckoutInfo, ICheckoutPartial } from '../models';\r\n\r\nexport type CheckoutUserInfoProps = {\r\n user?: IUser | null;\r\n onUserInfo?: (userInfo: ICheckoutInfo) => void;\r\n onNavToPrevious?: () => void;\r\n};\r\n\r\nexport const CheckoutUserInfo: React.FC<CheckoutUserInfoProps> = ({ user, onUserInfo, onNavToPrevious }: CheckoutUserInfoProps) => {\r\n const label = useLabel();\r\n\r\n const api = useApi();\r\n\r\n const checkout = useCheckout((state) => state.checkout);\r\n const { setCheckout } = useCheckout((state) => state.actions);\r\n\r\n const [options, loading] = useApiPost<IAddressOptions>('/checkout/info', checkout);\r\n\r\n const required = RequiredValidator();\r\n const requiredTrue = RequiredTrueValidator();\r\n const email = EmailValidator();\r\n\r\n const shippingRequiredIfItaly = RequiredIfValidator((value, rootValue) => rootValue?.shippingAddress?.country?.id === 'it');\r\n const shippingHiddenIfNotItaly = (value: any, rootValue: any) => !(rootValue?.shippingAddress?.country?.id === 'it');\r\n\r\n const billingRequired = RequiredIfValidator((value, rootValue) => rootValue?.hasBilling === true);\r\n const billingHidden = (value: any, rootValue: any) => !(rootValue?.hasBilling === true);\r\n const billingHiddenIfNotItaly = (value: any, rootValue: any) => !(rootValue?.billingAddress?.country?.id === 'it');\r\n // const billingRequiredIfItaly = RequiredIfValidator((value, rootValue) => rootValue?.billingAddress?.country?.id === 'it');\r\n\r\n const { form, setValue, setTouched } = useFormSchema<Omit<ICheckoutInfo, 'user'>>({\r\n\r\n shippingAddress: {\r\n schema: 'group', label: 'field.shippingAddress', children: {\r\n firstName: { schema: 'text', label: 'field.firstName',\r\n validators: [required],\r\n },\r\n lastName: { schema: 'text', label: 'field.lastName',\r\n validators: [required],\r\n },\r\n email: { schema: 'text', label: 'field.email',\r\n validators: [required, email],\r\n },\r\n phoneNumber: { schema: 'text', label: 'field.phoneNumber',\r\n validators: [required],\r\n },\r\n country: { schema: 'select', label: 'field.country', options: options?.countries,\r\n validators: [required],\r\n },\r\n region: {\r\n schema: 'select', label: 'field.region', options: options?.regions,\r\n validators: shippingRequiredIfItaly,\r\n disabled: shippingHiddenIfNotItaly,\r\n hidden: shippingHiddenIfNotItaly,\r\n },\r\n province: {\r\n schema: 'combobox', label: 'field.province', options: options?.provinces,\r\n validators: shippingRequiredIfItaly,\r\n disabled: shippingHiddenIfNotItaly,\r\n hidden: shippingHiddenIfNotItaly,\r\n },\r\n address: { schema: 'text', label: 'field.address',\r\n validators: [required],\r\n },\r\n streetNumber: { schema: 'text', label: 'field.streetNumber',\r\n validators: [required],\r\n },\r\n zipCode: { schema: 'text', label: 'field.zipCode',\r\n validators: [required],\r\n },\r\n city: { schema: 'text', label: 'field.city',\r\n validators: [required],\r\n },\r\n },\r\n },\r\n\r\n hasInvoice: { schema: 'checkbox', label: 'field.hasInvoice' },\r\n\r\n hasBilling: { schema: 'checkbox', label: 'field.hasBilling' },\r\n\r\n billingAddress: {\r\n schema: 'group', label: 'field.billingAddress', children: {\r\n firstName: { schema: 'text', label: 'field.firstName',\r\n validators: [billingRequired],\r\n },\r\n lastName: { schema: 'text', label: 'field.lastName',\r\n validators: [billingRequired],\r\n },\r\n email: { schema: 'text', label: 'field.email',\r\n validators: [billingRequired, email] },\r\n phoneNumber: { schema: 'text', label: 'field.phoneNumber',\r\n validators: [billingRequired],\r\n },\r\n country: { schema: 'select', label: 'field.country', options: options?.countries,\r\n validators: [billingRequired],\r\n },\r\n region: {\r\n schema: 'select', label: 'field.region', options: options?.regions,\r\n validators: [billingRequired],\r\n disabled: billingHiddenIfNotItaly,\r\n hidden: billingHiddenIfNotItaly,\r\n },\r\n province: {\r\n schema: 'combobox', label: 'field.province', options: options?.provinces,\r\n validators: [billingRequired],\r\n disabled: billingHiddenIfNotItaly,\r\n hidden: billingHiddenIfNotItaly,\r\n },\r\n address: { schema: 'text', label: 'field.address',\r\n validators: [billingRequired],\r\n },\r\n streetNumber: { schema: 'text', label: 'field.streetNumber',\r\n validators: [billingRequired],\r\n },\r\n zipCode: { schema: 'text', label: 'field.zipCode',\r\n validators: [billingRequired],\r\n },\r\n city: { schema: 'text', label: 'field.city',\r\n validators: [billingRequired],\r\n },\r\n },\r\n disabled: billingHidden,\r\n hidden: billingHidden,\r\n },\r\n\r\n checkField: { schema: 'text', hidden: true }, // check hidden field for antiforgery\r\n\r\n }, [options]);\r\n\r\n useEffect(() => {\r\n // console.log('CheckoutUserInfo', options);\r\n\r\n if (checkout.shippingAddress) {\r\n setValue({\r\n shippingAddress: checkout.shippingAddress,\r\n hasInvoice: checkout.hasInvoice,\r\n hasBilling: checkout.hasBilling,\r\n billingAddress: checkout.billingAddress,\r\n });\r\n } else if (user) {\r\n setValue({\r\n shippingAddress: {\r\n firstName: user.firstName,\r\n lastName: user.lastName,\r\n } as IUserAddress,\r\n });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [options]);\r\n\r\n const [error, setError] = useState<Error>();\r\n\r\n const onSubmit = async (event: React.FormEvent<HTMLFormElement> | React.MouseEvent<HTMLElement>) => {\r\n event.preventDefault();\r\n if (form.valid && form.value) {\r\n console.log('CheckoutUserInfo.valid', form.value);\r\n try {\r\n setError(undefined);\r\n const response = await api.post<ICheckoutPartial>('/checkout/update', {\r\n action: 'info',\r\n checkout: { ...checkout, ...form.value, user },\r\n });\r\n setCheckout(response);\r\n if (typeof onUserInfo === 'function') {\r\n onUserInfo({ ...form.value, user });\r\n }\r\n } catch (error) {\r\n console.log('CheckoutUserInfo.error', error);\r\n setError(error as Error);\r\n }\r\n } else {\r\n console.log('CheckoutUserInfo.invalid');\r\n setTouched();\r\n }\r\n };\r\n\r\n const onNavToPrevious_ = () => {\r\n if (typeof onNavToPrevious === 'function') {\r\n onNavToPrevious();\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container>\r\n <Flex.Col justifyContent=\"space-between\">\r\n <Form form={form} onSubmit={onSubmit}>\r\n <Flex.Col flex=\"1\" rowGap=\"1rem\">\r\n <Text variant=\"heading10\" fontWeight=\"700\" marginBottom=\"1rem\">Reference address</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"60ch\">Specify your delivery or reference address to find your closest sales outlet for self-service pickup.</Text>\r\n <Grid.Row rowGap=\"1rem\">\r\n <FieldCollection collection={form} />\r\n </Grid.Row>\r\n {error && <FormError error={error}>{label('form.submit.error')}</FormError>}\r\n <FormTester form={form} test={{\r\n shippingAddress: {\r\n firstName: 'John',\r\n lastName: 'Appleseed',\r\n email: 'john@appleseed.com',\r\n phoneNumber: '390721411112',\r\n country: { id: 'it', name: 'Italy' },\r\n region: { id: '11', name: 'Marche' },\r\n province: { id: '041', name: 'Pesaro e Urbino' },\r\n address: 'Strada della Campanara',\r\n streetNumber: '15',\r\n zipCode: '61122',\r\n city: 'Pesaro',\r\n },\r\n hasInvoice: false,\r\n hasBilling: false,\r\n }} ></FormTester>\r\n </Flex.Col>\r\n </Form>\r\n </Flex.Col>\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <Button variant=\"secondary\" onClick={onNavToPrevious_}>Back</Button>\r\n </Flex>\r\n <Flex>\r\n <Button variant=\"primary\" onClick={onSubmit} disabled={loading}>Proceed</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { IUser, useUser } from '@websolutespa/bom-mixer-auth';\r\nimport { scrollToY, useLabel } from '@websolutespa/bom-mixer-hooks';\r\nimport { Button, Container, Flex, Grid, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useState } from 'react';\r\nimport { useCheckout } from '../hooks';\r\nimport { ICheckoutInfo } from '../models/checkout/checkout';\r\nimport { CheckoutForgot } from './checkout-forgot';\r\nimport { CheckoutForgotSuccess } from './checkout-forgot-success';\r\nimport { CheckoutLogin } from './checkout-login';\r\nimport { CheckoutRegister } from './checkout-register';\r\nimport { CheckoutRegisterSuccess } from './checkout-register-success';\r\nimport { CheckoutUserInfo } from './checkout-user-info';\r\n\r\nexport type CheckoutInfoProps = {\r\n onInfo?: (info: ICheckoutInfo) => void;\r\n onPrevious?: () => void;\r\n};\r\n\r\nexport const CheckoutInfo: React.FC<CheckoutInfoProps> = ({ onPrevious, onInfo }: CheckoutInfoProps) => {\r\n const label = useLabel();\r\n\r\n const checkout = useCheckout((state) => state.checkout);\r\n const user = useUser((state) => state.user);\r\n const { setUser } = useUser((state) => state.actions);\r\n\r\n const [view, setView] = useState((checkout.shippingAddress || user) ? 'address' : 'choose');\r\n\r\n // const [user, setUser] = useState<IUser>();\r\n\r\n const onView = (view: string) => {\r\n setView(view);\r\n scrollToY(0);\r\n };\r\n\r\n const onUserInfo = (info: ICheckoutInfo) => {\r\n if (typeof onInfo === 'function') {\r\n onInfo(info);\r\n }\r\n };\r\n\r\n const onSignedIn = (user: IUser) => {\r\n console.log('onSignedIn');\r\n setUser(user);\r\n onView('address');\r\n };\r\n\r\n const onSignedUp = () => {\r\n console.log('onSignedUp');\r\n onView('register-success');\r\n };\r\n\r\n const onPasswordSent = () => {\r\n console.log('onPasswordSent');\r\n onView('forgot-success');\r\n };\r\n\r\n const onNavToLogin = () => {\r\n onView('login');\r\n };\r\n\r\n const onNavToRegister = () => {\r\n onView('register');\r\n };\r\n\r\n const onNavToForgot = () => {\r\n onView('forgot');\r\n };\r\n\r\n const onNavToPrevious = () => {\r\n onView('choose');\r\n };\r\n\r\n const onPrevious_ = () => {\r\n if (typeof onPrevious === 'function') {\r\n onPrevious();\r\n }\r\n scrollToY(0);\r\n };\r\n\r\n const getView = () => {\r\n switch (view) {\r\n case 'choose':\r\n return (\r\n <>\r\n <Section>\r\n <Container minHeight=\"50vh\">\r\n <Grid.Row rowGap=\"3rem\">\r\n <Grid sm={6}>\r\n <Flex.Col gap=\"1rem\" alignItems=\"flex-start\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Login</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"60ch\">Login to optimise your shopping experience and to see your previous orders.</Text>\r\n <Button variant=\"primary\" onClick={() => setView('login')}>Login</Button>\r\n </Flex.Col>\r\n </Grid>\r\n <Grid sm={6}>\r\n <Flex.Col gap=\"2rem\">\r\n <Flex.Col gap=\"1rem\" alignItems=\"flex-start\" marginBottom=\"3rem\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Register</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"60ch\">Register to optimise your shopping experience and to see your previous orders.</Text>\r\n <Button variant=\"primary\" onClick={() => setView('register')}>Register</Button>\r\n </Flex.Col>\r\n <Flex.Col gap=\"1rem\" alignItems=\"flex-start\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Proceed as guest</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"60ch\">If you continue your purchase as a guest, we will request your shipping details and assign the appropriate sales outlet, but you will not need to create a personal account. If you would like to access your user area and your order history, please complete the purchase by registering your account.</Text>\r\n <Button variant=\"primary\" onClick={() => setView('address')}>Proceed</Button>\r\n </Flex.Col>\r\n </Flex.Col>\r\n </Grid>\r\n </Grid.Row>\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <Button variant=\"secondary\" onClick={onPrevious_}>Back</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n case 'address':\r\n return (<CheckoutUserInfo user={user} onUserInfo={onUserInfo} onNavToPrevious={onNavToPrevious} />);\r\n case 'login':\r\n return (<CheckoutLogin onSignedIn={onSignedIn} onNavToForgot={onNavToForgot} onNavToRegister={onNavToRegister} onNavToPrevious={onNavToPrevious} />);\r\n case 'register':\r\n return (<CheckoutRegister onSignedUp={onSignedUp} onNavToLogin={onNavToLogin} onNavToPrevious={onNavToPrevious} />);\r\n case 'register-success':\r\n return (<CheckoutRegisterSuccess onNavToLogin={onNavToLogin} onNavToPrevious={onNavToPrevious} />);\r\n case 'forgot':\r\n return (<CheckoutForgot onPasswordSent={onPasswordSent} onNavToLogin={onNavToLogin} onNavToRegister={onNavToRegister} onNavToPrevious={onNavToPrevious} />);\r\n case 'forgot-success':\r\n return (<CheckoutForgotSuccess onNavToLogin={onNavToLogin} onNavToPrevious={onNavToPrevious} />);\r\n default:\r\n return null;\r\n }\r\n };\r\n return (\r\n <>\r\n {getView()}\r\n </>\r\n );\r\n};\r\n","import { RequiredValidator, useFormSchema } from '@websolutespa/bom-mixer-forms';\r\nimport { useApi, useApiPost, useLabel } from '@websolutespa/bom-mixer-hooks';\r\nimport { Button, Container, FieldCard, Flex, Form, FormError, Loading, RadioCard, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useEffect, useState } from 'react';\r\nimport { useCheckout } from '../hooks';\r\nimport { ICheckoutPartial, ICheckoutPayment } from '../models/checkout/checkout';\r\n\r\nexport type CheckoutPaymentProps = {\r\n onPayment?: (payment: ICheckoutPayment) => void;\r\n onPrevious?: () => void;\r\n};\r\n\r\nexport const CheckoutPayment: React.FC<CheckoutPaymentProps> = ({ onPrevious, onPayment }: CheckoutPaymentProps) => {\r\n const label = useLabel();\r\n\r\n const api = useApi();\r\n\r\n const checkout = useCheckout((state) => state.checkout);\r\n const { setCheckout } = useCheckout((state) => state.actions);\r\n\r\n const [options, loading] = useApiPost<{ payments: ICheckoutPayment[] }>('/checkout/payments', checkout);\r\n\r\n const [error, setError] = useState<Error>();\r\n\r\n const required = RequiredValidator();\r\n\r\n const { form, setTouched, setValue } = useFormSchema<{ payment: ICheckoutPayment }>({\r\n payment: { schema: 'select', label: 'field.payment', options: options?.payments, validators: [required] },\r\n }, [options]);\r\n\r\n useEffect(() => {\r\n if (checkout.payment) {\r\n setValue({ payment: checkout.payment });\r\n } else if (options) {\r\n setValue({\r\n payment: options.payments[0],\r\n });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [options]);\r\n\r\n const onSubmit = async (event: React.FormEvent<HTMLFormElement> | React.MouseEvent<HTMLElement>) => {\r\n event.preventDefault();\r\n if (form.valid && form.value) {\r\n console.log('CheckoutPayment.valid', form.value);\r\n try {\r\n setError(undefined);\r\n const payment = form.value.payment;\r\n const response = await api.post<ICheckoutPartial>('/checkout/update', {\r\n action: 'payment',\r\n checkout: { ...checkout, payment },\r\n });\r\n setCheckout(response);\r\n if (typeof onPayment === 'function') {\r\n onPayment(payment);\r\n }\r\n } catch (error) {\r\n console.log('CheckoutPayment.error', error);\r\n setError(error as Error);\r\n }\r\n } else {\r\n console.log('CheckoutPayment.invalid');\r\n setTouched();\r\n }\r\n };\r\n\r\n const onPrevious_ = () => {\r\n if (typeof onPrevious === 'function') {\r\n onPrevious();\r\n }\r\n };\r\n\r\n const payment = form.controls.payment;\r\n\r\n const onPaymentChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n form.controls.payment.value = options?.payments.find(x => x.id.toString() === event.target.value);\r\n };\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container>\r\n <Form form={form} onSubmit={onSubmit}>\r\n <Flex.Col flex=\"1\" rowGap=\"2rem\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Select a payment method</Text>\r\n {loading && <Loading />}\r\n {true && payment &&\r\n <RadioCard.Group initialValue={payment.value?.id.toString()} onChange={onPaymentChange}>\r\n {options?.payments.map(option => (\r\n <RadioCard key={option.id} value={option.id.toString()} flex=\"0 0 calc(50% - 1rem)\">\r\n <RadioCard.Title>{option.name}</RadioCard.Title>\r\n {option.abstract && <RadioCard.Abstract dangerouslySetInnerHTML={{ __html: option.abstract }}></RadioCard.Abstract>}\r\n {option.media && <RadioCard.Media item={option.media} />}\r\n </RadioCard>\r\n ))}\r\n </RadioCard.Group>\r\n }\r\n {false && <FieldCard control={form.controls.payment} />}\r\n {error && <FormError error={error}>{label('form.submit.error')}</FormError>}\r\n </Flex.Col>\r\n </Form>\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <Button variant=\"secondary\" onClick={onPrevious_}>Back</Button>\r\n </Flex>\r\n <Flex>\r\n <Button variant=\"primary\" onClick={onSubmit}>Proceed</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { RequiredValidator, useFormSchema } from '@websolutespa/bom-mixer-forms';\r\nimport { useApi, useApiPost, useCurrency, useLabel, useUnit } from '@websolutespa/bom-mixer-hooks';\r\nimport { Badge, Box, Button, Container, FieldCard, Flex, Form, FormError, Grid, Loading, RadioCard, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useEffect, useState } from 'react';\r\nimport { useCheckout } from '../hooks';\r\nimport { ICheckoutItem, ICheckoutPartial, ICheckoutRetailer } from '../models/checkout/checkout';\r\nimport { CheckoutDiscount } from './checkout-discount';\r\n\r\nexport type CheckoutReviewProps = {\r\n onReview?: (retailer: ICheckoutRetailer) => void;\r\n onPrevious?: () => void;\r\n};\r\n\r\nexport const CheckoutReview: React.FC<CheckoutReviewProps> = ({ onPrevious, onReview }: CheckoutReviewProps) => {\r\n const label = useLabel();\r\n\r\n const api = useApi();\r\n\r\n const currency = useCurrency();\r\n\r\n const distance = useUnit('kilometer');\r\n\r\n const checkout = useCheckout((state) => state.checkout);\r\n const { setCheckout } = useCheckout((state) => state.actions);\r\n\r\n const [options, loading] = useApiPost<{ retailers: ICheckoutRetailer[] }>('/checkout/retailers', checkout);\r\n\r\n // console.log('CheckoutReview', checkout);\r\n\r\n const [error, setError] = useState<Error>();\r\n\r\n const required = RequiredValidator();\r\n\r\n const { form, setValue, setTouched } = useFormSchema<{ retailer: ICheckoutRetailer }>({\r\n retailer: { schema: 'select', label: 'field.retailer', options: options?.retailers, validators: [required] },\r\n }, [options]);\r\n\r\n useEffect(() => {\r\n if (checkout.retailer || checkout.discounts) {\r\n setValue({\r\n retailer: checkout.retailer,\r\n });\r\n } else if (options) {\r\n setValue({\r\n retailer: options.retailers[0],\r\n });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [options]);\r\n\r\n const selectedRetailer = form.value?.retailer;\r\n const shippingAddress = checkout.shippingAddress;\r\n const billingAddress = checkout.billingAddress;\r\n const delivery = checkout.delivery;\r\n const subTotal = checkout.subTotal || 0;\r\n const subTotalFull = checkout.subTotalFull || 0;\r\n const taxes = checkout.taxes || 0;\r\n const total = checkout.total || 0;\r\n\r\n const onSubmit = async (event: React.FormEvent<HTMLFormElement> | React.MouseEvent<HTMLElement>) => {\r\n event.preventDefault();\r\n if (form.valid && form.value) {\r\n console.log('CheckoutReview.valid', form.value);\r\n try {\r\n setError(undefined);\r\n const retailer = form.value.retailer;\r\n const response = await api.post<ICheckoutPartial>('/checkout/update', {\r\n action: 'retailer',\r\n checkout: { ...checkout, retailer },\r\n });\r\n setCheckout(response);\r\n if (typeof onReview === 'function') {\r\n onReview(retailer);\r\n }\r\n } catch (error) {\r\n console.log('CheckoutReview.error', error);\r\n setError(error as Error);\r\n }\r\n } else {\r\n console.log('CheckoutReview.invalid');\r\n setTouched();\r\n }\r\n };\r\n\r\n const onPrevious_ = () => {\r\n if (typeof onPrevious === 'function') {\r\n onPrevious();\r\n }\r\n };\r\n\r\n const retailer = form.controls.retailer;\r\n\r\n const onStoreChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n form.controls.retailer.value = options?.retailers.find(x => x.id.toString() === event.target.value);\r\n };\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container>\r\n <Flex.Col gap=\"2rem\" flexDirectionMd=\"row\">\r\n <Flex flexMd=\"1 1 calc(100% - 375px - 2rem)\" alignItemsMd=\"flex-start\">\r\n <Form form={form} onSubmit={onSubmit}>\r\n <Flex.Col flex=\"1\" rowGap=\"2rem\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Reference store</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\">Your suggested closest sales outlet for self-service pickup.</Text>\r\n {loading && <Loading />}\r\n {selectedRetailer &&\r\n <Flex.Col marginBottom=\"1rem\">\r\n <Text variant=\"heading40\" fontWeight=\"700\">{selectedRetailer.name}</Text>\r\n <Text>{selectedRetailer.address}, {selectedRetailer.streetNumber}</Text>\r\n <Text>{selectedRetailer.zipCode} {selectedRetailer.city} {selectedRetailer.country?.name}</Text>\r\n <Text>{selectedRetailer.phoneNumber}</Text>\r\n </Flex.Col>\r\n }\r\n {true && retailer &&\r\n <RadioCard.Group initialValue={retailer.value?.id.toString()} onChange={onStoreChange} maxWidth=\"60ch\">\r\n {options?.retailers.map(option => (\r\n <RadioCard key={option.id} value={option.id.toString()}>\r\n <RadioCard.Title>{option.name}</RadioCard.Title>\r\n {option.category && <RadioCard.Abstract>{option.category.name}</RadioCard.Abstract>}\r\n {option.distance && <RadioCard.Extra>{distance(option.distance)}</RadioCard.Extra>}\r\n </RadioCard>\r\n ))}\r\n </RadioCard.Group>\r\n }\r\n {false && <FieldCard control={form.controls.retailer} />}\r\n {error && <FormError error={error}>{label('form.submit.error')}</FormError>}\r\n <Grid.Row padding=\"2em 0\">\r\n <Grid md={6}>\r\n {shippingAddress &&\r\n <Flex.Col gap=\"1rem\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Shipping address</Text>\r\n <Flex.Col>\r\n <Text variant=\"heading40\" fontWeight=\"700\">{shippingAddress.firstName} {shippingAddress.lastName}</Text>\r\n <Text>{shippingAddress.address}, {shippingAddress.streetNumber}</Text>\r\n <Text>{shippingAddress.zipCode} {shippingAddress.city} {shippingAddress.country?.name}</Text>\r\n <Text>{shippingAddress.phoneNumber}</Text>\r\n <Text>{shippingAddress.email}</Text>\r\n </Flex.Col>\r\n </Flex.Col>\r\n }\r\n </Grid>\r\n <Grid md={6}>\r\n {billingAddress &&\r\n <Flex.Col gap=\"1rem\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Billing address</Text>\r\n <Flex.Col>\r\n <Text variant=\"heading40\" fontWeight=\"700\">{billingAddress.firstName} {billingAddress.lastName}</Text>\r\n <Text>{billingAddress.address}, {billingAddress.streetNumber}</Text>\r\n <Text>{billingAddress.zipCode} {billingAddress.city} {billingAddress.country?.name}</Text>\r\n <Text>{billingAddress.phoneNumber}</Text>\r\n <Text>{billingAddress.email}</Text>\r\n </Flex.Col></Flex.Col>\r\n }\r\n </Grid>\r\n </Grid.Row>\r\n </Flex.Col>\r\n </Form>\r\n </Flex>\r\n <Flex flexMd=\"0 0 375px\" alignItemsMd=\"flex-start\">\r\n <Flex.Col gap=\"1rem\" positionMd=\"sticky\" topMd=\"200px\">\r\n <Flex.Col gap=\"1rem\" padding=\"1rem\" borderRadius=\"0.5em\" border=\"1px solid var(--color-neutral-300)\"\r\n fontSize=\"0.9em\" lineHeight=\"1\">\r\n <Flex.Row gap=\"1rem\" fontWeight=\"700\">\r\n <Text flexGrow=\"1\">Product</Text>\r\n <Text flexBasis=\"40px\" textAlign=\"right\">Qty</Text>\r\n <Text flexBasis=\"90px\" textAlign=\"right\">Price</Text>\r\n </Flex.Row>\r\n <Flex.Col flex=\"1\" gap=\"1rem\" padding=\"1rem 0\"\r\n borderTop=\"1px solid var(--color-neutral-300)\"\r\n borderBottom=\"1px solid var(--color-neutral-300)\">\r\n {checkout.items && checkout.items.map((item: ICheckoutItem, i: number) =>\r\n <Flex.Row key={i} gap=\"1rem\">\r\n <Text flexGrow=\"1\">{item.article.title}</Text>\r\n <Text flexBasis=\"40px\" textAlign=\"right\">{item.qty}</Text>\r\n <Flex.Col flexBasis=\"90px\" alignItems=\"flex-end\" textAlign=\"right\">\r\n <Text>{currency(item.qty * item.price)}</Text>\r\n {item.fullPrice > item.price && <Text variant=\"paragraph40\" textDecoration=\"line-through\" color=\"var(--color-neutral-400)\">{currency(item.fullPrice * item.qty)}</Text>}\r\n </Flex.Col>\r\n </Flex.Row>\r\n )}\r\n </Flex.Col>\r\n <Flex.Row gap=\"1rem\">\r\n <Text flexGrow=\"1\">Subtotal</Text>\r\n <Text flexBasis=\"40px\" textAlign=\"right\">&nbsp;</Text>\r\n <Flex.Col flexBasis=\"90px\" alignItems=\"flex-end\" textAlign=\"right\">\r\n <Text>{currency(subTotal)}</Text>\r\n {subTotalFull > subTotal && <Text variant=\"paragraph40\" textDecoration=\"line-through\" color=\"var(--color-neutral-400)\">{currency(subTotalFull)}</Text>}\r\n </Flex.Col>\r\n </Flex.Row>\r\n {checkout.discounts && checkout.discounts.map((item, i) =>\r\n <Flex.Row key={i} gap=\"1rem\">\r\n <Text flexGrow=\"1\"><Badge>{item.discount.id}</Badge></Text>\r\n {item.discount.abstract && (\r\n <Text flexBasis=\"40px\" textAlign=\"right\" dangerouslySetInnerHTML={{ __html: item.discount.abstract }} />\r\n )}\r\n <Text flexBasis=\"90px\" textAlign=\"right\">{currency(item.price)}</Text>\r\n </Flex.Row>\r\n )}\r\n {taxes > 0 &&\r\n <Flex.Row gap=\"1rem\">\r\n <Text flexGrow=\"1\">Taxes</Text>\r\n <Text flexBasis=\"40px\" textAlign=\"right\">&nbsp;</Text>\r\n <Text flexBasis=\"90px\" textAlign=\"right\">{currency(taxes)}</Text>\r\n </Flex.Row>\r\n }\r\n {delivery &&\r\n <Flex.Row gap=\"1rem\">\r\n {delivery.delivery && (\r\n <Text flexGrow=\"1\">{delivery.delivery.name}</Text>\r\n )}\r\n <Text flexBasis=\"40px\" textAlign=\"right\">&nbsp;</Text>\r\n <Text flexBasis=\"90px\" textAlign=\"right\">{currency(delivery.price)}</Text>\r\n </Flex.Row>\r\n }\r\n <Flex.Row gap=\"1rem\" fontWeight=\"700\" marginBottom=\"1rem\">\r\n <Text flexGrow=\"1\">Total</Text>\r\n <Text flexBasis=\"40px\" textAlign=\"right\">&nbsp;</Text>\r\n <Text flexBasis=\"90px\" textAlign=\"right\">{currency(total)}</Text>\r\n </Flex.Row>\r\n </Flex.Col>\r\n <Box padding=\"1rem\" borderRadius=\"0.5em\" border=\"1px solid var(--color-neutral-300)\">\r\n <CheckoutDiscount />\r\n </Box>\r\n </Flex.Col>\r\n </Flex>\r\n </Flex.Col>\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <Button variant=\"secondary\" onClick={onPrevious_}>Back</Button>\r\n </Flex>\r\n <Flex>\r\n <Button variant=\"primary\" onClick={onSubmit}>Proceed</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { IUserAddress } from '@websolutespa/bom-mixer-auth';\r\nimport { Flex, Text } from '@websolutespa/bom-mixer-ui';\r\n\r\nexport type OrderAddressProps = {\r\n item: IUserAddress;\r\n title?: string;\r\n};\r\n\r\nexport const OrderAddress: React.FC<OrderAddressProps> = ({ item, title }) => {\r\n return (\r\n <Flex.Col gap=\"1rem\">\r\n {title && <Text variant=\"heading30\" fontWeight=\"700\">{title}</Text>}\r\n <Flex.Col>\r\n <Text fontWeight=\"700\">{item.firstName} {item.lastName}</Text>\r\n <Text>{item.address}, {item.streetNumber}</Text>\r\n <Text>{item.zipCode} {item.city} {item.country?.name}</Text>\r\n <Text>{item.phoneNumber}</Text>\r\n <Text>{item.email}</Text>\r\n </Flex.Col>\r\n </Flex.Col>\r\n );\r\n};\r\n","import { httpPost } from '@websolutespa/bom-core';\r\nimport { IUser, IUserRegister } from '@websolutespa/bom-mixer-auth';\r\nimport { EmailValidator, MatchValidator, RequiredTrueValidator, RequiredValidator, useFormSchema } from '@websolutespa/bom-mixer-forms';\r\nimport { useLabel } from '@websolutespa/bom-mixer-hooks';\r\nimport { Button, Container, FieldCollection, Flex, Form, FormError, FormTester, Grid, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useState } from 'react';\r\n\r\nexport type OrderRegisterProps = {\r\n className?: string;\r\n data: Partial<IUser>;\r\n onSignedUp?: () => void;\r\n};\r\n\r\nexport const OrderRegister: React.FC<OrderRegisterProps> = ({ className, data, onSignedUp }: OrderRegisterProps) => {\r\n const label = useLabel();\r\n\r\n const [registered, setRegistered] = useState<boolean>(false);\r\n\r\n const required = RequiredValidator();\r\n const requiredTrue = RequiredTrueValidator();\r\n const email = EmailValidator();\r\n const match = MatchValidator((value, rootValue, control, root) => {\r\n return rootValue?.password;\r\n });\r\n\r\n const { form, setTouched } = useFormSchema<IUserRegister>({\r\n password: { schema: 'password', label: 'field.password', validators: required },\r\n confirmPassword: { schema: 'password', label: 'field.confirmPassword', validators: [required, match] },\r\n firstName: { value: data.firstName, schema: 'text', label: 'field.firstName', validators: [required] },\r\n lastName: { value: data.lastName, schema: 'text', label: 'field.lastName', validators: [required] },\r\n email: { value: data.email, schema: 'text', label: 'field.email', validators: [required, email] },\r\n privacy: { schema: 'checkbox', label: 'field.privacy', validators: [requiredTrue] },\r\n checkField: { schema: 'text', hidden: true }, // check hidden field for antiforgery\r\n });\r\n\r\n const [error, setError] = useState<Error>();\r\n\r\n const onSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault();\r\n if (form.valid) {\r\n console.log('AuthRegister.valid', form.value);\r\n try {\r\n setError(undefined);\r\n await httpPost('/api/auth/register', form.value);\r\n setRegistered(true);\r\n if (typeof onSignedUp === 'function') {\r\n onSignedUp();\r\n }\r\n } catch (error) {\r\n console.log('AuthRegister.error', error);\r\n setError(error as Error);\r\n }\r\n } else {\r\n console.log('AuthRegister.invalid');\r\n setTouched();\r\n }\r\n };\r\n\r\n return (\r\n <Section className={className}>\r\n <Container>\r\n <Flex.Col gap=\"1rem\" padding=\"1.5rem 1rem\" borderRadius=\"0.5em\" border=\"1px solid var(--color-warning-500)\">\r\n {registered ?\r\n <>\r\n <Text variant=\"heading30\" fontWeight=\"700\">Account created</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"80ch\">A confimation email has been sent to you at {form.value?.email}. Please check your inbox.</Text>\r\n </> :\r\n <>\r\n <Text variant=\"heading30\" fontWeight=\"700\">Checkout faster next time</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"80ch\">Want easy order tracking and faster checkout? Just choose a password to create your account.</Text>\r\n <Form form={form} onSubmit={onSubmit}>\r\n <Grid.Row rowGap=\"1rem\">\r\n <FieldCollection collection={form} />\r\n </Grid.Row>\r\n {error && <FormError error={error}>{label('form.submit.error')}</FormError>}\r\n <Button type=\"submit\" variant=\"primary\" size=\"lg\" justifyContent=\"center\" margin=\"1rem 0\"><span>Create account</span></Button>\r\n <FormTester form={form} test={{\r\n firstName: 'John',\r\n lastName: 'Appleseed',\r\n email: 'john@appleseed.com',\r\n password: '123456Aa!',\r\n confirmPassword: '123456Aa!',\r\n privacy: true,\r\n }}></FormTester>\r\n </Form>\r\n </>\r\n }\r\n </Flex.Col>\r\n </Container>\r\n </Section>\r\n );\r\n};\r\n","import { useCurrency } from '@websolutespa/bom-mixer-hooks';\r\nimport { Button, Flex, Link, Media, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { ICheckoutItem } from '../models/checkout/checkout';\r\n\r\nexport const OrderSummaryItem: React.FC<{ item: ICheckoutItem }> = ({ item }: { item: ICheckoutItem }) => {\r\n\r\n const currency = useCurrency();\r\n const article = item.article;\r\n const price = currency(item.price);\r\n const totalPrice = currency(item.price * item.qty);\r\n\r\n return (\r\n <Flex.Row gap=\"2rem\" paddingBottom=\"1rem\" borderBottom=\"1px solid var(--color-neutral-300)\">\r\n <Flex flexGrow=\"1\">\r\n <Flex.Row gap=\"2rem\">\r\n {article.media && (\r\n <Media item={article.media} aspectRatio={1} width=\"120px\" height=\"120px\" flex=\"0 0 120px\" rounded />\r\n )}\r\n <Flex.Col alignItems=\"flex-start\">\r\n <Link href={article.href}>\r\n <Button as=\"a\" variant=\"nav\">\r\n <Text variant=\"paragraph20\" fontWeight=\"700\">{article.title}</Text>\r\n </Button>\r\n </Link>\r\n {article.abstract && (\r\n <Text variant=\"paragraph30\" dangerouslySetInnerHTML={{ __html: article.abstract }} />\r\n )}\r\n </Flex.Col>\r\n </Flex.Row>\r\n </Flex>\r\n <Flex flexBasis=\"110px\" justifyContent=\"flex-end\">\r\n <Text>{price}</Text>\r\n </Flex>\r\n <Flex flexBasis=\"120px\" justifyContent=\"center\">{item.qty.toString()}</Flex>\r\n <Flex flexBasis=\"110px\" justifyContent=\"flex-end\">\r\n <Text>{totalPrice}</Text>\r\n </Flex>\r\n </Flex.Row>\r\n );\r\n};\r\n","import { useCurrency, useLabel, useLayout } from '@websolutespa/bom-mixer-hooks';\r\nimport { Badge, Container, Flex, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { IOrder } from '../models/order/order';\r\nimport { OrderSummaryItem } from './order-summary-item';\r\n\r\nexport type OrderSummaryProps = {\r\n order: IOrder;\r\n};\r\n\r\nexport const OrderSummary: React.FC<OrderSummaryProps> = ({ order }: OrderSummaryProps) => {\r\n const label = useLabel();\r\n const layout = useLayout();\r\n const currency = useCurrency();\r\n // console.log('order', order);\r\n return (\r\n <>\r\n <Section>\r\n <Container>\r\n <Text variant=\"heading30\" fontWeight=\"700\">Order Summary</Text>\r\n <Flex.Row gap=\"2rem\" padding=\"1rem 0\" fontWeight=\"700\">\r\n <Text flexGrow=\"1\">Product</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">Unit price</Text>\r\n <Text flexBasis=\"120px\" textAlign=\"center\">Quantity</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">Price</Text>\r\n </Flex.Row>\r\n <Flex.Col flex=\"1\" gap=\"1rem\">\r\n {order.items && order.items.map((item, i) =>\r\n <OrderSummaryItem key={i} item={item} />\r\n )}\r\n <Flex.Row gap=\"1rem\">\r\n <Text flexGrow=\"1\">Subtotal</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">&nbsp;</Text>\r\n <Text flexBasis=\"120px\" textAlign=\"center\">&nbsp;</Text>\r\n <Text flexBasis=\"90px\" textAlign=\"right\">{currency(order.subTotal)}</Text>\r\n </Flex.Row>\r\n {order.discounts && order.discounts.map((item, i) =>\r\n <Flex.Row key={i} gap=\"1rem\">\r\n <Text flexGrow=\"1\"><Badge>{item.discount.id}</Badge></Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">&nbsp;</Text>\r\n {item.discount?.abstract && (\r\n <Text flexBasis=\"120px\" textAlign=\"center\" dangerouslySetInnerHTML={{ __html: item.discount.abstract }} />\r\n )}\r\n <Text flexBasis=\"90px\" textAlign=\"right\">{currency(item.price)}</Text>\r\n </Flex.Row>\r\n )}\r\n {order.taxes > 0 &&\r\n <Flex.Row gap=\"1rem\">\r\n <Text flexGrow=\"1\">Taxes</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">&nbsp;</Text>\r\n <Text flexBasis=\"120px\" textAlign=\"center\">&nbsp;</Text>\r\n <Text flexBasis=\"90px\" textAlign=\"right\">{currency(order.taxes)}</Text>\r\n </Flex.Row>\r\n }\r\n {order.delivery && (\r\n <Flex.Row gap=\"1rem\">\r\n <Text flexGrow=\"1\">{order.delivery.delivery.name}</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">&nbsp;</Text>\r\n <Text flexBasis=\"120px\" textAlign=\"center\">&nbsp;</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">{currency(order.delivery.price)}</Text>\r\n </Flex.Row>\r\n )}\r\n <Flex.Row gap=\"1rem\" fontWeight=\"700\" marginBottom=\"1rem\">\r\n <Text flexGrow=\"1\">Total</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">&nbsp;</Text>\r\n <Text flexBasis=\"120px\" textAlign=\"center\">&nbsp;</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">{currency(order.total)}</Text>\r\n </Flex.Row>\r\n </Flex.Col>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { useLabel } from '@websolutespa/bom-mixer-hooks';\r\nimport { Badge, Button, Container, Flex, Grid, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useEffect } from 'react';\r\nimport { useCart } from '../hooks/useCart/useCart';\r\nimport { IOrder } from '../models/order/order';\r\nimport { OrderAddress } from '../order/order-address';\r\nimport { OrderRegister } from '../order/order-register';\r\nimport { OrderSummary } from '../order/order-summary';\r\n\r\nexport type CheckoutSuccessProps = {\r\n order: IOrder;\r\n};\r\n\r\nexport const CheckoutSuccess: React.FC<CheckoutSuccessProps> = ({ order }: CheckoutSuccessProps) => {\r\n const label = useLabel();\r\n const { clear } = useCart(state => state.actions);\r\n\r\n useEffect(() => {\r\n clear();\r\n }, [clear]);\r\n\r\n // console.log('CheckoutSuccess', order);\r\n return (\r\n <>\r\n <Section position=\"sticky\" top=\"80px\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container.Fluid>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Text variant=\"paragraph10\" fontWeight=\"700\">Order #{order.number} <Badge>{label(`order.status.${order.status}`)}</Badge></Text>\r\n <Button className=\"print-none\" variant=\"primary\" onClick={() => window.print()}>Print</Button>\r\n </Flex.Row>\r\n </Container.Fluid>\r\n </Section>\r\n <Section className=\"print-none\">\r\n <Container>\r\n <Flex.Col gap=\"1rem\" alignItems=\"center\" textAlign=\"center\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Thank you for your order, {order.user ? order.user.firstName : order.shippingAddress.firstName}</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"80ch\">A confirmation email will be sent to you at {order.user ? order.user.email : order.shippingAddress.email} with your complete order details.</Text>\r\n </Flex.Col>\r\n </Container>\r\n </Section>\r\n {!order.user && (\r\n <OrderRegister className=\"print-none\" data={order.shippingAddress} />\r\n )}\r\n <OrderSummary order={order} />\r\n <Section>\r\n <Container>\r\n <Grid.Row padding=\"2em 0\">\r\n <Grid md={6}>\r\n {order.shippingAddress && (\r\n <OrderAddress item={order.shippingAddress} title={'Shipping address'} />\r\n )}\r\n </Grid>\r\n <Grid md={6}>\r\n {order.billingAddress && (\r\n <OrderAddress item={order.billingAddress} title={'Billing address'} />\r\n )}\r\n </Grid>\r\n </Grid.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { getClassNames } from '@websolutespa/bom-core';\r\nimport { scrollToY, useApi } from '@websolutespa/bom-mixer-hooks';\r\nimport { StoreStrategy, storeStrategy } from '@websolutespa/bom-mixer-store';\r\nimport { Container, Flex, Section, UIStyledComponentProps } from '@websolutespa/bom-mixer-ui';\r\nimport { useRouter } from 'next/router';\r\nimport { useState } from 'react';\r\nimport styled from 'styled-components';\r\nimport { useCheckout } from '../hooks';\r\nimport { ICheckoutDelivery, ICheckoutInfo, ICheckoutItem, ICheckoutPartial, ICheckoutPayment, ICheckoutPaymentRedirect, ICheckoutRetailer } from '../models/checkout/checkout';\r\nimport { CheckoutBasket } from './checkout-basket';\r\nimport { CheckoutDelivery } from './checkout-delivery';\r\nimport { CheckoutInfo } from './checkout-info';\r\nimport { CheckoutPayment } from './checkout-payment';\r\nimport { CheckoutReview } from './checkout-review';\r\n\r\nexport enum CheckoutStatus {\r\n None = -1,\r\n Basket = 0,\r\n Info = 1,\r\n Delivery = 2,\r\n Review = 3,\r\n Payment = 4,\r\n Complete = 5,\r\n Error = 6,\r\n}\r\n\r\nconst StyledWizard = styled(Flex.Row)`\r\n counter-reset: steps;\r\n\r\n & > div {\r\n counter-increment: steps;\r\n\t\ttext-transform: uppercase;\r\n\t\topacity: 0.25;\r\n\r\n &:before {\r\n content: counter(steps) \". \";\r\n display: block;\r\n font-size: 48px;\r\n font-weight: 100;\r\n line-height: 1;\r\n }\r\n\r\n &.active {\r\n opacity: 1;\r\n }\r\n\r\n @media(max-width: 800px) {\r\n\r\n &:not(.active) {\r\n font-size: 0;\r\n }\r\n\r\n &:before {\r\n font-size: 1rem;\r\n font-weight: 700;\r\n margin-right: 0.5rem;\r\n }\r\n }\r\n }\r\n`;\r\n\r\ntype Props = {\r\n onCheckout?: (checkout: ICheckoutPartial) => void;\r\n};\r\n\r\nexport type CheckoutWizardProps = UIStyledComponentProps<Props>;\r\n\r\nexport const CheckoutWizard: React.FC<CheckoutWizardProps> = ({ onCheckout, ...props }: CheckoutWizardProps) => {\r\n const router = useRouter();\r\n const api = useApi();\r\n\r\n const checkout = useCheckout((state) => state.checkout);\r\n // const { setCheckout } = useCheckout((state) => state.actions);\r\n const [status, setStatus] = useState<CheckoutStatus>(CheckoutStatus.Basket);\r\n\r\n console.log('CheckoutWizard', checkout, status);\r\n\r\n const onCheckout_ = (checkout: ICheckoutPartial) => {\r\n // setCheckout(checkout);\r\n if (typeof onCheckout === 'function') {\r\n onCheckout(checkout);\r\n }\r\n scrollToY(0);\r\n };\r\n\r\n // 1.\r\n const onBasket = (items: ICheckoutItem[]) => {\r\n console.log('CheckoutWizard.onBasket', items);\r\n onCheckout_({ ...checkout, items });\r\n setStatus(CheckoutStatus.Info);\r\n };\r\n\r\n // 2.\r\n const onInfo = (info: ICheckoutInfo) => {\r\n console.log('CheckoutWizard.onInfo', info);\r\n onCheckout_({ ...checkout, ...info });\r\n setStatus(CheckoutStatus.Delivery);\r\n };\r\n\r\n // 3.\r\n const onDelivery = (delivery: ICheckoutDelivery) => {\r\n console.log('CheckoutWizard.onDelivery', delivery);\r\n onCheckout_({ ...checkout, delivery });\r\n setStatus(CheckoutStatus.Review);\r\n };\r\n\r\n // 4.\r\n const onReview = (retailer: ICheckoutRetailer) => {\r\n console.log('CheckoutWizard.onReview', retailer);\r\n onCheckout_({ ...checkout, retailer });\r\n setStatus(CheckoutStatus.Payment);\r\n };\r\n\r\n // 5.\r\n const onPayment = async (payment: ICheckoutPayment) => {\r\n console.log('CheckoutWizard.onPayment', payment);\r\n try {\r\n const response = await api.post<ICheckoutPaymentRedirect>('/checkout/submit', { ...checkout, payment });\r\n console.log('onPayment.response', response);\r\n if (storeStrategy === StoreStrategy.Mock) {\r\n router.push(response.redirectUrl);\r\n } else {\r\n window.location.href = response.redirectUrl;\r\n }\r\n } catch (error) {\r\n console.error('onPayment.error', error);\r\n }\r\n /*\r\n onCheckout_({ ...checkout, payment });\r\n setStatus(CheckoutStatus.Complete);\r\n */\r\n };\r\n\r\n const onPrevious = () => {\r\n console.log('CheckoutWizard.onPrevious');\r\n if (status > CheckoutStatus.Basket) {\r\n setStatus(status - 1);\r\n }\r\n scrollToY(0);\r\n };\r\n\r\n return (\r\n <>\r\n <Section position=\"sticky\" top=\"80px\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <StyledWizard justifyContent=\"space-between\">\r\n <Flex className={getClassNames({ active: status === CheckoutStatus.Basket })}>Basket</Flex>\r\n <Flex className={getClassNames({ active: status === CheckoutStatus.Info })}>User data</Flex>\r\n <Flex className={getClassNames({ active: status === CheckoutStatus.Delivery })}>Delivery</Flex>\r\n <Flex className={getClassNames({ active: status === CheckoutStatus.Review })}>Review</Flex>\r\n <Flex className={getClassNames({ active: status === CheckoutStatus.Payment })}>Payment</Flex>\r\n <Flex className={getClassNames({ active: status === CheckoutStatus.Complete })}>Complete</Flex>\r\n </StyledWizard>\r\n </Container>\r\n </Section>\r\n {status === CheckoutStatus.Basket && <CheckoutBasket onBasket={onBasket} />}\r\n {status === CheckoutStatus.Info && <CheckoutInfo onInfo={onInfo} onPrevious={onPrevious} />}\r\n {status === CheckoutStatus.Delivery && <CheckoutDelivery onDelivery={onDelivery} onPrevious={onPrevious} />}\r\n {status === CheckoutStatus.Review && <CheckoutReview onReview={onReview} onPrevious={onPrevious} />}\r\n {status === CheckoutStatus.Payment && <CheckoutPayment onPayment={onPayment} onPrevious={onPrevious} />}\r\n </>\r\n );\r\n};\r\n","import { IEquatable, ValueOf } from '@websolutespa/bom-core';\r\nimport { ICheckout } from '../checkout/checkout';\r\n\r\nexport const IOrderStatus = {\r\n Pending: 'pending', // Customer started the checkout process but did not complete it. Incomplete orders are assigned a \"Pending\" status and can be found under the More tab in the View Orders screen.\r\n AwaitingPayment: 'awaitingPayment', // Customer has completed the checkout process, but payment has yet to be confirmed. Authorize only transactions that are not yet captured have this status.\r\n AwaitingFulfillment: 'awaitingFulfillment', // Customer has completed the checkout process and payment has been confirmed.\r\n AwaitingShipment: 'awaitingShipment', // Order has been pulled and packaged and is awaiting collection from a shipping provider.\r\n AwaitingPickup: 'awaitingPickup', // Order has been packaged and is awaiting customer pickup from a seller-specified location.\r\n PartiallyShipped: 'partiallyShipped', // Only some items in the order have been shipped.\r\n Completed: 'completed', // Order has been shipped/picked up, and receipt is confirmed; client has paid for their digital product, and their file(s) are available for download.\r\n Shipped: 'shipped', // Order has been shipped, but receipt has not been confirmed; seller has used the Ship Items action. A listing of all orders with a \"Shipped\" status can be found under the More tab of the View Orders screen.\r\n Cancelled: 'cancelled', // Seller has cancelled an order, due to a stock inconsistency or other reasons. Stock levels will automatically update depending on your Inventory Settings. Cancelling an order will not refund the order. This status is triggered automatically when an order using an authorize-only payment gateway is voided in the control panel before capturing payment.\r\n Declined: 'declined', // Seller has marked the order as declined.\r\n Refunded: 'refunded', // Seller has used the Refund action to refund the whole order. A listing of all orders with a \"Refunded\" status can be found under the More tab of the View Orders screen.\r\n Disputed: 'disputed', // Customer has initiated a dispute resolution process for the PayPal transaction that paid for the order or the seller has marked the order as a fraudulent order.\r\n ManualVerificationRequired: 'manualVerificationRequired', // Order on hold while some aspect, such as tax-exempt documentation, is manually confirmed. Orders with this status must be updated manually. Capturing funds or other order actions will not automatically update the status of an order marked Manual Verification Required.\r\n PartiallyRefunded: 'partiallyRefunded', // Seller has partially refunded the order.\r\n};\r\n\r\nexport type IOrderStatusValue = ValueOf<typeof IOrderStatus>;\r\n\r\nexport type IOrder = ICheckout & {\r\n id: IEquatable;\r\n createdAt: Date | string;\r\n updatedAt: Date | string;\r\n status: IOrderStatusValue;\r\n number: number;\r\n};\r\n\r\nexport type IOrderDetail = IOrder & {\r\n href: string;\r\n};\r\n","import { useCurrency, useDateTimeFormat, useLabel, useLayout } from '@websolutespa/bom-mixer-hooks';\r\nimport { Badge, Box, Button, Flex, NavLink, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { IOrderDetail } from '../models/order/order';\r\n\r\nexport type OrderItemProps = {\r\n item: IOrderDetail;\r\n};\r\n\r\nexport const OrderItem: React.FC<OrderItemProps> = ({ item }) => {\r\n const layout = useLayout();\r\n\r\n const label = useLabel();\r\n\r\n const dateTimeFormat = useDateTimeFormat({\r\n year: 'numeric',\r\n month: 'short',\r\n day: 'numeric',\r\n });\r\n\r\n const currency = useCurrency();\r\n\r\n const qty = item.items.reduce((p, c) => p + c.qty, 0);\r\n\r\n return (\r\n <Flex.Row gap=\"2rem\" padding=\"1rem\" border=\"1px solid var(--color-neutral-300)\">\r\n <Box flexBasis=\"80px\">\r\n <Text variant=\"paragraph40\" fontWeight=\"700\">ID</Text>\r\n <NavLink href={item.href}>\r\n <Button as=\"a\" variant=\"underline\">#{item.number}</Button>\r\n </NavLink>\r\n </Box>\r\n <Box flexBasis=\"120px\">\r\n <Text variant=\"paragraph40\" fontWeight=\"700\">Order placed</Text>\r\n <Text variant=\"paragraph30\">{dateTimeFormat(item.createdAt)}</Text>\r\n </Box>\r\n <Box flexBasis=\"160px\">\r\n <Text variant=\"paragraph40\" fontWeight=\"700\">Current status</Text>\r\n <Badge>{label(`order.status.${item.status}`)}</Badge>\r\n </Box>\r\n <Box flexBasis=\"120px\">\r\n <Text variant=\"paragraph40\" fontWeight=\"700\">Articles</Text>\r\n <Text variant=\"paragraph30\">{qty.toString()}</Text>\r\n </Box>\r\n <Box flexBasis=\"120px\" textAlign=\"right\">\r\n <Text variant=\"paragraph40\" fontWeight=\"700\">Total</Text>\r\n <Text variant=\"paragraph30\">{currency(item.total)}</Text>\r\n </Box>\r\n <Box flexGrow=\"1\" textAlign=\"right\">\r\n <NavLink href={item.href}>\r\n <Button as=\"a\" variant=\"primary\" size=\"sm\">Order detail</Button>\r\n </NavLink>\r\n </Box>\r\n </Flex.Row>\r\n );\r\n};\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["useStore","tenant?: ITenant","persistedState: any","currentState: TenantState","selector: (state: TenantState) => T","DEFAULT_PROPS: CartProps","useStore","article: IArticle","qty: number","item: IArticle","item: ICartItem","persistedState: any","currentState: CartState","selector: (state: CartState) => T","CartItem: React.FC<{ item: ICartItem }>","qty: number","Link","e: React.ChangeEvent<HTMLInputElement>","CartDrawer: React.FC<CartDrawerProps>","props: CartDrawerProps","useStore","checkout: ICheckoutPartial","persistedState: any","currentState: CheckoutState","selector: (state: CheckoutState) => T","CheckoutBasketItem: React.FC<{ item: ICheckoutItem }>","qty: number","CheckoutBasket: React.FC<CheckoutBasketProps>","CheckoutDelivery: React.FC<CheckoutDeliveryProps>","event: React.FormEvent<HTMLFormElement> | React.MouseEvent<HTMLElement>","delivery","response: ICheckoutPartial","error","event: React.ChangeEvent<HTMLInputElement>","CheckoutDiscount: React.FC<CheckoutDiscountProps>","event: React.FormEvent<HTMLFormElement> | React.MouseEvent<HTMLElement>","error","CheckoutEmpty: React.FC<CheckoutEmptyProps>","CheckoutError: React.FC<CheckoutErrorProps>","CheckoutForgot: React.FC<Props>","CheckoutForgotSuccess: React.FC<Props>","CheckoutLogin: React.FC<Props>","user: IUser","CheckoutRegister: React.FC<Props>","CheckoutRegisterSuccess: React.FC<Props>","CheckoutUserInfo: React.FC<CheckoutUserInfoProps>","value: any","rootValue: any","event: React.FormEvent<HTMLFormElement> | React.MouseEvent<HTMLElement>","error","CheckoutInfo: React.FC<CheckoutInfoProps>","view: string","view","info: ICheckoutInfo","user: IUser","user","CheckoutPayment: React.FC<CheckoutPaymentProps>","event: React.FormEvent<HTMLFormElement> | React.MouseEvent<HTMLElement>","payment","error","event: React.ChangeEvent<HTMLInputElement>","CheckoutReview: React.FC<CheckoutReviewProps>","event: React.FormEvent<HTMLFormElement> | React.MouseEvent<HTMLElement>","retailer","error","event: React.ChangeEvent<HTMLInputElement>","item: ICheckoutItem","i: number","OrderAddress: React.FC<OrderAddressProps>","OrderRegister: React.FC<OrderRegisterProps>","event: React.FormEvent<HTMLFormElement>","error","OrderSummaryItem: React.FC<{ item: ICheckoutItem }>","OrderSummary: React.FC<OrderSummaryProps>","CheckoutSuccess: React.FC<CheckoutSuccessProps>","CheckoutWizard: React.FC<CheckoutWizardProps>","checkout: ICheckoutPartial","checkout","items: ICheckoutItem[]","info: ICheckoutInfo","delivery: ICheckoutDelivery","retailer: ICheckoutRetailer","payment: ICheckoutPayment","OrderItem: React.FC<OrderItemProps>"],"sources":["../src/hooks/useTenant/useTenant.tsx","../src/hooks/useCart/useCart.tsx","../src/cart/cart-item.tsx","../src/cart/cart-drawer.tsx","../src/hooks/useCheckout/useCheckout.tsx","../src/checkout/checkout-basket-item.tsx","../src/checkout/checkout-basket.tsx","../src/checkout/checkout-delivery.tsx","../src/checkout/checkout-discount.tsx","../src/checkout/checkout-empty.tsx","../src/checkout/checkout-error.tsx","../src/checkout/checkout-forgot.tsx","../src/checkout/checkout-forgot-success.tsx","../src/checkout/checkout-login.tsx","../src/checkout/checkout-register.tsx","../src/checkout/checkout-register-success.tsx","../src/checkout/checkout-user-info.tsx","../src/checkout/checkout-info.tsx","../src/checkout/checkout-payment.tsx","../src/checkout/checkout-review.tsx","../src/order/order-address.tsx","../src/order/order-register.tsx","../src/order/order-summary-item.tsx","../src/order/order-summary.tsx","../src/checkout/checkout-success.tsx","../src/checkout/checkout-wizard.tsx","../src/models/order/order.ts","../src/order/order-item.tsx"],"sourcesContent":["import { createContext, useContext, useRef } from 'react';\r\nimport { createStore, useStore } from 'zustand';\r\nimport { StateStorage, createJSONStorage, persist } from 'zustand/middleware';\r\nimport { ITenant } from '../../models/tenant/tenant';\r\n\r\ntype TenantInitialProps = Partial<\r\n Omit<TenantProps, 'hydrated'>\r\n>;\r\n\r\ntype TenantProps = {\r\n hydrated: boolean;\r\n name?: string;\r\n tenant?: ITenant;\r\n};\r\n\r\ntype TenantActions = {\r\n setTenant(tenant?: ITenant): void;\r\n};\r\n\r\ntype TenantState = TenantProps & {\r\n actions: TenantActions,\r\n};\r\n\r\ntype TenantStore = ReturnType<typeof createTenantStore>;\r\n\r\nconst createTenantStore = ({ storage, ...initialProps }: { storage?: StateStorage } & TenantInitialProps) => {\r\n const DEFAULT_PROPS = {\r\n hydrated: false,\r\n };\r\n const useStore = createStore<TenantState>()(\r\n persist(\r\n (set, get) => ({\r\n ...DEFAULT_PROPS,\r\n ...initialProps,\r\n actions: {\r\n setTenant: (tenant?: ITenant) => set(state => ({ tenant })),\r\n },\r\n }),\r\n {\r\n name: `${initialProps.name || 'website'}-tenant`,\r\n storage: createJSONStorage(() => storage || localStorage),\r\n /*\r\n getStorage: () => {\r\n // console.log('useTenant.getStorage');\r\n return storage || localStorage;\r\n },\r\n */\r\n onRehydrateStorage: () => () => {\r\n useStore.setState({ hydrated: true });\r\n // console.log('onRehydrateStorage', useStore, useStore.getState());\r\n },\r\n merge: (persistedState: any, currentState: TenantState) => {\r\n if (persistedState.tenant && typeof persistedState.tenant === 'object') {\r\n currentState.tenant = { ...persistedState.tenant };\r\n }\r\n currentState.hydrated = true;\r\n return currentState;\r\n },\r\n }\r\n )\r\n );\r\n return useStore;\r\n};\r\n\r\nexport const TenantContext = createContext<TenantStore | null>(null);\r\n\r\ntype TenantProviderProps = React.PropsWithChildren<{\r\n tenant?: ITenant;\r\n name?: string;\r\n storage?: StateStorage;\r\n}>;\r\n\r\nfunction TenantProvider({ children, ...props }: TenantProviderProps) {\r\n const storeRef = useRef<TenantStore>(undefined);\r\n if (!storeRef.current) {\r\n storeRef.current = createTenantStore(props);\r\n }\r\n return (\r\n <TenantContext.Provider value={storeRef.current}>\r\n {children}\r\n </TenantContext.Provider>\r\n );\r\n}\r\n\r\nfunction useTenant<T>(selector: (state: TenantState) => T): T {\r\n let store = useContext(TenantContext);\r\n if (!store) {\r\n store = createTenantStore({});\r\n }\r\n return useStore(store, selector);\r\n}\r\n\r\nexport { TenantProvider, useTenant };\r\n\r\n","import { isObject } from '@websolutespa/bom-core';\r\nimport { createContext, useContext, useEffect, useRef, useState } from 'react';\r\nimport { createStore, useStore } from 'zustand';\r\nimport { StateStorage, createJSONStorage, persist } from 'zustand/middleware';\r\nimport { IArticle } from '../../models/article/article';\r\nimport { ICartItem } from '../../models/cart/cart';\r\nimport { ITenant } from '../../models/tenant/tenant';\r\nimport { useTenant } from '../useTenant/useTenant';\r\n\r\ntype CartProps = {\r\n hydrated: boolean;\r\n items: ICartItem[];\r\n name?: string;\r\n tenant?: ITenant;\r\n checkoutUrl?: string;\r\n shopUrl?: string;\r\n};\r\n\r\ntype CartActions = {\r\n count(): number;\r\n has(item: IArticle): boolean;\r\n find(item: IArticle): ICartItem | undefined;\r\n add(item: IArticle, qty?: number): void;\r\n remove(item: ICartItem): number;\r\n update(item: ICartItem): void;\r\n clear(): void;\r\n};\r\n\r\ntype CartState = CartProps & {\r\n actions: CartActions;\r\n};\r\n\r\ntype CartStore = ReturnType<typeof createCartStore>;\r\n\r\nconst createCartStore = ({ storage, ...initialProps }: { storage?: StateStorage } & Partial<Omit<CartProps, 'hydrated'>>) => {\r\n const DEFAULT_PROPS: CartProps = {\r\n hydrated: false,\r\n items: [],\r\n };\r\n const useStore = createStore<CartState>()(\r\n persist(\r\n (set, get) => ({\r\n ...DEFAULT_PROPS,\r\n ...initialProps,\r\n actions: {\r\n add: (article: IArticle, qty: number = 1) => set(state => {\r\n const items = state.items.slice();\r\n const index = items.findIndex(x => x.article.id === article.id);\r\n if (index === -1) {\r\n items.push({ article, price: article.price, fullPrice: article.price, qty });\r\n } else {\r\n items[index].qty += qty;\r\n }\r\n return { items };\r\n }),\r\n clear: () => set(state => ({ items: [] })),\r\n count: () => {\r\n return get().items.length;\r\n },\r\n find: (item: IArticle) => {\r\n return get().items.find(x => x.article.id === item.id);\r\n },\r\n has: (item: IArticle) => {\r\n return get().items.find(x => x.article.id === item.id) != null;\r\n },\r\n remove: (item: ICartItem) => {\r\n let count = 0;\r\n set(state => {\r\n const items = state.items.slice();\r\n const index = items.findIndex(x => x.article.id === item.article.id);\r\n if (index !== -1) {\r\n items.splice(index, 1);\r\n }\r\n count = items.length;\r\n return { items };\r\n });\r\n return count;\r\n },\r\n update: (item: ICartItem) => set(state => {\r\n const items = state.items.slice();\r\n const index = items.findIndex(x => x.article.id === item.article.id);\r\n if (index !== -1) {\r\n items[index] = item;\r\n }\r\n return { items };\r\n }),\r\n },\r\n }),\r\n {\r\n name: `${initialProps.name || 'website'}-cart-${initialProps.tenant?.id || ''}`,\r\n storage: createJSONStorage(() => storage || localStorage),\r\n /*\r\n getStorage: () => {\r\n // console.log('useCart.getStorage');\r\n return storage || localStorage;\r\n },\r\n */\r\n onRehydrateStorage: () => () => {\r\n useStore.setState({ hydrated: true });\r\n // console.log('onRehydrateStorage', useStore, useStore.getState());\r\n },\r\n merge: (persistedState: any, currentState: CartState) => {\r\n if (persistedState.items && Array.isArray(persistedState.items)) {\r\n currentState.items = [...persistedState.items];\r\n }\r\n if (persistedState.tenant && isObject(persistedState.tenant)) {\r\n currentState.tenant = { ...persistedState.tenant };\r\n }\r\n currentState.hydrated = true;\r\n return currentState;\r\n },\r\n }\r\n )\r\n );\r\n return useStore;\r\n};\r\n\r\nexport const CartContext = createContext<CartStore | null>(null);\r\n\r\ntype CartProviderProps = React.PropsWithChildren<{\r\n items?: ICartItem[];\r\n checkoutUrl?: string;\r\n shopUrl?: string;\r\n name?: string;\r\n storage?: StateStorage;\r\n}>;\r\n\r\nfunction CartProvider({ children, ...props }: CartProviderProps) {\r\n const storeRef = useRef<CartStore>(undefined);\r\n if (!storeRef.current) {\r\n storeRef.current = createCartStore(props);\r\n }\r\n const [tenant, setTenant] = useState<ITenant | undefined>();\r\n const storeTenant = useTenant(state => state.tenant);\r\n useEffect(() => {\r\n if (tenant !== storeTenant) {\r\n setTenant(storeTenant);\r\n storeRef.current = createCartStore({ ...props, tenant: storeTenant });\r\n console.log('CartProvider setTenant', storeTenant);\r\n }\r\n }, [props, storeTenant, tenant]);\r\n return (\r\n <CartContext.Provider value={storeRef.current}>\r\n {children}\r\n </CartContext.Provider>\r\n );\r\n}\r\n\r\nfunction useCart<T>(selector: (state: CartState) => T): T {\r\n const store = useContext(CartContext);\r\n if (!store) throw new Error('Missing CartContext.Provider in the tree');\r\n return useStore(store, selector);\r\n}\r\n\r\nexport { CartProvider, useCart };\r\n\r\n","import { useCurrency, useDrawer, useMounted } from '@websolutespa/bom-mixer-hooks';\r\nimport { IconMinus, IconPlus, IconTrash } from '@websolutespa/bom-mixer-icons';\r\nimport { Button, Card, Flex, Input, Media, Text } from '@websolutespa/bom-mixer-ui';\r\nimport Link from 'next/link';\r\nimport { useCart } from '../hooks/useCart/useCart';\r\nimport { ICartItem } from '../models/cart/cart';\r\n\r\nexport const CartItem: React.FC<{ item: ICartItem }> = ({ item }: { item: ICartItem }) => {\r\n const currency = useCurrency();\r\n const mounted = useMounted();\r\n const [drawer, openDrawer, closeDrawer] = useDrawer();\r\n const { update, remove } = useCart(state => state.actions);\r\n\r\n function onSetQty(qty: number) {\r\n if (qty > 0) {\r\n update({ ...item, qty });\r\n } else {\r\n onRemove();\r\n }\r\n }\r\n\r\n function onRemove() {\r\n const count = remove(item);\r\n if (count < 1) {\r\n closeDrawer();\r\n }\r\n }\r\n\r\n const article = item.article;\r\n if (!article) {\r\n return;\r\n }\r\n return (\r\n <>\r\n <Card marginBottom=\"2rem\" paddingBottom=\"1rem\" borderBottom=\"1px solid var(--color-neutral-300)\">\r\n <Flex.Row alignItems=\"flex-start\">\r\n <Flex>\r\n {article.media && (\r\n <Media item={article.media} aspectRatio={1} width=\"80px\" height=\"80px\" flex=\"0 0 80px\" rounded />\r\n )}\r\n </Flex>\r\n <Card.Content flex=\"1\" padding=\"0 1rem\">\r\n <Link href={article.href}>\r\n <Text variant=\"paragraph20\" fontWeight=\"700\" onClick={closeDrawer}>{article.title}</Text>\r\n </Link>\r\n {article.abstract && (\r\n <Text variant=\"paragraph30\" marginBottom=\"1rem\" dangerouslySetInnerHTML={{ __html: article.abstract }} />\r\n )}\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Button onClick={() => onSetQty(item.qty - 1)} ><IconMinus width=\"20px\" height=\"20px\" /></Button>\r\n <Input width=\"60px\" padding=\"0.2rem\" placeholder=\"qty\" value={item.qty.toString()} onChange={(e: React.ChangeEvent<HTMLInputElement>) => onSetQty(Number(e.target.value))} />\r\n <Button size=\"xs\" onClick={() => onSetQty(item.qty + 1)} ><IconPlus width=\"20px\" height=\"20px\" /></Button>\r\n <Text width=\"80px\" textAlign=\"right\">{currency(item.price * item.qty)}</Text>\r\n {mounted && <Button onClick={onRemove}><IconTrash width=\"20px\" height=\"20px\" /></Button>}\r\n </Flex.Row>\r\n </Card.Content>\r\n </Flex.Row>\r\n </Card>\r\n </>\r\n );\r\n};\r\n","import { useCurrency, useLayout } from '@websolutespa/bom-mixer-hooks';\r\nimport { IconArrowRight, IconShoppingCart } from '@websolutespa/bom-mixer-icons';\r\nimport { Button, Divider, Drawer, DrawerProps, Flex, NavLink, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useCart } from '../hooks/useCart/useCart';\r\nimport { CartItem } from './cart-item';\r\n\r\nexport type CartDrawerProps = Partial<Omit<DrawerProps, | 'children'>>;\r\n\r\nexport const CartDrawer: React.FC<CartDrawerProps> = (props: CartDrawerProps) => {\r\n const layout = useLayout();\r\n const currency = useCurrency();\r\n const items = useCart((state) => state.items);\r\n const checkoutUrl = useCart((state) => state.checkoutUrl || layout.topLevelHrefs.checkout);\r\n const shopUrl = useCart((state) => state.shopUrl || layout.topLevelHrefs.shop_index);\r\n const totalAmount = items.reduce((p, c) => p + c.price * c.qty, 0);\r\n return (\r\n <Drawer name=\"cart\" placement=\"right\" {...props}>\r\n <Drawer.Header>\r\n <Drawer.Title>\r\n <Text variant=\"paragraph10\" fontWeight=\"700\" as=\"span\">Shopping cart</Text>\r\n </Drawer.Title>\r\n </Drawer.Header>\r\n <Drawer.Subtitle>\r\n <Divider>{items.length} items found</Divider>\r\n </Drawer.Subtitle>\r\n <Drawer.Content flex=\"1\" display=\"flex\" width=\"100vw\" maxWidth=\"400px\">\r\n <Flex.Col justifyContent=\"space-between\">\r\n {items && (\r\n <Flex.Col flex=\"1\">\r\n {items.map((item, i) =>\r\n <CartItem key={i} item={item} />\r\n )}\r\n </Flex.Col>\r\n )}\r\n <Flex.Row justifyContent=\"space-between\" alignItems=\"center\" padding=\"1rem 0 0.5rem 0\">\r\n <Text fontWeight=\"700\">Subtotal</Text>\r\n <Text fontWeight=\"700\">{currency(totalAmount)}</Text>\r\n </Flex.Row>\r\n <Flex.Row justifyContent=\"space-between\" alignItems=\"center\" padding=\"0.5rem 0 1.5rem 0\">\r\n <Text>Shipping and taxes calculated at checkout</Text>\r\n </Flex.Row>\r\n <NavLink href={checkoutUrl}>\r\n <Button as=\"a\" variant=\"primary\" size=\"lg\" position=\"sticky\" bottom=\"1rem\" justifyContent=\"center\" onClick={props.onClose}>\r\n <span>Checkout</span> <IconShoppingCart />\r\n </Button>\r\n </NavLink>\r\n <Flex.Row justifyContent=\"center\" alignItems=\"center\" padding=\"1rem 0\">\r\n <span>or</span>\r\n <NavLink href={shopUrl}>\r\n <Button as=\"a\" variant=\"link\" onClick={props.onClose}>\r\n <span>Continue shopping</span> <IconArrowRight />\r\n </Button>\r\n </NavLink>\r\n </Flex.Row>\r\n </Flex.Col>\r\n </Drawer.Content>\r\n </Drawer>\r\n );\r\n};\r\n","import { IAddressOptions } from '@websolutespa/bom-mixer-models';\r\nimport { createContext, useContext, useEffect, useRef, useState } from 'react';\r\nimport { createStore, useStore } from 'zustand';\r\nimport { StateStorage, createJSONStorage, persist } from 'zustand/middleware';\r\nimport { ICheckoutPartial } from '../../models/checkout/checkout';\r\nimport { ITenant } from '../../models/tenant/tenant';\r\nimport { useTenant } from '../useTenant/useTenant';\r\n\r\ntype CheckoutInitialProps = Partial<\r\n Omit<CheckoutProps, 'hydrated' | 'data'>\r\n> & {\r\n data: IAddressOptions;\r\n};\r\n\r\ntype CheckoutProps = {\r\n hydrated: boolean;\r\n data: IAddressOptions;\r\n checkout: ICheckoutPartial;\r\n name?: string;\r\n tenant?: ITenant;\r\n};\r\n\r\ntype CheckoutActions = {\r\n setCheckout(checkout: ICheckoutPartial): void;\r\n};\r\n\r\ntype CheckoutState = CheckoutProps & {\r\n actions: CheckoutActions,\r\n};\r\n\r\ntype CheckoutStore = ReturnType<typeof createCheckoutStore>;\r\n\r\nconst createCheckoutStore = ({ storage, ...initialProps }: { storage?: StateStorage } & CheckoutInitialProps) => {\r\n const DEFAULT_PROPS = {\r\n hydrated: false,\r\n checkout: {},\r\n };\r\n const useStore = createStore<CheckoutState>()(\r\n persist(\r\n (set, get) => ({\r\n ...DEFAULT_PROPS,\r\n ...initialProps,\r\n actions: {\r\n setCheckout: (checkout: ICheckoutPartial) => set(state => {\r\n return {\r\n checkout: {\r\n ...checkout,\r\n tenant: state.tenant,\r\n },\r\n };\r\n }),\r\n },\r\n }),\r\n {\r\n name: `${initialProps.name || 'website'}-checkout-${initialProps.tenant?.id || ''}`,\r\n storage: createJSONStorage(() => storage || localStorage),\r\n /*\r\n getStorage: () => {\r\n // console.log('useCheckout.getStorage');\r\n return storage || localStorage;\r\n },\r\n */\r\n onRehydrateStorage: () => () => {\r\n useStore.setState({ hydrated: true });\r\n // console.log('onRehydrateStorage', useStore, useStore.getState());\r\n },\r\n merge: (persistedState: any, currentState: CheckoutState) => {\r\n if (persistedState.checkout && typeof persistedState.checkout === 'object') {\r\n currentState.checkout = { ...persistedState.checkout };\r\n }\r\n currentState.hydrated = true;\r\n return currentState;\r\n },\r\n }\r\n )\r\n );\r\n return useStore;\r\n};\r\n\r\nexport const CheckoutContext = createContext<CheckoutStore | null>(null);\r\n\r\ntype CheckoutProviderProps = React.PropsWithChildren<{\r\n data: IAddressOptions;\r\n checkout?: ICheckoutPartial;\r\n name?: string;\r\n storage?: StateStorage;\r\n}>;\r\n\r\nfunction CheckoutProvider({ children, ...props }: CheckoutProviderProps) {\r\n const storeRef = useRef<CheckoutStore>(undefined);\r\n if (!storeRef.current) {\r\n storeRef.current = createCheckoutStore(props);\r\n }\r\n const [tenant, setTenant] = useState<ITenant | undefined>();\r\n const storeTenant = useTenant(state => state.tenant);\r\n useEffect(() => {\r\n if (tenant !== storeTenant) {\r\n setTenant(storeTenant);\r\n storeRef.current = createCheckoutStore({ ...props, tenant: storeTenant });\r\n console.log('CheckoutProvider setTenant', storeTenant);\r\n }\r\n }, [props, storeTenant, tenant]);\r\n return (\r\n <CheckoutContext.Provider value={storeRef.current}>\r\n {children}\r\n </CheckoutContext.Provider>\r\n );\r\n}\r\n\r\nfunction useCheckout<T>(selector: (state: CheckoutState) => T): T {\r\n const store = useContext(CheckoutContext);\r\n if (!store) throw new Error('Missing CheckoutContext.Provider in the tree');\r\n return useStore(store, selector);\r\n}\r\n\r\nexport { CheckoutProvider, useCheckout };\r\n\r\n","import { useCurrency } from '@websolutespa/bom-mixer-hooks';\r\nimport { IconMinus, IconPlus, IconTrash } from '@websolutespa/bom-mixer-icons';\r\nimport { Button, Flex, Input, Link, Media, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useCart } from '../hooks';\r\nimport { ICheckoutItem } from '../models/checkout/checkout';\r\n\r\nexport const CheckoutBasketItem: React.FC<{ item: ICheckoutItem }> = ({ item }: { item: ICheckoutItem }) => {\r\n\r\n const currency = useCurrency();\r\n\r\n const { update, remove } = useCart(state => state.actions);\r\n\r\n function onSetQty(qty: number) {\r\n if (qty > 0) {\r\n update({ ...item, qty });\r\n } else {\r\n onRemove();\r\n }\r\n }\r\n\r\n function onRemove() {\r\n const count = remove(item);\r\n console.log('onRemove', count);\r\n }\r\n\r\n const article = item.article;\r\n\r\n return (\r\n <Flex.Row gap=\"2rem\" paddingBottom=\"1rem\" borderBottom=\"1px solid var(--color-neutral-300)\">\r\n <Flex flex=\"0 1 calc(100% - 420px)\">\r\n <Flex.Row gap=\"2rem\">\r\n {article.media && (\r\n <Media item={article.media} aspectRatio={1} width=\"120px\" height=\"120px\" flex=\"0 0 120px\" rounded />\r\n )}\r\n <Flex.Col alignItems=\"flex-start\">\r\n <Link href={article.href}>\r\n <Button as=\"a\" variant=\"nav\">\r\n <Text variant=\"paragraph20\" fontWeight=\"700\">{article.title}</Text>\r\n </Button>\r\n </Link>\r\n {article.abstract && (\r\n <Text variant=\"paragraph30\" dangerouslySetInnerHTML={{ __html: article.abstract }} />\r\n )}\r\n </Flex.Col>\r\n </Flex.Row>\r\n </Flex>\r\n <Flex.Col flexBasis=\"110px\" alignItems=\"flex-end\">\r\n <Text>{currency(item.price)}</Text>\r\n {item.fullPrice > item.price && <Text variant=\"paragraph40\" textDecoration=\"line-through\" color=\"var(--color-neutral-400)\">{currency(item.fullPrice)}</Text>}\r\n </Flex.Col>\r\n <Flex flexBasis=\"120px\" justifyContent=\"center\">\r\n <Flex.Row>\r\n <Button onClick={() => onSetQty(item.qty - 1)} ><IconMinus width=\"20px\" height=\"20px\" /></Button>\r\n <Input width=\"60px\" padding=\"0.2rem\" placeholder=\"qty\" value={item.qty.toString()} onChange={(e) => onSetQty(Number(e.target.value))} />\r\n <Button size=\"xs\" onClick={() => onSetQty(item.qty + 1)} ><IconPlus width=\"20px\" height=\"20px\" /></Button>\r\n </Flex.Row>\r\n </Flex>\r\n <Flex flexBasis=\"80px\" justifyContent=\"center\">\r\n <Button onClick={onRemove}><IconTrash width=\"20px\" height=\"20px\" /></Button>\r\n </Flex>\r\n <Flex.Col flexBasis=\"110px\" alignItems=\"flex-end\">\r\n <Text>{currency(item.price * item.qty)}</Text>\r\n {item.fullPrice > item.price && <Text variant=\"paragraph40\" textDecoration=\"line-through\" color=\"var(--color-neutral-400)\">{currency(item.fullPrice * item.qty)}</Text>}\r\n </Flex.Col>\r\n </Flex.Row>\r\n );\r\n};\r\n","import { useApi, useApiPost, useCurrency, useLabel, useLayout } from '@websolutespa/bom-mixer-hooks';\r\nimport { IconPercent, IconTruck } from '@websolutespa/bom-mixer-icons';\r\nimport { Box, Button, Container, Flex, Loading, NavLink, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useCart, useCheckout } from '../hooks';\r\nimport { ICheckoutItem, ICheckoutPartial } from '../models/checkout/checkout';\r\nimport { CheckoutBasketItem } from './checkout-basket-item';\r\n\r\nexport type CheckoutBasketProps = {\r\n onBasket?: (items: ICheckoutItem[]) => void;\r\n};\r\n\r\nexport const CheckoutBasket: React.FC<CheckoutBasketProps> = ({ onBasket }: CheckoutBasketProps) => {\r\n\r\n const label = useLabel();\r\n\r\n const layout = useLayout();\r\n\r\n const api = useApi();\r\n\r\n const currency = useCurrency();\r\n\r\n const cartItems = useCart((state) => state.items);\r\n const shopUrl = useCart((state) => state.shopUrl || layout.topLevelHrefs.shop_index);\r\n\r\n const checkout = useCheckout((state) => state.checkout);\r\n const { setCheckout } = useCheckout((state) => state.actions);\r\n\r\n const [items = [], loading] = useApiPost<ICheckoutItem[]>('/checkout/items', { ...checkout, items: cartItems });\r\n\r\n const subTotal = items.reduce((p, c) => {\r\n return p + c.price * c.qty;\r\n }, 0);\r\n\r\n const subTotalFull = items.reduce((p, c) => {\r\n return p + c.fullPrice * c.qty;\r\n }, 0);\r\n\r\n const onBasket_ = async () => {\r\n try {\r\n const response = await api.post<ICheckoutPartial>('/checkout/update', {\r\n action: 'basket',\r\n checkout: { ...checkout, items },\r\n });\r\n setCheckout(response);\r\n if (typeof onBasket === 'function') {\r\n onBasket(items);\r\n }\r\n } catch (error) {\r\n console.error('CheckoutBasket.onBasket_.error', error);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container minHeight=\"50vh\">\r\n {loading && <Loading />}\r\n {!loading && (\r\n <>\r\n <Flex.Row gap=\"2rem\" padding=\"1rem 0\" fontWeight=\"700\">\r\n <Text flex=\"0 1 calc(100% - 420px)\">Product</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">Unit price</Text>\r\n <Text flexBasis=\"120px\" textAlign=\"center\">Quantity</Text>\r\n <Text flexBasis=\"80px\" textAlign=\"center\">&nbsp;</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">Price</Text>\r\n </Flex.Row>\r\n <Flex.Col flex=\"1\" gap=\"1rem\">\r\n {items && items.map((item, i) =>\r\n <CheckoutBasketItem key={i} item={item} />\r\n )}\r\n <Flex.Row gap=\"1rem\" fontWeight=\"700\" marginBottom=\"1rem\">\r\n <Text flex=\"0 1 calc(100% - 420px)\">Subtotal</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">&nbsp;</Text>\r\n <Text flexBasis=\"120px\" textAlign=\"center\">&nbsp;</Text>\r\n <Text flexBasis=\"80px\" textAlign=\"center\">&nbsp;</Text>\r\n <Flex.Col flexBasis=\"110px\" alignItems=\"flex-end\" textAlign=\"right\">\r\n <Text>{currency(subTotal)}</Text>\r\n {subTotalFull > subTotal && <Text variant=\"paragraph40\" textDecoration=\"line-through\" color=\"var(--color-neutral-400)\">{currency(subTotalFull)}</Text>}\r\n </Flex.Col>\r\n </Flex.Row>\r\n </Flex.Col>\r\n <Flex.Col gap=\"1rem\">\r\n <Box borderRadius=\"0.5rem\" border=\"1px solid var(--color-neutral-300)\">\r\n <Flex.Row padding=\"1rem\">\r\n <IconTruck width=\"2rem\" height=\"2rem\" color=\"var(--color-primary-500)\" />\r\n <Box marginLeft=\"0.5rem\">\r\n <Text variant=\"paragraph20\" fontWeight=\"700\">The shipping is on us</Text>\r\n <Text variant=\"paragraph30\">Free, contactless delivery for payments over the minimum fare.</Text>\r\n </Box>\r\n </Flex.Row>\r\n </Box>\r\n <Box borderRadius=\"0.5rem\" border=\"1px solid var(--color-neutral-300)\">\r\n <Flex.Row padding=\"1rem\">\r\n <IconPercent width=\"2rem\" height=\"2rem\" color=\"var(--color-primary-500)\" />\r\n <Box marginLeft=\"0.5rem\">\r\n <Text variant=\"paragraph20\" fontWeight=\"700\">Do you have a discount code?</Text>\r\n <Text variant=\"paragraph30\">You can enter it in the following steps, before the final checkout.</Text>\r\n </Box>\r\n </Flex.Row>\r\n </Box>\r\n </Flex.Col>\r\n </>\r\n )}\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <NavLink href={shopUrl}>\r\n <Button as=\"a\" variant=\"link\">Continue shopping</Button>\r\n </NavLink>\r\n </Flex>\r\n <Flex>\r\n <Button variant=\"primary\" onClick={onBasket_}>Proceed</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { RequiredValidator, useFormSchema } from '@websolutespa/bom-mixer-forms';\r\nimport { useApi, useApiPost, useCurrency, useLabel } from '@websolutespa/bom-mixer-hooks';\r\nimport { Button, Container, FieldCard, Flex, Form, FormError, Loading, RadioCard, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useEffect, useState } from 'react';\r\nimport { useCheckout } from '../hooks';\r\nimport { ICheckoutDelivery, ICheckoutPartial } from '../models/checkout/checkout';\r\n\r\nexport type CheckoutDeliveryProps = {\r\n onDelivery?: (delivery: ICheckoutDelivery) => void;\r\n onPrevious?: () => void;\r\n};\r\n\r\nexport const CheckoutDelivery: React.FC<CheckoutDeliveryProps> = ({ onPrevious, onDelivery }: CheckoutDeliveryProps) => {\r\n const label = useLabel();\r\n\r\n const currency = useCurrency();\r\n\r\n const api = useApi();\r\n\r\n const checkout = useCheckout((state) => state.checkout);\r\n const { setCheckout } = useCheckout((state) => state.actions);\r\n\r\n const [options, loading] = useApiPost<{ deliveries: ICheckoutDelivery[] }>('/checkout/deliveries', checkout);\r\n\r\n const [error, setError] = useState<Error>();\r\n\r\n const required = RequiredValidator();\r\n\r\n const { form, setValue } = useFormSchema<{ delivery: ICheckoutDelivery }>({\r\n delivery: { schema: 'card', label: 'field.delivery', options: options?.deliveries, validators: [required] },\r\n }, [options]);\r\n\r\n useEffect(() => {\r\n if (checkout.delivery) {\r\n setValue({ delivery: checkout.delivery });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [options]);\r\n\r\n const onSubmit = async (event: React.FormEvent<HTMLFormElement> | React.MouseEvent<HTMLElement>) => {\r\n event.preventDefault();\r\n if (form.valid && form.value) {\r\n console.log('CheckoutDelivery.valid', form.value);\r\n try {\r\n setError(undefined);\r\n const delivery = form.value.delivery;\r\n const response: ICheckoutPartial = await api.post<ICheckoutPartial>('/checkout/update', {\r\n action: 'delivery',\r\n checkout: { ...checkout, delivery },\r\n });\r\n setCheckout(response);\r\n if (typeof onDelivery === 'function') {\r\n onDelivery(delivery);\r\n }\r\n } catch (error) {\r\n console.log('CheckoutDelivery.error', error);\r\n setError(error as Error);\r\n }\r\n } else {\r\n console.log('CheckoutDelivery.invalid');\r\n form.touched = true;\r\n }\r\n };\r\n\r\n const onPrevious_ = () => {\r\n if (typeof onPrevious === 'function') {\r\n onPrevious();\r\n }\r\n };\r\n\r\n const delivery = form.controls.delivery;\r\n\r\n const onDeliveryChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n form.controls.delivery.value = options?.deliveries.find(x => x.id.toString() === event.target.value);\r\n };\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container minHeight=\"50vh\">\r\n <Flex.Col justifyContent=\"space-between\">\r\n <Form form={form} onSubmit={onSubmit}>\r\n <Flex.Col flex=\"1\" rowGap=\"2rem\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Select the delivery method</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"60ch\">Specify your delivery or reference address to find your closest sales outlet for self-service pickup.</Text>\r\n {loading && <Loading />}\r\n {true && delivery &&\r\n <RadioCard.Group initialValue={delivery.value?.id.toString()} onChange={onDeliveryChange}>\r\n {options?.deliveries.map(option => (\r\n <RadioCard key={option.id} value={option.id.toString()}>\r\n <RadioCard.Title>{option.name}</RadioCard.Title>\r\n {option.abstract && <RadioCard.Abstract dangerouslySetInnerHTML={{ __html: option.abstract }}></RadioCard.Abstract>}\r\n {option.price > 0 && <RadioCard.Extra>{currency(option.price)}</RadioCard.Extra>}\r\n </RadioCard>\r\n ))}\r\n </RadioCard.Group>\r\n }\r\n {false && <FieldCard control={form.controls.delivery} />}\r\n {error && <FormError error={error}>{label('form.submit.error')}</FormError>}\r\n </Flex.Col>\r\n </Form>\r\n </Flex.Col>\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <Button variant=\"secondary\" onClick={onPrevious_}>Back</Button>\r\n </Flex>\r\n <Flex>\r\n <Button variant=\"primary\" onClick={onSubmit}>Proceed</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { RequiredValidator, useFormSchema } from '@websolutespa/bom-mixer-forms';\r\nimport { useApi, useLabel } from '@websolutespa/bom-mixer-hooks';\r\nimport { Button, FieldText, Flex } from '@websolutespa/bom-mixer-ui';\r\nimport { useState } from 'react';\r\nimport { useCheckout } from '../hooks';\r\nimport { ICheckout, ICheckoutDiscount } from '../models/checkout/checkout';\r\n\r\nexport type CheckoutDiscountProps = {\r\n onDiscount?: (discounts: ICheckoutDiscount[]) => void;\r\n};\r\n\r\nexport const CheckoutDiscount: React.FC<CheckoutDiscountProps> = ({ onDiscount }: CheckoutDiscountProps) => {\r\n const label = useLabel();\r\n\r\n const api = useApi();\r\n\r\n const checkout = useCheckout((state) => state.checkout);\r\n const { setCheckout } = useCheckout((state) => state.actions);\r\n\r\n // console.log('CheckoutDiscount', checkout);\r\n\r\n const [error, setError] = useState<Error>();\r\n\r\n const required = RequiredValidator();\r\n\r\n const { form } = useFormSchema<{ discountCode: number }>({\r\n discountCode: { schema: 'text', label: 'field.discountCode' },\r\n });\r\n\r\n const onSubmit = async (event: React.FormEvent<HTMLFormElement> | React.MouseEvent<HTMLElement>) => {\r\n event.preventDefault();\r\n if (form.valid && form.value) {\r\n // console.log('CheckoutDiscount.valid', form.value);\r\n try {\r\n setError(undefined);\r\n const response = await api.post<ICheckout>('/checkout/discount', { checkout, discountCode: form.value.discountCode });\r\n setCheckout(response);\r\n if (typeof onDiscount === 'function') {\r\n onDiscount(response.discounts);\r\n }\r\n form.reset();\r\n } catch (error) {\r\n console.log('CheckoutDiscount.error', error);\r\n setError(error as Error);\r\n }\r\n } else {\r\n console.log('CheckoutDiscount.invalid');\r\n form.touched = true;\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Flex.Row gap=\"1rem\">\r\n <FieldText control={form.controls.discountCode} after={<Button variant=\"secondary\" onClick={onSubmit}>{label('form.apply')}</Button>} />\r\n </Flex.Row>\r\n </>\r\n );\r\n};\r\n","import { useLabel, useLayout } from '@websolutespa/bom-mixer-hooks';\r\nimport { Button, Container, Flex, NavLink, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useCart } from '../hooks/useCart/useCart';\r\n\r\nexport type CheckoutEmptyProps = {\r\n};\r\n\r\nexport const CheckoutEmpty: React.FC<CheckoutEmptyProps> = () => {\r\n const label = useLabel();\r\n const layout = useLayout();\r\n const shopUrl = useCart((state) => state.shopUrl || layout.topLevelHrefs.shop_index);\r\n return (\r\n <>\r\n <Section>\r\n <Container minHeight=\"50vh\">\r\n <Flex.Col gap=\"1rem\" alignItems=\"center\" textAlign=\"center\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Your cart is empty.</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"80ch\">All’interno di Mixer Shop è possibile acquistare i campioni delle collezioni Tiles, 3D Elements e Paints, complementi d’arredo in materiali inediti, elementi decorativi esclusivi e oggettistica legata all’universo del brand.</Text>\r\n <NavLink href={shopUrl}>\r\n <Button as=\"a\" variant=\"primary\">Continue shopping</Button>\r\n </NavLink>\r\n </Flex.Col>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { useLabel } from '@websolutespa/bom-mixer-hooks';\r\nimport { Container, Flex, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { IOrder } from '../models/order/order';\r\n\r\nexport type CheckoutErrorProps = {\r\n order?: IOrder;\r\n};\r\n\r\nexport const CheckoutError: React.FC<CheckoutErrorProps> = ({ order }: CheckoutErrorProps) => {\r\n const label = useLabel();\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container minHeight=\"50vh\">\r\n {order ? (\r\n <Flex.Col gap=\"1rem\" alignItems=\"center\" textAlign=\"center\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Payment unsuccesful</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"80ch\">There was a problem processing this payment. Please contact your payment provider if needed.</Text>\r\n </Flex.Col>\r\n ) : (\r\n <Flex.Col gap=\"1rem\" alignItems=\"center\" textAlign=\"center\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Order not found</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"80ch\">There was a problem processing this order.</Text>\r\n </Flex.Col>\r\n )}\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { AuthForgot } from '@websolutespa/bom-mixer-auth';\r\nimport { Button, Container, Flex, Section } from '@websolutespa/bom-mixer-ui';\r\n\r\ntype Props = {\r\n onPasswordSent?: () => void;\r\n onNavToLogin?: () => void;\r\n onNavToRegister?: () => void;\r\n onNavToPrevious?: () => void;\r\n};\r\n\r\nexport const CheckoutForgot: React.FC<Props> = ({ onPasswordSent, onNavToLogin, onNavToRegister, onNavToPrevious }: Props) => {\r\n\r\n const onPasswordSent_ = () => {\r\n if (typeof onPasswordSent === 'function') {\r\n onPasswordSent();\r\n }\r\n };\r\n\r\n const onNavToLogin_ = () => {\r\n if (typeof onNavToLogin === 'function') {\r\n onNavToLogin();\r\n }\r\n };\r\n\r\n const onNavToRegister_ = () => {\r\n if (typeof onNavToRegister === 'function') {\r\n onNavToRegister();\r\n }\r\n };\r\n\r\n const onNavToPrevious_ = () => {\r\n if (typeof onNavToPrevious === 'function') {\r\n onNavToPrevious();\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container>\r\n <AuthForgot onPasswordSent={onPasswordSent_} onNavToLogin={onNavToLogin_} onNavToRegister={onNavToRegister_} />\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <Button variant=\"secondary\" onClick={onNavToPrevious_}>Back</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { AuthForgotSuccess } from '@websolutespa/bom-mixer-auth';\r\nimport { Button, Container, Flex, Section } from '@websolutespa/bom-mixer-ui';\r\n\r\ntype Props = {\r\n onNavToLogin?: () => void;\r\n onNavToPrevious?: () => void;\r\n};\r\n\r\nexport const CheckoutForgotSuccess: React.FC<Props> = ({ onNavToLogin, onNavToPrevious }: Props) => {\r\n\r\n const onNavToLogin_ = () => {\r\n if (typeof onNavToLogin === 'function') {\r\n onNavToLogin();\r\n }\r\n };\r\n\r\n const onNavToPrevious_ = () => {\r\n if (typeof onNavToPrevious === 'function') {\r\n onNavToPrevious();\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container>\r\n <AuthForgotSuccess onNavToLogin={onNavToLogin_} />\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <Button variant=\"secondary\" onClick={onNavToPrevious_}>Back</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { AuthLogin, IUser } from '@websolutespa/bom-mixer-auth';\r\nimport { Button, Container, Flex, Section } from '@websolutespa/bom-mixer-ui';\r\n\r\ntype Props = {\r\n onSignedIn?: (user: IUser) => void;\r\n onNavToForgot?: () => void;\r\n onNavToRegister?: () => void;\r\n onNavToPrevious?: () => void;\r\n};\r\n\r\nexport const CheckoutLogin: React.FC<Props> = ({ onSignedIn, onNavToForgot, onNavToRegister, onNavToPrevious }: Props) => {\r\n\r\n const onSignedIn_ = (user: IUser) => {\r\n if (typeof onSignedIn === 'function') {\r\n onSignedIn(user);\r\n }\r\n };\r\n\r\n const onNavToForgot_ = () => {\r\n if (typeof onNavToForgot === 'function') {\r\n onNavToForgot();\r\n }\r\n };\r\n\r\n const onNavToRegister_ = () => {\r\n if (typeof onNavToRegister === 'function') {\r\n onNavToRegister();\r\n }\r\n };\r\n\r\n const onNavToPrevious_ = () => {\r\n if (typeof onNavToPrevious === 'function') {\r\n onNavToPrevious();\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container>\r\n <AuthLogin onSignedIn={onSignedIn_} onNavToForgot={onNavToForgot_} onNavToRegister={onNavToRegister_} />\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <Button variant=\"secondary\" onClick={onNavToPrevious_}>Back</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { AuthRegister } from '@websolutespa/bom-mixer-auth';\r\nimport { Button, Container, Flex, Section } from '@websolutespa/bom-mixer-ui';\r\n\r\ntype Props = {\r\n onSignedUp?: () => void;\r\n onNavToLogin?: () => void;\r\n onNavToPrevious?: () => void;\r\n};\r\n\r\nexport const CheckoutRegister: React.FC<Props> = ({ onSignedUp, onNavToLogin, onNavToPrevious }: Props) => {\r\n\r\n const onSignedUp_ = () => {\r\n if (typeof onSignedUp === 'function') {\r\n onSignedUp();\r\n }\r\n };\r\n\r\n const onNavToLogin_ = () => {\r\n if (typeof onNavToLogin === 'function') {\r\n onNavToLogin();\r\n }\r\n };\r\n\r\n const onNavToPrevious_ = () => {\r\n if (typeof onNavToPrevious === 'function') {\r\n onNavToPrevious();\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container>\r\n <AuthRegister onSignedUp={onSignedUp_} onNavToLogin={onNavToLogin_} />\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <Button variant=\"secondary\" onClick={onNavToPrevious_}>Back</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { AuthRegisterSuccess } from '@websolutespa/bom-mixer-auth';\r\nimport { Button, Container, Flex, Section } from '@websolutespa/bom-mixer-ui';\r\n\r\ntype Props = {\r\n onNavToLogin?: () => void;\r\n onNavToPrevious?: () => void;\r\n};\r\n\r\nexport const CheckoutRegisterSuccess: React.FC<Props> = ({ onNavToLogin, onNavToPrevious }: Props) => {\r\n\r\n const onNavToLogin_ = () => {\r\n if (typeof onNavToLogin === 'function') {\r\n onNavToLogin();\r\n }\r\n };\r\n\r\n const onNavToPrevious_ = () => {\r\n if (typeof onNavToPrevious === 'function') {\r\n onNavToPrevious();\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container>\r\n <AuthRegisterSuccess onNavToLogin={onNavToLogin_} />\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <Button variant=\"secondary\" onClick={onNavToPrevious_}>Back</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { IUser, IUserAddress } from '@websolutespa/bom-mixer-auth';\r\nimport { EmailValidator, RequiredIfValidator, RequiredTrueValidator, RequiredValidator, useFormSchema } from '@websolutespa/bom-mixer-forms';\r\nimport { useApi, useApiPost, useLabel } from '@websolutespa/bom-mixer-hooks';\r\nimport { IAddressOptions } from '@websolutespa/bom-mixer-models';\r\nimport { Button, Container, FieldCollection, Flex, Form, FormError, FormTester, Grid, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useEffect, useState } from 'react';\r\nimport { useCheckout } from '../hooks';\r\nimport { ICheckoutInfo, ICheckoutPartial } from '../models';\r\n\r\nexport type CheckoutUserInfoProps = {\r\n user?: IUser | null;\r\n onUserInfo?: (userInfo: ICheckoutInfo) => void;\r\n onNavToPrevious?: () => void;\r\n};\r\n\r\nexport const CheckoutUserInfo: React.FC<CheckoutUserInfoProps> = ({ user, onUserInfo, onNavToPrevious }: CheckoutUserInfoProps) => {\r\n const label = useLabel();\r\n\r\n const api = useApi();\r\n\r\n const checkout = useCheckout((state) => state.checkout);\r\n const { setCheckout } = useCheckout((state) => state.actions);\r\n\r\n const [options, loading] = useApiPost<IAddressOptions>('/checkout/info', checkout);\r\n\r\n const required = RequiredValidator();\r\n const requiredTrue = RequiredTrueValidator();\r\n const email = EmailValidator();\r\n\r\n const shippingRequiredIfItaly = RequiredIfValidator((value, rootValue) => rootValue?.shippingAddress?.country?.id === 'it');\r\n const shippingHiddenIfNotItaly = (value: any, rootValue: any) => !(rootValue?.shippingAddress?.country?.id === 'it');\r\n\r\n const billingRequired = RequiredIfValidator((value, rootValue) => rootValue?.hasBilling === true);\r\n const billingHidden = (value: any, rootValue: any) => !(rootValue?.hasBilling === true);\r\n const billingHiddenIfNotItaly = (value: any, rootValue: any) => !(rootValue?.billingAddress?.country?.id === 'it');\r\n // const billingRequiredIfItaly = RequiredIfValidator((value, rootValue) => rootValue?.billingAddress?.country?.id === 'it');\r\n\r\n const { form, setValue, setTouched } = useFormSchema<Omit<ICheckoutInfo, 'user'>>({\r\n\r\n shippingAddress: {\r\n schema: 'group', label: 'field.shippingAddress', children: {\r\n firstName: { schema: 'text', label: 'field.firstName',\r\n validators: [required],\r\n },\r\n lastName: { schema: 'text', label: 'field.lastName',\r\n validators: [required],\r\n },\r\n email: { schema: 'text', label: 'field.email',\r\n validators: [required, email],\r\n },\r\n phoneNumber: { schema: 'text', label: 'field.phoneNumber',\r\n validators: [required],\r\n },\r\n country: { schema: 'select', label: 'field.country', options: options?.countries,\r\n validators: [required],\r\n },\r\n region: {\r\n schema: 'select', label: 'field.region', options: options?.regions,\r\n validators: shippingRequiredIfItaly,\r\n disabled: shippingHiddenIfNotItaly,\r\n hidden: shippingHiddenIfNotItaly,\r\n },\r\n province: {\r\n schema: 'combobox', label: 'field.province', options: options?.provinces,\r\n validators: shippingRequiredIfItaly,\r\n disabled: shippingHiddenIfNotItaly,\r\n hidden: shippingHiddenIfNotItaly,\r\n },\r\n address: { schema: 'text', label: 'field.address',\r\n validators: [required],\r\n },\r\n streetNumber: { schema: 'text', label: 'field.streetNumber',\r\n validators: [required],\r\n },\r\n zipCode: { schema: 'text', label: 'field.zipCode',\r\n validators: [required],\r\n },\r\n city: { schema: 'text', label: 'field.city',\r\n validators: [required],\r\n },\r\n },\r\n },\r\n\r\n hasInvoice: { schema: 'checkbox', label: 'field.hasInvoice' },\r\n\r\n hasBilling: { schema: 'checkbox', label: 'field.hasBilling' },\r\n\r\n billingAddress: {\r\n schema: 'group', label: 'field.billingAddress', children: {\r\n firstName: { schema: 'text', label: 'field.firstName',\r\n validators: [billingRequired],\r\n },\r\n lastName: { schema: 'text', label: 'field.lastName',\r\n validators: [billingRequired],\r\n },\r\n email: { schema: 'text', label: 'field.email',\r\n validators: [billingRequired, email] },\r\n phoneNumber: { schema: 'text', label: 'field.phoneNumber',\r\n validators: [billingRequired],\r\n },\r\n country: { schema: 'select', label: 'field.country', options: options?.countries,\r\n validators: [billingRequired],\r\n },\r\n region: {\r\n schema: 'select', label: 'field.region', options: options?.regions,\r\n validators: [billingRequired],\r\n disabled: billingHiddenIfNotItaly,\r\n hidden: billingHiddenIfNotItaly,\r\n },\r\n province: {\r\n schema: 'combobox', label: 'field.province', options: options?.provinces,\r\n validators: [billingRequired],\r\n disabled: billingHiddenIfNotItaly,\r\n hidden: billingHiddenIfNotItaly,\r\n },\r\n address: { schema: 'text', label: 'field.address',\r\n validators: [billingRequired],\r\n },\r\n streetNumber: { schema: 'text', label: 'field.streetNumber',\r\n validators: [billingRequired],\r\n },\r\n zipCode: { schema: 'text', label: 'field.zipCode',\r\n validators: [billingRequired],\r\n },\r\n city: { schema: 'text', label: 'field.city',\r\n validators: [billingRequired],\r\n },\r\n },\r\n disabled: billingHidden,\r\n hidden: billingHidden,\r\n },\r\n\r\n checkField: { schema: 'text', hidden: true }, // check hidden field for antiforgery\r\n\r\n }, [options]);\r\n\r\n useEffect(() => {\r\n // console.log('CheckoutUserInfo', options);\r\n\r\n if (checkout.shippingAddress) {\r\n setValue({\r\n shippingAddress: checkout.shippingAddress,\r\n hasInvoice: checkout.hasInvoice,\r\n hasBilling: checkout.hasBilling,\r\n billingAddress: checkout.billingAddress,\r\n });\r\n } else if (user) {\r\n setValue({\r\n shippingAddress: {\r\n firstName: user.firstName,\r\n lastName: user.lastName,\r\n } as IUserAddress,\r\n });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [options]);\r\n\r\n const [error, setError] = useState<Error>();\r\n\r\n const onSubmit = async (event: React.FormEvent<HTMLFormElement> | React.MouseEvent<HTMLElement>) => {\r\n event.preventDefault();\r\n if (form.valid && form.value) {\r\n console.log('CheckoutUserInfo.valid', form.value);\r\n try {\r\n setError(undefined);\r\n const response = await api.post<ICheckoutPartial>('/checkout/update', {\r\n action: 'info',\r\n checkout: { ...checkout, ...form.value, user },\r\n });\r\n setCheckout(response);\r\n if (typeof onUserInfo === 'function') {\r\n onUserInfo({ ...form.value, user });\r\n }\r\n } catch (error) {\r\n console.log('CheckoutUserInfo.error', error);\r\n setError(error as Error);\r\n }\r\n } else {\r\n console.log('CheckoutUserInfo.invalid');\r\n setTouched();\r\n }\r\n };\r\n\r\n const onNavToPrevious_ = () => {\r\n if (typeof onNavToPrevious === 'function') {\r\n onNavToPrevious();\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container>\r\n <Flex.Col justifyContent=\"space-between\">\r\n <Form form={form} onSubmit={onSubmit}>\r\n <Flex.Col flex=\"1\" rowGap=\"1rem\">\r\n <Text variant=\"heading10\" fontWeight=\"700\" marginBottom=\"1rem\">Reference address</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"60ch\">Specify your delivery or reference address to find your closest sales outlet for self-service pickup.</Text>\r\n <Grid.Row rowGap=\"1rem\">\r\n <FieldCollection collection={form} />\r\n </Grid.Row>\r\n {error && <FormError error={error}>{label('form.submit.error')}</FormError>}\r\n <FormTester form={form} test={{\r\n shippingAddress: {\r\n firstName: 'John',\r\n lastName: 'Appleseed',\r\n email: 'john@appleseed.com',\r\n phoneNumber: '390721411112',\r\n country: { id: 'it', name: 'Italy' },\r\n region: { id: '11', name: 'Marche' },\r\n province: { id: '041', name: 'Pesaro e Urbino' },\r\n address: 'Strada della Campanara',\r\n streetNumber: '15',\r\n zipCode: '61122',\r\n city: 'Pesaro',\r\n },\r\n hasInvoice: false,\r\n hasBilling: false,\r\n }} ></FormTester>\r\n </Flex.Col>\r\n </Form>\r\n </Flex.Col>\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <Button variant=\"secondary\" onClick={onNavToPrevious_}>Back</Button>\r\n </Flex>\r\n <Flex>\r\n <Button variant=\"primary\" onClick={onSubmit} disabled={loading}>Proceed</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { IUser, useUser } from '@websolutespa/bom-mixer-auth';\r\nimport { scrollToY, useLabel } from '@websolutespa/bom-mixer-hooks';\r\nimport { Button, Container, Flex, Grid, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useState } from 'react';\r\nimport { useCheckout } from '../hooks';\r\nimport { ICheckoutInfo } from '../models/checkout/checkout';\r\nimport { CheckoutForgot } from './checkout-forgot';\r\nimport { CheckoutForgotSuccess } from './checkout-forgot-success';\r\nimport { CheckoutLogin } from './checkout-login';\r\nimport { CheckoutRegister } from './checkout-register';\r\nimport { CheckoutRegisterSuccess } from './checkout-register-success';\r\nimport { CheckoutUserInfo } from './checkout-user-info';\r\n\r\nexport type CheckoutInfoProps = {\r\n onInfo?: (info: ICheckoutInfo) => void;\r\n onPrevious?: () => void;\r\n};\r\n\r\nexport const CheckoutInfo: React.FC<CheckoutInfoProps> = ({ onPrevious, onInfo }: CheckoutInfoProps) => {\r\n const label = useLabel();\r\n\r\n const checkout = useCheckout((state) => state.checkout);\r\n const user = useUser((state) => state.user);\r\n const { setUser } = useUser((state) => state.actions);\r\n\r\n const [view, setView] = useState((checkout.shippingAddress || user) ? 'address' : 'choose');\r\n\r\n // const [user, setUser] = useState<IUser>();\r\n\r\n const onView = (view: string) => {\r\n setView(view);\r\n scrollToY(0);\r\n };\r\n\r\n const onUserInfo = (info: ICheckoutInfo) => {\r\n if (typeof onInfo === 'function') {\r\n onInfo(info);\r\n }\r\n };\r\n\r\n const onSignedIn = (user: IUser) => {\r\n console.log('onSignedIn');\r\n setUser(user);\r\n onView('address');\r\n };\r\n\r\n const onSignedUp = () => {\r\n console.log('onSignedUp');\r\n onView('register-success');\r\n };\r\n\r\n const onPasswordSent = () => {\r\n console.log('onPasswordSent');\r\n onView('forgot-success');\r\n };\r\n\r\n const onNavToLogin = () => {\r\n onView('login');\r\n };\r\n\r\n const onNavToRegister = () => {\r\n onView('register');\r\n };\r\n\r\n const onNavToForgot = () => {\r\n onView('forgot');\r\n };\r\n\r\n const onNavToPrevious = () => {\r\n onView('choose');\r\n };\r\n\r\n const onPrevious_ = () => {\r\n if (typeof onPrevious === 'function') {\r\n onPrevious();\r\n }\r\n scrollToY(0);\r\n };\r\n\r\n const getView = () => {\r\n switch (view) {\r\n case 'choose':\r\n return (\r\n <>\r\n <Section>\r\n <Container minHeight=\"50vh\">\r\n <Grid.Row rowGap=\"3rem\">\r\n <Grid sm={6}>\r\n <Flex.Col gap=\"1rem\" alignItems=\"flex-start\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Login</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"60ch\">Login to optimise your shopping experience and to see your previous orders.</Text>\r\n <Button variant=\"primary\" onClick={() => setView('login')}>Login</Button>\r\n </Flex.Col>\r\n </Grid>\r\n <Grid sm={6}>\r\n <Flex.Col gap=\"2rem\">\r\n <Flex.Col gap=\"1rem\" alignItems=\"flex-start\" marginBottom=\"3rem\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Register</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"60ch\">Register to optimise your shopping experience and to see your previous orders.</Text>\r\n <Button variant=\"primary\" onClick={() => setView('register')}>Register</Button>\r\n </Flex.Col>\r\n <Flex.Col gap=\"1rem\" alignItems=\"flex-start\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Proceed as guest</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"60ch\">If you continue your purchase as a guest, we will request your shipping details and assign the appropriate sales outlet, but you will not need to create a personal account. If you would like to access your user area and your order history, please complete the purchase by registering your account.</Text>\r\n <Button variant=\"primary\" onClick={() => setView('address')}>Proceed</Button>\r\n </Flex.Col>\r\n </Flex.Col>\r\n </Grid>\r\n </Grid.Row>\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <Button variant=\"secondary\" onClick={onPrevious_}>Back</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n case 'address':\r\n return (<CheckoutUserInfo user={user} onUserInfo={onUserInfo} onNavToPrevious={onNavToPrevious} />);\r\n case 'login':\r\n return (<CheckoutLogin onSignedIn={onSignedIn} onNavToForgot={onNavToForgot} onNavToRegister={onNavToRegister} onNavToPrevious={onNavToPrevious} />);\r\n case 'register':\r\n return (<CheckoutRegister onSignedUp={onSignedUp} onNavToLogin={onNavToLogin} onNavToPrevious={onNavToPrevious} />);\r\n case 'register-success':\r\n return (<CheckoutRegisterSuccess onNavToLogin={onNavToLogin} onNavToPrevious={onNavToPrevious} />);\r\n case 'forgot':\r\n return (<CheckoutForgot onPasswordSent={onPasswordSent} onNavToLogin={onNavToLogin} onNavToRegister={onNavToRegister} onNavToPrevious={onNavToPrevious} />);\r\n case 'forgot-success':\r\n return (<CheckoutForgotSuccess onNavToLogin={onNavToLogin} onNavToPrevious={onNavToPrevious} />);\r\n default:\r\n return null;\r\n }\r\n };\r\n return (\r\n <>\r\n {getView()}\r\n </>\r\n );\r\n};\r\n","import { RequiredValidator, useFormSchema } from '@websolutespa/bom-mixer-forms';\r\nimport { useApi, useApiPost, useLabel } from '@websolutespa/bom-mixer-hooks';\r\nimport { Button, Container, FieldCard, Flex, Form, FormError, Loading, RadioCard, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useEffect, useState } from 'react';\r\nimport { useCheckout } from '../hooks';\r\nimport { ICheckoutPartial, ICheckoutPayment } from '../models/checkout/checkout';\r\n\r\nexport type CheckoutPaymentProps = {\r\n onPayment?: (payment: ICheckoutPayment) => void;\r\n onPrevious?: () => void;\r\n};\r\n\r\nexport const CheckoutPayment: React.FC<CheckoutPaymentProps> = ({ onPrevious, onPayment }: CheckoutPaymentProps) => {\r\n const label = useLabel();\r\n\r\n const api = useApi();\r\n\r\n const checkout = useCheckout((state) => state.checkout);\r\n const { setCheckout } = useCheckout((state) => state.actions);\r\n\r\n const [options, loading] = useApiPost<{ payments: ICheckoutPayment[] }>('/checkout/payments', checkout);\r\n\r\n const [error, setError] = useState<Error>();\r\n\r\n const required = RequiredValidator();\r\n\r\n const { form, setTouched, setValue } = useFormSchema<{ payment: ICheckoutPayment }>({\r\n payment: { schema: 'select', label: 'field.payment', options: options?.payments, validators: [required] },\r\n }, [options]);\r\n\r\n useEffect(() => {\r\n if (checkout.payment) {\r\n setValue({ payment: checkout.payment });\r\n } else if (options) {\r\n setValue({\r\n payment: options.payments[0],\r\n });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [options]);\r\n\r\n const onSubmit = async (event: React.FormEvent<HTMLFormElement> | React.MouseEvent<HTMLElement>) => {\r\n event.preventDefault();\r\n if (form.valid && form.value) {\r\n console.log('CheckoutPayment.valid', form.value);\r\n try {\r\n setError(undefined);\r\n const payment = form.value.payment;\r\n const response = await api.post<ICheckoutPartial>('/checkout/update', {\r\n action: 'payment',\r\n checkout: { ...checkout, payment },\r\n });\r\n setCheckout(response);\r\n if (typeof onPayment === 'function') {\r\n onPayment(payment);\r\n }\r\n } catch (error) {\r\n console.log('CheckoutPayment.error', error);\r\n setError(error as Error);\r\n }\r\n } else {\r\n console.log('CheckoutPayment.invalid');\r\n setTouched();\r\n }\r\n };\r\n\r\n const onPrevious_ = () => {\r\n if (typeof onPrevious === 'function') {\r\n onPrevious();\r\n }\r\n };\r\n\r\n const payment = form.controls.payment;\r\n\r\n const onPaymentChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n form.controls.payment.value = options?.payments.find(x => x.id.toString() === event.target.value);\r\n };\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container>\r\n <Form form={form} onSubmit={onSubmit}>\r\n <Flex.Col flex=\"1\" rowGap=\"2rem\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Select a payment method</Text>\r\n {loading && <Loading />}\r\n {true && payment &&\r\n <RadioCard.Group initialValue={payment.value?.id.toString()} onChange={onPaymentChange}>\r\n {options?.payments.map(option => (\r\n <RadioCard key={option.id} value={option.id.toString()} flex=\"0 0 calc(50% - 1rem)\">\r\n <RadioCard.Title>{option.name}</RadioCard.Title>\r\n {option.abstract && <RadioCard.Abstract dangerouslySetInnerHTML={{ __html: option.abstract }}></RadioCard.Abstract>}\r\n {option.media && <RadioCard.Media item={option.media} />}\r\n </RadioCard>\r\n ))}\r\n </RadioCard.Group>\r\n }\r\n {false && <FieldCard control={form.controls.payment} />}\r\n {error && <FormError error={error}>{label('form.submit.error')}</FormError>}\r\n </Flex.Col>\r\n </Form>\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <Button variant=\"secondary\" onClick={onPrevious_}>Back</Button>\r\n </Flex>\r\n <Flex>\r\n <Button variant=\"primary\" onClick={onSubmit}>Proceed</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { RequiredValidator, useFormSchema } from '@websolutespa/bom-mixer-forms';\r\nimport { useApi, useApiPost, useCurrency, useLabel, useUnit } from '@websolutespa/bom-mixer-hooks';\r\nimport { Badge, Box, Button, Container, FieldCard, Flex, Form, FormError, Grid, Loading, RadioCard, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useEffect, useState } from 'react';\r\nimport { useCheckout } from '../hooks';\r\nimport { ICheckoutItem, ICheckoutPartial, ICheckoutRetailer } from '../models/checkout/checkout';\r\nimport { CheckoutDiscount } from './checkout-discount';\r\n\r\nexport type CheckoutReviewProps = {\r\n onReview?: (retailer: ICheckoutRetailer) => void;\r\n onPrevious?: () => void;\r\n};\r\n\r\nexport const CheckoutReview: React.FC<CheckoutReviewProps> = ({ onPrevious, onReview }: CheckoutReviewProps) => {\r\n const label = useLabel();\r\n\r\n const api = useApi();\r\n\r\n const currency = useCurrency();\r\n\r\n const distance = useUnit('kilometer');\r\n\r\n const checkout = useCheckout((state) => state.checkout);\r\n const { setCheckout } = useCheckout((state) => state.actions);\r\n\r\n const [options, loading] = useApiPost<{ retailers: ICheckoutRetailer[] }>('/checkout/retailers', checkout);\r\n\r\n // console.log('CheckoutReview', checkout);\r\n\r\n const [error, setError] = useState<Error>();\r\n\r\n const required = RequiredValidator();\r\n\r\n const { form, setValue, setTouched } = useFormSchema<{ retailer: ICheckoutRetailer }>({\r\n retailer: { schema: 'select', label: 'field.retailer', options: options?.retailers, validators: [required] },\r\n }, [options]);\r\n\r\n useEffect(() => {\r\n if (checkout.retailer || checkout.discounts) {\r\n setValue({\r\n retailer: checkout.retailer,\r\n });\r\n } else if (options) {\r\n setValue({\r\n retailer: options.retailers[0],\r\n });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [options]);\r\n\r\n const selectedRetailer = form.value?.retailer;\r\n const shippingAddress = checkout.shippingAddress;\r\n const billingAddress = checkout.billingAddress;\r\n const delivery = checkout.delivery;\r\n const subTotal = checkout.subTotal || 0;\r\n const subTotalFull = checkout.subTotalFull || 0;\r\n const taxes = checkout.taxes || 0;\r\n const total = checkout.total || 0;\r\n\r\n const onSubmit = async (event: React.FormEvent<HTMLFormElement> | React.MouseEvent<HTMLElement>) => {\r\n event.preventDefault();\r\n if (form.valid && form.value) {\r\n console.log('CheckoutReview.valid', form.value);\r\n try {\r\n setError(undefined);\r\n const retailer = form.value.retailer;\r\n const response = await api.post<ICheckoutPartial>('/checkout/update', {\r\n action: 'retailer',\r\n checkout: { ...checkout, retailer },\r\n });\r\n setCheckout(response);\r\n if (typeof onReview === 'function') {\r\n onReview(retailer);\r\n }\r\n } catch (error) {\r\n console.log('CheckoutReview.error', error);\r\n setError(error as Error);\r\n }\r\n } else {\r\n console.log('CheckoutReview.invalid');\r\n setTouched();\r\n }\r\n };\r\n\r\n const onPrevious_ = () => {\r\n if (typeof onPrevious === 'function') {\r\n onPrevious();\r\n }\r\n };\r\n\r\n const retailer = form.controls.retailer;\r\n\r\n const onStoreChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n form.controls.retailer.value = options?.retailers.find(x => x.id.toString() === event.target.value);\r\n };\r\n\r\n return (\r\n <>\r\n <Section>\r\n <Container>\r\n <Flex.Col gap=\"2rem\" flexDirectionMd=\"row\">\r\n <Flex flexMd=\"1 1 calc(100% - 375px - 2rem)\" alignItemsMd=\"flex-start\">\r\n <Form form={form} onSubmit={onSubmit}>\r\n <Flex.Col flex=\"1\" rowGap=\"2rem\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Reference store</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\">Your suggested closest sales outlet for self-service pickup.</Text>\r\n {loading && <Loading />}\r\n {selectedRetailer &&\r\n <Flex.Col marginBottom=\"1rem\">\r\n <Text variant=\"heading40\" fontWeight=\"700\">{selectedRetailer.name}</Text>\r\n <Text>{selectedRetailer.address}, {selectedRetailer.streetNumber}</Text>\r\n <Text>{selectedRetailer.zipCode} {selectedRetailer.city} {selectedRetailer.country?.name}</Text>\r\n <Text>{selectedRetailer.phoneNumber}</Text>\r\n </Flex.Col>\r\n }\r\n {true && retailer &&\r\n <RadioCard.Group initialValue={retailer.value?.id.toString()} onChange={onStoreChange} maxWidth=\"60ch\">\r\n {options?.retailers.map(option => (\r\n <RadioCard key={option.id} value={option.id.toString()}>\r\n <RadioCard.Title>{option.name}</RadioCard.Title>\r\n {option.category && <RadioCard.Abstract>{option.category.name}</RadioCard.Abstract>}\r\n {option.distance && <RadioCard.Extra>{distance(option.distance)}</RadioCard.Extra>}\r\n </RadioCard>\r\n ))}\r\n </RadioCard.Group>\r\n }\r\n {false && <FieldCard control={form.controls.retailer} />}\r\n {error && <FormError error={error}>{label('form.submit.error')}</FormError>}\r\n <Grid.Row padding=\"2em 0\">\r\n <Grid md={6}>\r\n {shippingAddress &&\r\n <Flex.Col gap=\"1rem\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Shipping address</Text>\r\n <Flex.Col>\r\n <Text variant=\"heading40\" fontWeight=\"700\">{shippingAddress.firstName} {shippingAddress.lastName}</Text>\r\n <Text>{shippingAddress.address}, {shippingAddress.streetNumber}</Text>\r\n <Text>{shippingAddress.zipCode} {shippingAddress.city} {shippingAddress.country?.name}</Text>\r\n <Text>{shippingAddress.phoneNumber}</Text>\r\n <Text>{shippingAddress.email}</Text>\r\n </Flex.Col>\r\n </Flex.Col>\r\n }\r\n </Grid>\r\n <Grid md={6}>\r\n {billingAddress &&\r\n <Flex.Col gap=\"1rem\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Billing address</Text>\r\n <Flex.Col>\r\n <Text variant=\"heading40\" fontWeight=\"700\">{billingAddress.firstName} {billingAddress.lastName}</Text>\r\n <Text>{billingAddress.address}, {billingAddress.streetNumber}</Text>\r\n <Text>{billingAddress.zipCode} {billingAddress.city} {billingAddress.country?.name}</Text>\r\n <Text>{billingAddress.phoneNumber}</Text>\r\n <Text>{billingAddress.email}</Text>\r\n </Flex.Col></Flex.Col>\r\n }\r\n </Grid>\r\n </Grid.Row>\r\n </Flex.Col>\r\n </Form>\r\n </Flex>\r\n <Flex flexMd=\"0 0 375px\" alignItemsMd=\"flex-start\">\r\n <Flex.Col gap=\"1rem\" positionMd=\"sticky\" topMd=\"200px\">\r\n <Flex.Col gap=\"1rem\" padding=\"1rem\" borderRadius=\"0.5em\" border=\"1px solid var(--color-neutral-300)\"\r\n fontSize=\"0.9em\" lineHeight=\"1\">\r\n <Flex.Row gap=\"1rem\" fontWeight=\"700\">\r\n <Text flexGrow=\"1\">Product</Text>\r\n <Text flexBasis=\"40px\" textAlign=\"right\">Qty</Text>\r\n <Text flexBasis=\"90px\" textAlign=\"right\">Price</Text>\r\n </Flex.Row>\r\n <Flex.Col flex=\"1\" gap=\"1rem\" padding=\"1rem 0\"\r\n borderTop=\"1px solid var(--color-neutral-300)\"\r\n borderBottom=\"1px solid var(--color-neutral-300)\">\r\n {checkout.items && checkout.items.map((item: ICheckoutItem, i: number) =>\r\n <Flex.Row key={i} gap=\"1rem\">\r\n <Text flexGrow=\"1\">{item.article.title}</Text>\r\n <Text flexBasis=\"40px\" textAlign=\"right\">{item.qty}</Text>\r\n <Flex.Col flexBasis=\"90px\" alignItems=\"flex-end\" textAlign=\"right\">\r\n <Text>{currency(item.qty * item.price)}</Text>\r\n {item.fullPrice > item.price && <Text variant=\"paragraph40\" textDecoration=\"line-through\" color=\"var(--color-neutral-400)\">{currency(item.fullPrice * item.qty)}</Text>}\r\n </Flex.Col>\r\n </Flex.Row>\r\n )}\r\n </Flex.Col>\r\n <Flex.Row gap=\"1rem\">\r\n <Text flexGrow=\"1\">Subtotal</Text>\r\n <Text flexBasis=\"40px\" textAlign=\"right\">&nbsp;</Text>\r\n <Flex.Col flexBasis=\"90px\" alignItems=\"flex-end\" textAlign=\"right\">\r\n <Text>{currency(subTotal)}</Text>\r\n {subTotalFull > subTotal && <Text variant=\"paragraph40\" textDecoration=\"line-through\" color=\"var(--color-neutral-400)\">{currency(subTotalFull)}</Text>}\r\n </Flex.Col>\r\n </Flex.Row>\r\n {checkout.discounts && checkout.discounts.map((item, i) =>\r\n <Flex.Row key={i} gap=\"1rem\">\r\n <Text flexGrow=\"1\"><Badge>{item.discount.id}</Badge></Text>\r\n {item.discount.abstract && (\r\n <Text flexBasis=\"40px\" textAlign=\"right\" dangerouslySetInnerHTML={{ __html: item.discount.abstract }} />\r\n )}\r\n <Text flexBasis=\"90px\" textAlign=\"right\">{currency(item.price)}</Text>\r\n </Flex.Row>\r\n )}\r\n {taxes > 0 &&\r\n <Flex.Row gap=\"1rem\">\r\n <Text flexGrow=\"1\">Taxes</Text>\r\n <Text flexBasis=\"40px\" textAlign=\"right\">&nbsp;</Text>\r\n <Text flexBasis=\"90px\" textAlign=\"right\">{currency(taxes)}</Text>\r\n </Flex.Row>\r\n }\r\n {delivery &&\r\n <Flex.Row gap=\"1rem\">\r\n {delivery.delivery && (\r\n <Text flexGrow=\"1\">{delivery.delivery.name}</Text>\r\n )}\r\n <Text flexBasis=\"40px\" textAlign=\"right\">&nbsp;</Text>\r\n <Text flexBasis=\"90px\" textAlign=\"right\">{currency(delivery.price)}</Text>\r\n </Flex.Row>\r\n }\r\n <Flex.Row gap=\"1rem\" fontWeight=\"700\" marginBottom=\"1rem\">\r\n <Text flexGrow=\"1\">Total</Text>\r\n <Text flexBasis=\"40px\" textAlign=\"right\">&nbsp;</Text>\r\n <Text flexBasis=\"90px\" textAlign=\"right\">{currency(total)}</Text>\r\n </Flex.Row>\r\n </Flex.Col>\r\n <Box padding=\"1rem\" borderRadius=\"0.5em\" border=\"1px solid var(--color-neutral-300)\">\r\n <CheckoutDiscount />\r\n </Box>\r\n </Flex.Col>\r\n </Flex>\r\n </Flex.Col>\r\n </Container>\r\n </Section>\r\n <Section position=\"sticky\" bottom=\"0\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Flex>\r\n <Button variant=\"secondary\" onClick={onPrevious_}>Back</Button>\r\n </Flex>\r\n <Flex>\r\n <Button variant=\"primary\" onClick={onSubmit}>Proceed</Button>\r\n </Flex>\r\n </Flex.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { IUserAddress } from '@websolutespa/bom-mixer-auth';\r\nimport { Flex, Text } from '@websolutespa/bom-mixer-ui';\r\n\r\nexport type OrderAddressProps = {\r\n item: IUserAddress;\r\n title?: string;\r\n};\r\n\r\nexport const OrderAddress: React.FC<OrderAddressProps> = ({ item, title }) => {\r\n return (\r\n <Flex.Col gap=\"1rem\">\r\n {title && <Text variant=\"heading30\" fontWeight=\"700\">{title}</Text>}\r\n <Flex.Col>\r\n <Text fontWeight=\"700\">{item.firstName} {item.lastName}</Text>\r\n <Text>{item.address}, {item.streetNumber}</Text>\r\n <Text>{item.zipCode} {item.city} {item.country?.name}</Text>\r\n <Text>{item.phoneNumber}</Text>\r\n <Text>{item.email}</Text>\r\n </Flex.Col>\r\n </Flex.Col>\r\n );\r\n};\r\n","import { httpPost } from '@websolutespa/bom-core';\r\nimport { IUser, IUserRegister } from '@websolutespa/bom-mixer-auth';\r\nimport { EmailValidator, MatchValidator, RequiredTrueValidator, RequiredValidator, useFormSchema } from '@websolutespa/bom-mixer-forms';\r\nimport { useLabel } from '@websolutespa/bom-mixer-hooks';\r\nimport { Button, Container, FieldCollection, Flex, Form, FormError, FormTester, Grid, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useState } from 'react';\r\n\r\nexport type OrderRegisterProps = {\r\n className?: string;\r\n data: Partial<IUser>;\r\n onSignedUp?: () => void;\r\n};\r\n\r\nexport const OrderRegister: React.FC<OrderRegisterProps> = ({ className, data, onSignedUp }: OrderRegisterProps) => {\r\n const label = useLabel();\r\n\r\n const [registered, setRegistered] = useState<boolean>(false);\r\n\r\n const required = RequiredValidator();\r\n const requiredTrue = RequiredTrueValidator();\r\n const email = EmailValidator();\r\n const match = MatchValidator((value, rootValue, control, root) => {\r\n return rootValue?.password;\r\n });\r\n\r\n const { form, setTouched } = useFormSchema<IUserRegister>({\r\n password: { schema: 'password', label: 'field.password', validators: required },\r\n confirmPassword: { schema: 'password', label: 'field.confirmPassword', validators: [required, match] },\r\n firstName: { value: data.firstName, schema: 'text', label: 'field.firstName', validators: [required] },\r\n lastName: { value: data.lastName, schema: 'text', label: 'field.lastName', validators: [required] },\r\n email: { value: data.email, schema: 'text', label: 'field.email', validators: [required, email] },\r\n privacy: { schema: 'checkbox', label: 'field.privacy', validators: [requiredTrue] },\r\n checkField: { schema: 'text', hidden: true }, // check hidden field for antiforgery\r\n });\r\n\r\n const [error, setError] = useState<Error>();\r\n\r\n const onSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault();\r\n if (form.valid) {\r\n console.log('AuthRegister.valid', form.value);\r\n try {\r\n setError(undefined);\r\n await httpPost('/api/auth/register', form.value);\r\n setRegistered(true);\r\n if (typeof onSignedUp === 'function') {\r\n onSignedUp();\r\n }\r\n } catch (error) {\r\n console.log('AuthRegister.error', error);\r\n setError(error as Error);\r\n }\r\n } else {\r\n console.log('AuthRegister.invalid');\r\n setTouched();\r\n }\r\n };\r\n\r\n return (\r\n <Section className={className}>\r\n <Container>\r\n <Flex.Col gap=\"1rem\" padding=\"1.5rem 1rem\" borderRadius=\"0.5em\" border=\"1px solid var(--color-warning-500)\">\r\n {registered ?\r\n <>\r\n <Text variant=\"heading30\" fontWeight=\"700\">Account created</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"80ch\">A confimation email has been sent to you at {form.value?.email}. Please check your inbox.</Text>\r\n </> :\r\n <>\r\n <Text variant=\"heading30\" fontWeight=\"700\">Checkout faster next time</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"80ch\">Want easy order tracking and faster checkout? Just choose a password to create your account.</Text>\r\n <Form form={form} onSubmit={onSubmit}>\r\n <Grid.Row rowGap=\"1rem\">\r\n <FieldCollection collection={form} />\r\n </Grid.Row>\r\n {error && <FormError error={error}>{label('form.submit.error')}</FormError>}\r\n <Button type=\"submit\" variant=\"primary\" size=\"lg\" justifyContent=\"center\" margin=\"1rem 0\"><span>Create account</span></Button>\r\n <FormTester form={form} test={{\r\n firstName: 'John',\r\n lastName: 'Appleseed',\r\n email: 'john@appleseed.com',\r\n password: '123456Aa!',\r\n confirmPassword: '123456Aa!',\r\n privacy: true,\r\n }}></FormTester>\r\n </Form>\r\n </>\r\n }\r\n </Flex.Col>\r\n </Container>\r\n </Section>\r\n );\r\n};\r\n","import { useCurrency } from '@websolutespa/bom-mixer-hooks';\r\nimport { Button, Flex, Link, Media, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { ICheckoutItem } from '../models/checkout/checkout';\r\n\r\nexport const OrderSummaryItem: React.FC<{ item: ICheckoutItem }> = ({ item }: { item: ICheckoutItem }) => {\r\n\r\n const currency = useCurrency();\r\n const article = item.article;\r\n const price = currency(item.price);\r\n const totalPrice = currency(item.price * item.qty);\r\n\r\n return (\r\n <Flex.Row gap=\"2rem\" paddingBottom=\"1rem\" borderBottom=\"1px solid var(--color-neutral-300)\">\r\n <Flex flexGrow=\"1\">\r\n <Flex.Row gap=\"2rem\">\r\n {article.media && (\r\n <Media item={article.media} aspectRatio={1} width=\"120px\" height=\"120px\" flex=\"0 0 120px\" rounded />\r\n )}\r\n <Flex.Col alignItems=\"flex-start\">\r\n <Link href={article.href}>\r\n <Button as=\"a\" variant=\"nav\">\r\n <Text variant=\"paragraph20\" fontWeight=\"700\">{article.title}</Text>\r\n </Button>\r\n </Link>\r\n {article.abstract && (\r\n <Text variant=\"paragraph30\" dangerouslySetInnerHTML={{ __html: article.abstract }} />\r\n )}\r\n </Flex.Col>\r\n </Flex.Row>\r\n </Flex>\r\n <Flex flexBasis=\"110px\" justifyContent=\"flex-end\">\r\n <Text>{price}</Text>\r\n </Flex>\r\n <Flex flexBasis=\"120px\" justifyContent=\"center\">{item.qty.toString()}</Flex>\r\n <Flex flexBasis=\"110px\" justifyContent=\"flex-end\">\r\n <Text>{totalPrice}</Text>\r\n </Flex>\r\n </Flex.Row>\r\n );\r\n};\r\n","import { useCurrency, useLabel, useLayout } from '@websolutespa/bom-mixer-hooks';\r\nimport { Badge, Container, Flex, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { IOrder } from '../models/order/order';\r\nimport { OrderSummaryItem } from './order-summary-item';\r\n\r\nexport type OrderSummaryProps = {\r\n order: IOrder;\r\n};\r\n\r\nexport const OrderSummary: React.FC<OrderSummaryProps> = ({ order }: OrderSummaryProps) => {\r\n const label = useLabel();\r\n const layout = useLayout();\r\n const currency = useCurrency();\r\n // console.log('order', order);\r\n return (\r\n <>\r\n <Section>\r\n <Container>\r\n <Text variant=\"heading30\" fontWeight=\"700\">Order Summary</Text>\r\n <Flex.Row gap=\"2rem\" padding=\"1rem 0\" fontWeight=\"700\">\r\n <Text flexGrow=\"1\">Product</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">Unit price</Text>\r\n <Text flexBasis=\"120px\" textAlign=\"center\">Quantity</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">Price</Text>\r\n </Flex.Row>\r\n <Flex.Col flex=\"1\" gap=\"1rem\">\r\n {order.items && order.items.map((item, i) =>\r\n <OrderSummaryItem key={i} item={item} />\r\n )}\r\n <Flex.Row gap=\"1rem\">\r\n <Text flexGrow=\"1\">Subtotal</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">&nbsp;</Text>\r\n <Text flexBasis=\"120px\" textAlign=\"center\">&nbsp;</Text>\r\n <Text flexBasis=\"90px\" textAlign=\"right\">{currency(order.subTotal)}</Text>\r\n </Flex.Row>\r\n {order.discounts && order.discounts.map((item, i) =>\r\n <Flex.Row key={i} gap=\"1rem\">\r\n <Text flexGrow=\"1\"><Badge>{item.discount.id}</Badge></Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">&nbsp;</Text>\r\n {item.discount?.abstract && (\r\n <Text flexBasis=\"120px\" textAlign=\"center\" dangerouslySetInnerHTML={{ __html: item.discount.abstract }} />\r\n )}\r\n <Text flexBasis=\"90px\" textAlign=\"right\">{currency(item.price)}</Text>\r\n </Flex.Row>\r\n )}\r\n {order.taxes > 0 &&\r\n <Flex.Row gap=\"1rem\">\r\n <Text flexGrow=\"1\">Taxes</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">&nbsp;</Text>\r\n <Text flexBasis=\"120px\" textAlign=\"center\">&nbsp;</Text>\r\n <Text flexBasis=\"90px\" textAlign=\"right\">{currency(order.taxes)}</Text>\r\n </Flex.Row>\r\n }\r\n {order.delivery && (\r\n <Flex.Row gap=\"1rem\">\r\n <Text flexGrow=\"1\">{order.delivery.delivery.name}</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">&nbsp;</Text>\r\n <Text flexBasis=\"120px\" textAlign=\"center\">&nbsp;</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">{currency(order.delivery.price)}</Text>\r\n </Flex.Row>\r\n )}\r\n <Flex.Row gap=\"1rem\" fontWeight=\"700\" marginBottom=\"1rem\">\r\n <Text flexGrow=\"1\">Total</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">&nbsp;</Text>\r\n <Text flexBasis=\"120px\" textAlign=\"center\">&nbsp;</Text>\r\n <Text flexBasis=\"110px\" textAlign=\"right\">{currency(order.total)}</Text>\r\n </Flex.Row>\r\n </Flex.Col>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { useLabel } from '@websolutespa/bom-mixer-hooks';\r\nimport { Badge, Button, Container, Flex, Grid, Section, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { useEffect } from 'react';\r\nimport { useCart } from '../hooks/useCart/useCart';\r\nimport { IOrder } from '../models/order/order';\r\nimport { OrderAddress } from '../order/order-address';\r\nimport { OrderRegister } from '../order/order-register';\r\nimport { OrderSummary } from '../order/order-summary';\r\n\r\nexport type CheckoutSuccessProps = {\r\n order: IOrder;\r\n};\r\n\r\nexport const CheckoutSuccess: React.FC<CheckoutSuccessProps> = ({ order }: CheckoutSuccessProps) => {\r\n const label = useLabel();\r\n const { clear } = useCart(state => state.actions);\r\n\r\n useEffect(() => {\r\n clear();\r\n }, [clear]);\r\n\r\n // console.log('CheckoutSuccess', order);\r\n return (\r\n <>\r\n <Section position=\"sticky\" top=\"80px\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container.Fluid>\r\n <Flex.Row justifyContent=\"space-between\">\r\n <Text variant=\"paragraph10\" fontWeight=\"700\">Order #{order.number} <Badge>{label(`order.status.${order.status}`)}</Badge></Text>\r\n <Button className=\"print-none\" variant=\"primary\" onClick={() => window.print()}>Print</Button>\r\n </Flex.Row>\r\n </Container.Fluid>\r\n </Section>\r\n <Section className=\"print-none\">\r\n <Container>\r\n <Flex.Col gap=\"1rem\" alignItems=\"center\" textAlign=\"center\">\r\n <Text variant=\"heading10\" fontWeight=\"700\">Thank you for your order, {order.user ? order.user.firstName : order.shippingAddress.firstName}</Text>\r\n <Text variant=\"paragraph10\" marginBottom=\"1rem\" maxWidth=\"80ch\">A confirmation email will be sent to you at {order.user ? order.user.email : order.shippingAddress.email} with your complete order details.</Text>\r\n </Flex.Col>\r\n </Container>\r\n </Section>\r\n {!order.user && (\r\n <OrderRegister className=\"print-none\" data={order.shippingAddress} />\r\n )}\r\n <OrderSummary order={order} />\r\n <Section>\r\n <Container>\r\n <Grid.Row padding=\"2em 0\">\r\n <Grid md={6}>\r\n {order.shippingAddress && (\r\n <OrderAddress item={order.shippingAddress} title={'Shipping address'} />\r\n )}\r\n </Grid>\r\n <Grid md={6}>\r\n {order.billingAddress && (\r\n <OrderAddress item={order.billingAddress} title={'Billing address'} />\r\n )}\r\n </Grid>\r\n </Grid.Row>\r\n </Container>\r\n </Section>\r\n </>\r\n );\r\n};\r\n","import { getClassNames } from '@websolutespa/bom-core';\r\nimport { scrollToY, useApi } from '@websolutespa/bom-mixer-hooks';\r\nimport { StoreStrategy, storeStrategy } from '@websolutespa/bom-mixer-store';\r\nimport { Container, Flex, Section, UIStyledComponentProps } from '@websolutespa/bom-mixer-ui';\r\nimport { useRouter } from 'next/router';\r\nimport { useState } from 'react';\r\nimport styled from 'styled-components';\r\nimport { useCheckout } from '../hooks';\r\nimport { ICheckoutDelivery, ICheckoutInfo, ICheckoutItem, ICheckoutPartial, ICheckoutPayment, ICheckoutPaymentRedirect, ICheckoutRetailer } from '../models/checkout/checkout';\r\nimport { CheckoutBasket } from './checkout-basket';\r\nimport { CheckoutDelivery } from './checkout-delivery';\r\nimport { CheckoutInfo } from './checkout-info';\r\nimport { CheckoutPayment } from './checkout-payment';\r\nimport { CheckoutReview } from './checkout-review';\r\n\r\nexport enum CheckoutStatus {\r\n None = -1,\r\n Basket = 0,\r\n Info = 1,\r\n Delivery = 2,\r\n Review = 3,\r\n Payment = 4,\r\n Complete = 5,\r\n Error = 6,\r\n}\r\n\r\nconst StyledWizard = styled(Flex.Row)`\r\n counter-reset: steps;\r\n\r\n & > div {\r\n counter-increment: steps;\r\n\t\ttext-transform: uppercase;\r\n\t\topacity: 0.25;\r\n\r\n &:before {\r\n content: counter(steps) \". \";\r\n display: block;\r\n font-size: 48px;\r\n font-weight: 100;\r\n line-height: 1;\r\n }\r\n\r\n &.active {\r\n opacity: 1;\r\n }\r\n\r\n @media(max-width: 800px) {\r\n\r\n &:not(.active) {\r\n font-size: 0;\r\n }\r\n\r\n &:before {\r\n font-size: 1rem;\r\n font-weight: 700;\r\n margin-right: 0.5rem;\r\n }\r\n }\r\n }\r\n`;\r\n\r\ntype Props = {\r\n onCheckout?: (checkout: ICheckoutPartial) => void;\r\n};\r\n\r\nexport type CheckoutWizardProps = UIStyledComponentProps<Props>;\r\n\r\nexport const CheckoutWizard: React.FC<CheckoutWizardProps> = ({ onCheckout, ...props }: CheckoutWizardProps) => {\r\n const router = useRouter();\r\n const api = useApi();\r\n\r\n const checkout = useCheckout((state) => state.checkout);\r\n // const { setCheckout } = useCheckout((state) => state.actions);\r\n const [status, setStatus] = useState<CheckoutStatus>(CheckoutStatus.Basket);\r\n\r\n console.log('CheckoutWizard', checkout, status);\r\n\r\n const onCheckout_ = (checkout: ICheckoutPartial) => {\r\n // setCheckout(checkout);\r\n if (typeof onCheckout === 'function') {\r\n onCheckout(checkout);\r\n }\r\n scrollToY(0);\r\n };\r\n\r\n // 1.\r\n const onBasket = (items: ICheckoutItem[]) => {\r\n console.log('CheckoutWizard.onBasket', items);\r\n onCheckout_({ ...checkout, items });\r\n setStatus(CheckoutStatus.Info);\r\n };\r\n\r\n // 2.\r\n const onInfo = (info: ICheckoutInfo) => {\r\n console.log('CheckoutWizard.onInfo', info);\r\n onCheckout_({ ...checkout, ...info });\r\n setStatus(CheckoutStatus.Delivery);\r\n };\r\n\r\n // 3.\r\n const onDelivery = (delivery: ICheckoutDelivery) => {\r\n console.log('CheckoutWizard.onDelivery', delivery);\r\n onCheckout_({ ...checkout, delivery });\r\n setStatus(CheckoutStatus.Review);\r\n };\r\n\r\n // 4.\r\n const onReview = (retailer: ICheckoutRetailer) => {\r\n console.log('CheckoutWizard.onReview', retailer);\r\n onCheckout_({ ...checkout, retailer });\r\n setStatus(CheckoutStatus.Payment);\r\n };\r\n\r\n // 5.\r\n const onPayment = async (payment: ICheckoutPayment) => {\r\n console.log('CheckoutWizard.onPayment', payment);\r\n try {\r\n const response = await api.post<ICheckoutPaymentRedirect>('/checkout/submit', { ...checkout, payment });\r\n console.log('onPayment.response', response);\r\n if (storeStrategy === StoreStrategy.Mock) {\r\n router.push(response.redirectUrl);\r\n } else {\r\n window.location.href = response.redirectUrl;\r\n }\r\n } catch (error) {\r\n console.error('onPayment.error', error);\r\n }\r\n /*\r\n onCheckout_({ ...checkout, payment });\r\n setStatus(CheckoutStatus.Complete);\r\n */\r\n };\r\n\r\n const onPrevious = () => {\r\n console.log('CheckoutWizard.onPrevious');\r\n if (status > CheckoutStatus.Basket) {\r\n setStatus(status - 1);\r\n }\r\n scrollToY(0);\r\n };\r\n\r\n return (\r\n <>\r\n <Section position=\"sticky\" top=\"80px\" padding=\"1rem 0\" zIndex=\"800\" background=\"var(--color-primary-100)\">\r\n <Container>\r\n <StyledWizard justifyContent=\"space-between\">\r\n <Flex className={getClassNames({ active: status === CheckoutStatus.Basket })}>Basket</Flex>\r\n <Flex className={getClassNames({ active: status === CheckoutStatus.Info })}>User data</Flex>\r\n <Flex className={getClassNames({ active: status === CheckoutStatus.Delivery })}>Delivery</Flex>\r\n <Flex className={getClassNames({ active: status === CheckoutStatus.Review })}>Review</Flex>\r\n <Flex className={getClassNames({ active: status === CheckoutStatus.Payment })}>Payment</Flex>\r\n <Flex className={getClassNames({ active: status === CheckoutStatus.Complete })}>Complete</Flex>\r\n </StyledWizard>\r\n </Container>\r\n </Section>\r\n {status === CheckoutStatus.Basket && <CheckoutBasket onBasket={onBasket} />}\r\n {status === CheckoutStatus.Info && <CheckoutInfo onInfo={onInfo} onPrevious={onPrevious} />}\r\n {status === CheckoutStatus.Delivery && <CheckoutDelivery onDelivery={onDelivery} onPrevious={onPrevious} />}\r\n {status === CheckoutStatus.Review && <CheckoutReview onReview={onReview} onPrevious={onPrevious} />}\r\n {status === CheckoutStatus.Payment && <CheckoutPayment onPayment={onPayment} onPrevious={onPrevious} />}\r\n </>\r\n );\r\n};\r\n","import { IEquatable, ValueOf } from '@websolutespa/bom-core';\r\nimport { ICheckout } from '../checkout/checkout';\r\n\r\nexport const IOrderStatus = {\r\n Pending: 'pending', // Customer started the checkout process but did not complete it. Incomplete orders are assigned a \"Pending\" status and can be found under the More tab in the View Orders screen.\r\n AwaitingPayment: 'awaitingPayment', // Customer has completed the checkout process, but payment has yet to be confirmed. Authorize only transactions that are not yet captured have this status.\r\n AwaitingFulfillment: 'awaitingFulfillment', // Customer has completed the checkout process and payment has been confirmed.\r\n AwaitingShipment: 'awaitingShipment', // Order has been pulled and packaged and is awaiting collection from a shipping provider.\r\n AwaitingPickup: 'awaitingPickup', // Order has been packaged and is awaiting customer pickup from a seller-specified location.\r\n PartiallyShipped: 'partiallyShipped', // Only some items in the order have been shipped.\r\n Completed: 'completed', // Order has been shipped/picked up, and receipt is confirmed; client has paid for their digital product, and their file(s) are available for download.\r\n Shipped: 'shipped', // Order has been shipped, but receipt has not been confirmed; seller has used the Ship Items action. A listing of all orders with a \"Shipped\" status can be found under the More tab of the View Orders screen.\r\n Cancelled: 'cancelled', // Seller has cancelled an order, due to a stock inconsistency or other reasons. Stock levels will automatically update depending on your Inventory Settings. Cancelling an order will not refund the order. This status is triggered automatically when an order using an authorize-only payment gateway is voided in the control panel before capturing payment.\r\n Declined: 'declined', // Seller has marked the order as declined.\r\n Refunded: 'refunded', // Seller has used the Refund action to refund the whole order. A listing of all orders with a \"Refunded\" status can be found under the More tab of the View Orders screen.\r\n Disputed: 'disputed', // Customer has initiated a dispute resolution process for the PayPal transaction that paid for the order or the seller has marked the order as a fraudulent order.\r\n ManualVerificationRequired: 'manualVerificationRequired', // Order on hold while some aspect, such as tax-exempt documentation, is manually confirmed. Orders with this status must be updated manually. Capturing funds or other order actions will not automatically update the status of an order marked Manual Verification Required.\r\n PartiallyRefunded: 'partiallyRefunded', // Seller has partially refunded the order.\r\n};\r\n\r\nexport type IOrderStatusValue = ValueOf<typeof IOrderStatus>;\r\n\r\nexport type IOrder = ICheckout & {\r\n id: IEquatable;\r\n createdAt: Date | string;\r\n updatedAt: Date | string;\r\n status: IOrderStatusValue;\r\n number: number;\r\n};\r\n\r\nexport type IOrderDetail = IOrder & {\r\n href: string;\r\n};\r\n","import { useCurrency, useDateTimeFormat, useLabel, useLayout } from '@websolutespa/bom-mixer-hooks';\r\nimport { Badge, Box, Button, Flex, NavLink, Text } from '@websolutespa/bom-mixer-ui';\r\nimport { IOrderDetail } from '../models/order/order';\r\n\r\nexport type OrderItemProps = {\r\n item: IOrderDetail;\r\n};\r\n\r\nexport const OrderItem: React.FC<OrderItemProps> = ({ item }) => {\r\n const layout = useLayout();\r\n\r\n const label = useLabel();\r\n\r\n const dateTimeFormat = useDateTimeFormat({\r\n year: 'numeric',\r\n month: 'short',\r\n day: 'numeric',\r\n });\r\n\r\n const currency = useCurrency();\r\n\r\n const qty = item.items.reduce((p, c) => p + c.qty, 0);\r\n\r\n return (\r\n <Flex.Row gap=\"2rem\" padding=\"1rem\" border=\"1px solid var(--color-neutral-300)\">\r\n <Box flexBasis=\"80px\">\r\n <Text variant=\"paragraph40\" fontWeight=\"700\">ID</Text>\r\n <NavLink href={item.href}>\r\n <Button as=\"a\" variant=\"underline\">#{item.number}</Button>\r\n </NavLink>\r\n </Box>\r\n <Box flexBasis=\"120px\">\r\n <Text variant=\"paragraph40\" fontWeight=\"700\">Order placed</Text>\r\n <Text variant=\"paragraph30\">{dateTimeFormat(item.createdAt)}</Text>\r\n </Box>\r\n <Box flexBasis=\"160px\">\r\n <Text variant=\"paragraph40\" fontWeight=\"700\">Current status</Text>\r\n <Badge>{label(`order.status.${item.status}`)}</Badge>\r\n </Box>\r\n <Box flexBasis=\"120px\">\r\n <Text variant=\"paragraph40\" fontWeight=\"700\">Articles</Text>\r\n <Text variant=\"paragraph30\">{qty.toString()}</Text>\r\n </Box>\r\n <Box flexBasis=\"120px\" textAlign=\"right\">\r\n <Text variant=\"paragraph40\" fontWeight=\"700\">Total</Text>\r\n <Text variant=\"paragraph30\">{currency(item.total)}</Text>\r\n </Box>\r\n <Box flexGrow=\"1\" textAlign=\"right\">\r\n <NavLink href={item.href}>\r\n <Button as=\"a\" variant=\"primary\" size=\"sm\">Order detail</Button>\r\n </NavLink>\r\n </Box>\r\n </Flex.Row>\r\n );\r\n};\r\n"],"mappings":";;;;;;;;;;;;;;;;;AAyBA,MAAM,oBAAoB,CAAC,EAAE,QAAS,GAAG,cAA+D,KAAK;CAC3G,MAAM,gBAAgB,EACpB,UAAU,MACX;CACD,MAAMA,aAAW,aAA0B,CACzC,QACE,CAAC,KAAK,SAAS;EACb,GAAG;EACH,GAAG;EACH,SAAS,EACP,WAAW,CAACC,WAAqB,IAAI,YAAU,EAAE,OAAQ,GAAE,CAC5D;CACF,IACD;EACE,MAAM,GAAG,aAAa,QAAQ,UAAU,OAAO,CAAC;EAChD,SAAS,kBAAkB,MAAM,WAAW,aAAa;EAOzD,oBAAoB,MAAM,MAAM;GAC9BD,WAAS,SAAS,EAAE,UAAU,KAAM,EAAC;EAEtC;EACD,OAAO,CAACE,gBAAqBC,iBAA8B;AACzD,OAAI,eAAe,UAAU,OAAO,eAAe,WAAW,UAC5D,aAAa,SAAS,EAAE,GAAG,eAAe,OAAQ;GAEpD,aAAa,WAAW;AACxB,UAAO;EACR;CACF,EACF,CACF;AACD,QAAOH;AACR;AAED,MAAa,gBAAgB,cAAkC,KAAK;AAQpE,SAAS,eAAe,EAAE,SAAU,GAAG,OAA4B,EAAE;CACnE,MAAM,WAAW,OAAoB,OAAU;AAC/C,KAAI,CAAC,SAAS,SACZ,SAAS,UAAU,kBAAkB,MAAM;AAE7C,4BACG,cAAc;EAAS,OAAO,SAAS;EACrC;GACsB;AAE5B;AAED,SAAS,UAAaI,UAAwC;CAC5D,IAAI,QAAQ,WAAW,cAAc;AACrC,KAAI,CAAC,OACH,QAAQ,kBAAkB,CAAE,EAAC;AAE/B,QAAO,SAAS,OAAO,SAAS;AACjC;;;;ACxDD,MAAM,kBAAkB,CAAC,EAAE,QAAS,GAAG,cAAiF,KAAK;CAC3H,MAAMC,gBAA2B;EAC/B,UAAU;EACV,OAAO,CAAE;CACV;CACD,MAAMC,aAAW,aAAwB,CACvC,QACE,CAAC,KAAK,SAAS;EACb,GAAG;EACH,GAAG;EACH,SAAS;GACP,KAAK,CAACC,SAAmBC,MAAc,MAAM,IAAI,WAAS;IACxD,MAAM,QAAQ,MAAM,MAAM,OAAO;IACjC,MAAM,QAAQ,MAAM,UAAU,OAAK,EAAE,QAAQ,OAAO,QAAQ,GAAG;AAC/D,QAAI,UAAU,IACZ,MAAM,KAAK;KAAE;KAAS,OAAO,QAAQ;KAAO,WAAW,QAAQ;KAAO;IAAK,EAAC;SAE5E,MAAM,OAAO,OAAO;AAEtB,WAAO,EAAE,MAAO;GACjB,EAAC;GACF,OAAO,MAAM,IAAI,YAAU,EAAE,OAAO,CAAE,EAAE,GAAE;GAC1C,OAAO,MAAM;AACX,WAAO,KAAK,CAAC,MAAM;GACpB;GACD,MAAM,CAACC,SAAmB;AACxB,WAAO,KAAK,CAAC,MAAM,KAAK,OAAK,EAAE,QAAQ,OAAO,KAAK,GAAG;GACvD;GACD,KAAK,CAACA,SAAmB;AACvB,WAAO,KAAK,CAAC,MAAM,KAAK,OAAK,EAAE,QAAQ,OAAO,KAAK,GAAG,IAAI;GAC3D;GACD,QAAQ,CAACC,SAAoB;IAC3B,IAAI,QAAQ;IACZ,IAAI,WAAS;KACX,MAAM,QAAQ,MAAM,MAAM,OAAO;KACjC,MAAM,QAAQ,MAAM,UAAU,OAAK,EAAE,QAAQ,OAAO,KAAK,QAAQ,GAAG;AACpE,SAAI,UAAU,IACZ,MAAM,OAAO,OAAO,EAAE;KAExB,QAAQ,MAAM;AACd,YAAO,EAAE,MAAO;IACjB,EAAC;AACF,WAAO;GACR;GACD,QAAQ,CAACA,SAAoB,IAAI,WAAS;IACxC,MAAM,QAAQ,MAAM,MAAM,OAAO;IACjC,MAAM,QAAQ,MAAM,UAAU,OAAK,EAAE,QAAQ,OAAO,KAAK,QAAQ,GAAG;AACpE,QAAI,UAAU,IACZ,MAAM,SAAS;AAEjB,WAAO,EAAE,MAAO;GACjB,EAAC;EACH;CACF,IACD;EACE,MAAM,GAAG,aAAa,QAAQ,UAAU,MAAM,EAAE,aAAa,QAAQ,MAAM,IAAI;EAC/E,SAAS,kBAAkB,MAAM,WAAW,aAAa;EAOzD,oBAAoB,MAAM,MAAM;GAC9BJ,WAAS,SAAS,EAAE,UAAU,KAAM,EAAC;EAEtC;EACD,OAAO,CAACK,gBAAqBC,iBAA4B;AACvD,OAAI,eAAe,SAAS,MAAM,QAAQ,eAAe,MAAM,EAC7D,aAAa,QAAQ,CAAC,GAAG,eAAe,KAAM;AAEhD,OAAI,eAAe,UAAU,SAAS,eAAe,OAAO,EAC1D,aAAa,SAAS,EAAE,GAAG,eAAe,OAAQ;GAEpD,aAAa,WAAW;AACxB,UAAO;EACR;CACF,EACF,CACF;AACD,QAAON;AACR;AAED,MAAa,cAAc,cAAgC,KAAK;AAUhE,SAAS,aAAa,EAAE,SAAU,GAAG,OAA0B,EAAE;CAC/D,MAAM,WAAW,OAAkB,OAAU;AAC7C,KAAI,CAAC,SAAS,SACZ,SAAS,UAAU,gBAAgB,MAAM;CAE3C,MAAM,CAAC,QAAQ,UAAU,GAAG,UAA+B;CAC3D,MAAM,cAAc,UAAU,WAAS,MAAM,OAAO;CACpD,UAAU,MAAM;AACd,MAAI,WAAW,aAAa;GAC1B,UAAU,YAAY;GACtB,SAAS,UAAU,gBAAgB;IAAE,GAAG;IAAO,QAAQ;GAAa,EAAC;GACrE,QAAQ,IAAI,0BAA0B,YAAY;EACnD;CACF,GAAE;EAAC;EAAO;EAAa;CAAO,EAAC;AAChC,4BACG,YAAY;EAAS,OAAO,SAAS;EACnC;GACoB;AAE1B;AAED,SAAS,QAAWO,UAAsC;CACxD,MAAM,QAAQ,WAAW,YAAY;AACrC,KAAI,CAAC,MAAO,OAAM,IAAI,MAAM;AAC5B,QAAO,SAAS,OAAO,SAAS;AACjC;;;;ACjJD,MAAaC,WAA0C,CAAC,EAAE,MAA2B,KAAK;CACxF,MAAM,WAAW,aAAa;CAC9B,MAAM,UAAU,YAAY;CAC5B,MAAM,CAAC,QAAQ,YAAY,YAAY,GAAG,WAAW;CACrD,MAAM,EAAE,QAAQ,QAAQ,GAAG,QAAQ,WAAS,MAAM,QAAQ;CAE1D,SAAS,SAASC,KAAa;AAC7B,MAAI,MAAM,GACR,OAAO;GAAE,GAAG;GAAM;EAAK,EAAC;OAExB,UAAU;CAEb;CAED,SAAS,WAAW;EAClB,MAAM,QAAQ,OAAO,KAAK;AAC1B,MAAI,QAAQ,GACV,aAAa;CAEhB;CAED,MAAM,UAAU,KAAK;AACrB,KAAI,CAAC,QACH;AAEF,sEAEK;EAAK,cAAa;EAAO,eAAc;EAAO,cAAa;iCACzD,KAAK;GAAI,YAAW;kCAClB,kBACE,QAAQ,6BACN;IAAM,MAAM,QAAQ;IAAO,aAAa;IAAG,OAAM;IAAO,QAAO;IAAO,MAAK;IAAW;KAAU,GAE9F,uBACN,KAAK;IAAQ,MAAK;IAAI,SAAQ;;yBAC5BC;MAAK,MAAM,QAAQ;oCACjB;OAAK,SAAQ;OAAc,YAAW;OAAM,SAAS;iBAAc,QAAQ;QAAa;OACpF;KACN,QAAQ,gCACN;MAAK,SAAQ;MAAc,cAAa;MAAO,yBAAyB,EAAE,QAAQ,QAAQ,SAAU;OAAI;0BAE1G,KAAK;MAAI,gBAAe;;2BACtB;QAAO,SAAS,MAAM,SAAS,KAAK,MAAM,EAAE;sCAAI;SAAU,OAAM;SAAO,QAAO;UAAS;SAAS;2BAChG;QAAM,OAAM;QAAO,SAAQ;QAAS,aAAY;QAAM,OAAO,KAAK,IAAI,UAAU;QAAE,UAAU,CAACC,MAA2C,SAAS,OAAO,EAAE,OAAO,MAAM,CAAC;SAAI;2BAC5K;QAAO,MAAK;QAAK,SAAS,MAAM,SAAS,KAAK,MAAM,EAAE;sCAAI;SAAS,OAAM;SAAO,QAAO;UAAS;SAAS;2BACzG;QAAK,OAAM;QAAO,WAAU;kBAAS,SAAS,KAAK,QAAQ,KAAK,IAAI;SAAQ;OAC5E,+BAAY;QAAO,SAAS;sCAAW;SAAU,OAAM;SAAO,QAAO;UAAS;SAAS;;OAC/E;;KACE;IACN;GACN,GACN;AAEN;;;;ACpDD,MAAaC,aAAwC,CAACC,UAA2B;CAC/E,MAAM,SAAS,WAAW;CAC1B,MAAM,WAAW,aAAa;CAC9B,MAAM,QAAQ,QAAQ,CAAC,UAAU,MAAM,MAAM;CAC7C,MAAM,cAAc,QAAQ,CAAC,UAAU,MAAM,eAAe,OAAO,cAAc,SAAS;CAC1F,MAAM,UAAU,QAAQ,CAAC,UAAU,MAAM,WAAW,OAAO,cAAc,WAAW;CACpF,MAAM,cAAc,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE;AAClE,6BACG;EAAO,MAAK;EAAO,WAAU;EAAQ,GAAI;;uBACvC,OAAO,wCACL,OAAO,uCACL;IAAK,SAAQ;IAAc,YAAW;IAAM,IAAG;cAAO;KAAoB,GAC9D,GACD;uBACf,OAAO,2CACL,sBAAS,MAAM,QAAO,kBAAsB,GAC7B;uBACjB,OAAO;IAAQ,MAAK;IAAI,SAAQ;IAAO,OAAM;IAAQ,UAAS;mCAC5D,KAAK;KAAI,gBAAe;;MACtB,6BACE,KAAK;OAAI,MAAK;iBACZ,MAAM,IAAI,CAAC,MAAM,0BACf,YAAuB,QAAT,EAAiB,CACjC;QACQ;2BAEZ,KAAK;OAAI,gBAAe;OAAgB,YAAW;OAAS,SAAQ;sCAClE;QAAK,YAAW;kBAAM;SAAe,sBACrC;QAAK,YAAW;kBAAO,SAAS,YAAY;SAAQ;QAC5C;0BACV,KAAK;OAAI,gBAAe;OAAgB,YAAW;OAAS,SAAQ;qCAClE,kBAAK,8CAAgD;QAC7C;0BACV;OAAQ,MAAM;sCACZ;QAAO,IAAG;QAAI,SAAQ;QAAU,MAAK;QAAK,UAAS;QAAS,QAAO;QAAO,gBAAe;QAAS,SAAS,MAAM;;6BAC/G,oBAAK,aAAe;;6BAAE,qBAAmB;;SACnC;QACD;2BACT,KAAK;OAAI,gBAAe;OAAS,YAAW;OAAS,SAAQ;sCAC3D,oBAAK,OAAS,sBACd;QAAQ,MAAM;uCACZ;SAAO,IAAG;SAAI,SAAQ;SAAO,SAAS,MAAM;;8BAC1C,oBAAK,sBAAwB;;8BAAE,mBAAiB;;UAC1C;SACD;QACD;;MACF;KACI;;GACV;AAEZ;;;;AC1BD,MAAM,sBAAsB,CAAC,EAAE,QAAS,GAAG,cAAiE,KAAK;CAC/G,MAAM,gBAAgB;EACpB,UAAU;EACV,UAAU,CAAE;CACb;CACD,MAAMC,aAAW,aAA4B,CAC3C,QACE,CAAC,KAAK,SAAS;EACb,GAAG;EACH,GAAG;EACH,SAAS,EACP,aAAa,CAACC,aAA+B,IAAI,WAAS;AACxD,UAAO,EACL,UAAU;IACR,GAAG;IACH,QAAQ,MAAM;GACf,EACF;EACF,EAAC,CACH;CACF,IACD;EACE,MAAM,GAAG,aAAa,QAAQ,UAAU,UAAU,EAAE,aAAa,QAAQ,MAAM,IAAI;EACnF,SAAS,kBAAkB,MAAM,WAAW,aAAa;EAOzD,oBAAoB,MAAM,MAAM;GAC9BD,WAAS,SAAS,EAAE,UAAU,KAAM,EAAC;EAEtC;EACD,OAAO,CAACE,gBAAqBC,iBAAgC;AAC3D,OAAI,eAAe,YAAY,OAAO,eAAe,aAAa,UAChE,aAAa,WAAW,EAAE,GAAG,eAAe,SAAU;GAExD,aAAa,WAAW;AACxB,UAAO;EACR;CACF,EACF,CACF;AACD,QAAOH;AACR;AAED,MAAa,kBAAkB,cAAoC,KAAK;AASxE,SAAS,iBAAiB,EAAE,SAAU,GAAG,OAA8B,EAAE;CACvE,MAAM,WAAW,OAAsB,OAAU;AACjD,KAAI,CAAC,SAAS,SACZ,SAAS,UAAU,oBAAoB,MAAM;CAE/C,MAAM,CAAC,QAAQ,UAAU,GAAG,UAA+B;CAC3D,MAAM,cAAc,UAAU,WAAS,MAAM,OAAO;CACpD,UAAU,MAAM;AACd,MAAI,WAAW,aAAa;GAC1B,UAAU,YAAY;GACtB,SAAS,UAAU,oBAAoB;IAAE,GAAG;IAAO,QAAQ;GAAa,EAAC;GACzE,QAAQ,IAAI,8BAA8B,YAAY;EACvD;CACF,GAAE;EAAC;EAAO;EAAa;CAAO,EAAC;AAChC,4BACG,gBAAgB;EAAS,OAAO,SAAS;EACvC;GACwB;AAE9B;AAED,SAAS,YAAeI,UAA0C;CAChE,MAAM,QAAQ,WAAW,gBAAgB;AACzC,KAAI,CAAC,MAAO,OAAM,IAAI,MAAM;AAC5B,QAAO,SAAS,OAAO,SAAS;AACjC;;;;AC3GD,MAAaC,qBAAwD,CAAC,EAAE,MAA+B,KAAK;CAE1G,MAAM,WAAW,aAAa;CAE9B,MAAM,EAAE,QAAQ,QAAQ,GAAG,QAAQ,WAAS,MAAM,QAAQ;CAE1D,SAAS,SAASC,KAAa;AAC7B,MAAI,MAAM,GACR,OAAO;GAAE,GAAG;GAAM;EAAK,EAAC;OAExB,UAAU;CAEb;CAED,SAAS,WAAW;EAClB,MAAM,QAAQ,OAAO,KAAK;EAC1B,QAAQ,IAAI,YAAY,MAAM;CAC/B;CAED,MAAM,UAAU,KAAK;AAErB,6BACG,KAAK;EAAI,KAAI;EAAO,eAAc;EAAO,cAAa;;uBACpD;IAAK,MAAK;mCACR,KAAK;KAAI,KAAI;gBACX,QAAQ,6BACN;MAAM,MAAM,QAAQ;MAAO,aAAa;MAAG,OAAM;MAAQ,QAAO;MAAQ,MAAK;MAAY;OAAU,uBAErG,KAAK;MAAI,YAAW;qCAClB;OAAK,MAAM,QAAQ;qCACjB;QAAO,IAAG;QAAI,SAAQ;sCACpB;SAAK,SAAQ;SAAc,YAAW;mBAAO,QAAQ;UAAa;SAC5D;QACJ,EACN,QAAQ,gCACN;OAAK,SAAQ;OAAc,yBAAyB,EAAE,QAAQ,QAAQ,SAAU;QAAI;OAE9E;MACF;KACN;wBACN,KAAK;IAAI,WAAU;IAAQ,YAAW;mCACpC,kBAAM,SAAS,KAAK,MAAM,GAAQ,EAClC,KAAK,YAAY,KAAK,6BAAU;KAAK,SAAQ;KAAc,gBAAe;KAAe,OAAM;eAA4B,SAAS,KAAK,UAAU;MAAQ;KACnJ;uBACV;IAAK,WAAU;IAAQ,gBAAe;mCACpC,KAAK;yBACH;MAAO,SAAS,MAAM,SAAS,KAAK,MAAM,EAAE;oCAAI;OAAU,OAAM;OAAO,QAAO;QAAS;OAAS;yBAChG;MAAM,OAAM;MAAO,SAAQ;MAAS,aAAY;MAAM,OAAO,KAAK,IAAI,UAAU;MAAE,UAAU,CAAC,MAAM,SAAS,OAAO,EAAE,OAAO,MAAM,CAAC;OAAI;yBACvI;MAAO,MAAK;MAAK,SAAS,MAAM,SAAS,KAAK,MAAM,EAAE;oCAAI;OAAS,OAAM;OAAO,QAAO;QAAS;OAAS;QACjG;KACN;uBACN;IAAK,WAAU;IAAO,gBAAe;kCACnC;KAAO,SAAS;mCAAW;MAAU,OAAM;MAAO,QAAO;OAAS;MAAS;KACvE;wBACN,KAAK;IAAI,WAAU;IAAQ,YAAW;mCACpC,kBAAM,SAAS,KAAK,QAAQ,KAAK,IAAI,GAAQ,EAC7C,KAAK,YAAY,KAAK,6BAAU;KAAK,SAAQ;KAAc,gBAAe;KAAe,OAAM;eAA4B,SAAS,KAAK,YAAY,KAAK,IAAI;MAAQ;KAC9J;;GACF;AAEd;;;;ACvDD,MAAaC,iBAAgD,CAAC,EAAE,UAA+B,KAAK;CAEpF,UAAU;CAExB,MAAM,SAAS,WAAW;CAE1B,MAAM,MAAM,QAAQ;CAEpB,MAAM,WAAW,aAAa;CAE9B,MAAM,YAAY,QAAQ,CAAC,UAAU,MAAM,MAAM;CACjD,MAAM,UAAU,QAAQ,CAAC,UAAU,MAAM,WAAW,OAAO,cAAc,WAAW;CAEpF,MAAM,WAAW,YAAY,CAAC,UAAU,MAAM,SAAS;CACvD,MAAM,EAAE,aAAa,GAAG,YAAY,CAAC,UAAU,MAAM,QAAQ;CAE7D,MAAM,CAAC,QAAQ,CAAE,GAAE,QAAQ,GAAG,WAA4B,mBAAmB;EAAE,GAAG;EAAU,OAAO;CAAW,EAAC;CAE/G,MAAM,WAAW,MAAM,OAAO,CAAC,GAAG,MAAM;AACtC,SAAO,IAAI,EAAE,QAAQ,EAAE;CACxB,GAAE,EAAE;CAEL,MAAM,eAAe,MAAM,OAAO,CAAC,GAAG,MAAM;AAC1C,SAAO,IAAI,EAAE,YAAY,EAAE;CAC5B,GAAE,EAAE;CAEL,MAAM,YAAY,YAAY;AAC5B,MAAI;GACF,MAAM,WAAW,MAAM,IAAI,KAAuB,oBAAoB;IACpE,QAAQ;IACR,UAAU;KAAE,GAAG;KAAU;IAAO;GACjC,EAAC;GACF,YAAY,SAAS;AACrB,OAAI,OAAO,aAAa,YACtB,SAAS,MAAM;EAElB,SAAQ,OAAO;GACd,QAAQ,MAAM,kCAAkC,MAAM;EACvD;CACF;AAED,wEAEK,0CACE;EAAU,WAAU;aAClB,+BAAY,YAAU,EACtB,CAAC;wBAEG,KAAK;IAAI,KAAI;IAAO,SAAQ;IAAS,YAAW;;yBAC9C;MAAK,MAAK;gBAAyB;OAAc;yBACjD;MAAK,WAAU;MAAQ,WAAU;gBAAQ;OAAiB;yBAC1D;MAAK,WAAU;MAAQ,WAAU;gBAAS;OAAe;yBACzD;MAAK,WAAU;MAAO,WAAU;gBAAS;OAAa;yBACtD;MAAK,WAAU;MAAQ,WAAU;gBAAQ;OAAY;;KAC7C;wBACV,KAAK;IAAI,MAAK;IAAI,KAAI;eACpB,SAAS,MAAM,IAAI,CAAC,MAAM,0BACxB,sBAAiC,QAAT,EAAiB,CAC3C,uBACA,KAAK;KAAI,KAAI;KAAO,YAAW;KAAM,cAAa;;0BAChD;OAAK,MAAK;iBAAyB;QAAe;0BAClD;OAAK,WAAU;OAAQ,WAAU;iBAAQ;QAAa;0BACtD;OAAK,WAAU;OAAQ,WAAU;iBAAS;QAAa;0BACvD;OAAK,WAAU;OAAO,WAAU;iBAAS;QAAa;2BACtD,KAAK;OAAI,WAAU;OAAQ,YAAW;OAAW,WAAU;sCACzD,kBAAM,SAAS,SAAS,GAAQ,EAChC,eAAe,gCAAa;QAAK,SAAQ;QAAc,gBAAe;QAAe,OAAM;kBAA4B,SAAS,aAAa;SAAQ;QAC7I;;MACF;KACF;wBACV,KAAK;IAAI,KAAI;mCACX;KAAI,cAAa;KAAS,QAAO;oCAC/B,KAAK;MAAI,SAAQ;qCACf;OAAU,OAAM;OAAO,QAAO;OAAO,OAAM;QAA6B,uBACxE;OAAI,YAAW;sCACb;QAAK,SAAQ;QAAc,YAAW;kBAAM;SAA4B,sBACxE;QAAK,SAAQ;kBAAc;SAAqE;QAC7F;OACG;MACP,sBACL;KAAI,cAAa;KAAS,QAAO;oCAC/B,KAAK;MAAI,SAAQ;qCACf;OAAY,OAAM;OAAO,QAAO;OAAO,OAAM;QAA6B,uBAC1E;OAAI,YAAW;sCACb;QAAK,SAAQ;QAAc,YAAW;kBAAM;SAAmC,sBAC/E;QAAK,SAAQ;kBAAc;SAA0E;QAClG;OACG;MACP;KACG;MACV;GAEK,GACJ,sBACT;EAAQ,UAAS;EAAS,QAAO;EAAI,SAAQ;EAAS,QAAO;EAAM,YAAW;gCAC5E,4CACE,KAAK;GAAI,gBAAe;kCACtB,sCACE;IAAQ,MAAM;kCACZ;KAAO,IAAG;KAAI,SAAQ;eAAO;MAA0B;KAChD,GACL,sBACN,sCACE;IAAO,SAAQ;IAAU,SAAS;cAAW;KAAgB,GACzD;IACE,GACD;GACJ,IACT;AAEN;;;;AC7GD,MAAaC,mBAAoD,CAAC,EAAE,YAAY,YAAmC,KAAK;CACtH,MAAM,QAAQ,UAAU;CAExB,MAAM,WAAW,aAAa;CAE9B,MAAM,MAAM,QAAQ;CAEpB,MAAM,WAAW,YAAY,CAAC,UAAU,MAAM,SAAS;CACvD,MAAM,EAAE,aAAa,GAAG,YAAY,CAAC,UAAU,MAAM,QAAQ;CAE7D,MAAM,CAAC,SAAS,QAAQ,GAAG,WAAgD,wBAAwB,SAAS;CAE5G,MAAM,CAAC,OAAO,SAAS,GAAG,UAAiB;CAE3C,MAAM,WAAW,mBAAmB;CAEpC,MAAM,EAAE,MAAM,UAAU,GAAG,cAA+C,EACxE,UAAU;EAAE,QAAQ;EAAQ,OAAO;EAAkB,SAAS,SAAS;EAAY,YAAY,CAAC,QAAS;CAAE,EAC5G,GAAE,CAAC,OAAQ,EAAC;CAEb,UAAU,MAAM;AACd,MAAI,SAAS,UACX,SAAS,EAAE,UAAU,SAAS,SAAU,EAAC;CAG5C,GAAE,CAAC,OAAQ,EAAC;CAEb,MAAM,WAAW,OAAOC,UAA4E;EAClG,MAAM,gBAAgB;AACtB,MAAI,KAAK,SAAS,KAAK,OAAO;GAC5B,QAAQ,IAAI,0BAA0B,KAAK,MAAM;AACjD,OAAI;IACF,SAAS,OAAU;IACnB,MAAMC,aAAW,KAAK,MAAM;IAC5B,MAAMC,WAA6B,MAAM,IAAI,KAAuB,oBAAoB;KACtF,QAAQ;KACR,UAAU;MAAE,GAAG;MAAU;KAAU;IACpC,EAAC;IACF,YAAY,SAAS;AACrB,QAAI,OAAO,eAAe,YACxB,WAAWD,WAAS;GAEvB,SAAQE,SAAO;IACd,QAAQ,IAAI,0BAA0BA,QAAM;IAC5C,SAASA,QAAe;GACzB;EACF,OAAM;GACL,QAAQ,IAAI,2BAA2B;GACvC,KAAK,UAAU;EAChB;CACF;CAED,MAAM,cAAc,MAAM;AACxB,MAAI,OAAO,eAAe,YACxB,YAAY;CAEf;CAED,MAAM,WAAW,KAAK,SAAS;CAE/B,MAAM,mBAAmB,CAACC,UAA+C;EACvE,KAAK,SAAS,SAAS,QAAQ,SAAS,WAAW,KAAK,OAAK,EAAE,GAAG,UAAU,KAAK,MAAM,OAAO,MAAM;CACrG;AAED,wEAEK,yCACE;EAAU,WAAU;gCAClB,KAAK;GAAI,gBAAe;iCACtB;IAAW;IAAgB;mCACzB,KAAK;KAAI,MAAK;KAAI,QAAO;;0BACvB;OAAK,SAAQ;OAAY,YAAW;iBAAM;QAAiC;0BAC3E;OAAK,SAAQ;OAAc,cAAa;OAAO,UAAS;iBAAO;QAA4G;MAC3K,+BAAY,YAAU;MACd,gCACN,UAAU;OAAM,cAAc,SAAS,OAAO,GAAG,UAAU;OAAE,UAAU;iBACrE,SAAS,WAAW,IAAI,iCACtB;QAA0B,OAAO,OAAO,GAAG,UAAU;;6BACnD,UAAU,mBAAO,OAAO,OAAuB;SAC/C,OAAO,gCAAa,UAAU,YAAS,yBAAyB,EAAE,QAAQ,OAAO,SAAU,IAAuB;SAClH,OAAO,QAAQ,yBAAM,UAAU,mBAAO,SAAS,OAAO,MAAM,GAAmB;;UAHlE,OAAO,GAIX,CACZ;QACc;MAEnB;MACA,6BAAU;OAAiB;iBAAQ,MAAM,oBAAoB;QAAa;;MAClE;KACN;IACE;GACD,GACJ,sBACT;EAAQ,UAAS;EAAS,QAAO;EAAI,SAAQ;EAAS,QAAO;EAAM,YAAW;gCAC5E,4CACE,KAAK;GAAI,gBAAe;kCACtB,sCACE;IAAO,SAAQ;IAAY,SAAS;cAAa;KAAa,GAC1D,sBACN,sCACE;IAAO,SAAQ;IAAU,SAAS;cAAU;KAAgB,GACxD;IACE,GACD;GACJ,IACT;AAEN;;;;AC3GD,MAAaC,mBAAoD,CAAC,EAAE,YAAmC,KAAK;CAC1G,MAAM,QAAQ,UAAU;CAExB,MAAM,MAAM,QAAQ;CAEpB,MAAM,WAAW,YAAY,CAAC,UAAU,MAAM,SAAS;CACvD,MAAM,EAAE,aAAa,GAAG,YAAY,CAAC,UAAU,MAAM,QAAQ;CAI7D,MAAM,CAAC,OAAO,SAAS,GAAG,UAAiB;CAE1B,mBAAmB;CAEpC,MAAM,EAAE,MAAM,GAAG,cAAwC,EACvD,cAAc;EAAE,QAAQ;EAAQ,OAAO;CAAsB,EAC9D,EAAC;CAEF,MAAM,WAAW,OAAOC,UAA4E;EAClG,MAAM,gBAAgB;AACtB,MAAI,KAAK,SAAS,KAAK,MAErB,KAAI;GACF,SAAS,OAAU;GACnB,MAAM,WAAW,MAAM,IAAI,KAAgB,sBAAsB;IAAE;IAAU,cAAc,KAAK,MAAM;GAAc,EAAC;GACrH,YAAY,SAAS;AACrB,OAAI,OAAO,eAAe,YACxB,WAAW,SAAS,UAAU;GAEhC,KAAK,OAAO;EACb,SAAQC,SAAO;GACd,QAAQ,IAAI,0BAA0BA,QAAM;GAC5C,SAASA,QAAe;EACzB;OACI;GACL,QAAQ,IAAI,2BAA2B;GACvC,KAAK,UAAU;EAChB;CACF;AAED,sEAEK,KAAK;EAAI,KAAI;gCACX;GAAU,SAAS,KAAK,SAAS;GAAc,2BAAQ;IAAO,SAAQ;IAAY,SAAS;cAAW,MAAM,aAAa;KAAU;IAAI;GAC/H,GACV;AAEN;;;;ACnDD,MAAaC,gBAA8C,MAAM;CACjD,UAAU;CACxB,MAAM,SAAS,WAAW;CAC1B,MAAM,UAAU,QAAQ,CAAC,UAAU,MAAM,WAAW,OAAO,cAAc,WAAW;AACpF,sEAEK,yCACE;EAAU,WAAU;iCAClB,KAAK;GAAI,KAAI;GAAO,YAAW;GAAS,WAAU;;wBAChD;KAAK,SAAQ;KAAY,YAAW;eAAM;MAA0B;wBACpE;KAAK,SAAQ;KAAc,cAAa;KAAO,UAAS;eAAO;MAAuO;wBACtS;KAAQ,MAAM;mCACZ;MAAO,IAAG;MAAI,SAAQ;gBAAU;OAA0B;MACnD;;IACD;GACD,GACJ,GACT;AAEN;;;;AClBD,MAAaC,gBAA8C,CAAC,EAAE,OAA2B,KAAK;CAC9E,UAAU;AAExB,sEAEK,yCACE;EAAU,WAAU;YAClB,6BACE,KAAK;GAAI,KAAI;GAAO,YAAW;GAAS,WAAU;kCAChD;IAAK,SAAQ;IAAY,YAAW;cAAM;KAA0B,sBACpE;IAAK,SAAQ;IAAc,cAAa;IAAO,UAAS;cAAO;KAAmG;IAC1J,wBAEV,KAAK;GAAI,KAAI;GAAO,YAAW;GAAS,WAAU;kCAChD;IAAK,SAAQ;IAAY,YAAW;cAAM;KAAsB,sBAChE;IAAK,SAAQ;IAAc,cAAa;IAAO,UAAS;cAAO;KAAiD;IACxG;GAEH,GACJ,GACT;AAEN;;;;ACpBD,MAAaC,iBAAkC,CAAC,EAAE,gBAAgB,cAAc,iBAAiB,iBAAwB,KAAK;CAE5H,MAAM,kBAAkB,MAAM;AAC5B,MAAI,OAAO,mBAAmB,YAC5B,gBAAgB;CAEnB;CAED,MAAM,gBAAgB,MAAM;AAC1B,MAAI,OAAO,iBAAiB,YAC1B,cAAc;CAEjB;CAED,MAAM,mBAAmB,MAAM;AAC7B,MAAI,OAAO,oBAAoB,YAC7B,iBAAiB;CAEpB;CAED,MAAM,mBAAmB,MAAM;AAC7B,MAAI,OAAO,oBAAoB,YAC7B,iBAAiB;CAEpB;AAED,wEAEK,yCACE,2CACE;EAAW,gBAAgB;EAAiB,cAAc;EAAe,iBAAiB;GAAoB,GACrG,GACJ,sBACT;EAAQ,UAAS;EAAS,QAAO;EAAI,SAAQ;EAAS,QAAO;EAAM,YAAW;gCAC5E,2CACE,KAAK;GAAI,gBAAe;iCACtB,sCACE;IAAO,SAAQ;IAAY,SAAS;cAAkB;KAAa,GAC/D;IACE,GACD;GACJ,IACT;AAEN;;;;AC9CD,MAAaC,wBAAyC,CAAC,EAAE,cAAc,iBAAwB,KAAK;CAElG,MAAM,gBAAgB,MAAM;AAC1B,MAAI,OAAO,iBAAiB,YAC1B,cAAc;CAEjB;CAED,MAAM,mBAAmB,MAAM;AAC7B,MAAI,OAAO,oBAAoB,YAC7B,iBAAiB;CAEpB;AAED,wEAEK,yCACE,2CACE,qBAAkB,cAAc,gBAAiB,GACxC,GACJ,sBACT;EAAQ,UAAS;EAAS,QAAO;EAAI,SAAQ;EAAS,QAAO;EAAM,YAAW;gCAC5E,2CACE,KAAK;GAAI,gBAAe;iCACtB,sCACE;IAAO,SAAQ;IAAY,SAAS;cAAkB;KAAa,GAC/D;IACE,GACD;GACJ,IACT;AAEN;;;;AC9BD,MAAaC,gBAAiC,CAAC,EAAE,YAAY,eAAe,iBAAiB,iBAAwB,KAAK;CAExH,MAAM,cAAc,CAACC,SAAgB;AACnC,MAAI,OAAO,eAAe,YACxB,WAAW,KAAK;CAEnB;CAED,MAAM,iBAAiB,MAAM;AAC3B,MAAI,OAAO,kBAAkB,YAC3B,eAAe;CAElB;CAED,MAAM,mBAAmB,MAAM;AAC7B,MAAI,OAAO,oBAAoB,YAC7B,iBAAiB;CAEpB;CAED,MAAM,mBAAmB,MAAM;AAC7B,MAAI,OAAO,oBAAoB,YAC7B,iBAAiB;CAEpB;AAED,wEAEK,yCACE,2CACE;EAAU,YAAY;EAAa,eAAe;EAAgB,iBAAiB;GAAoB,GAC9F,GACJ,sBACT;EAAQ,UAAS;EAAS,QAAO;EAAI,SAAQ;EAAS,QAAO;EAAM,YAAW;gCAC5E,2CACE,KAAK;GAAI,gBAAe;iCACtB,sCACE;IAAO,SAAQ;IAAY,SAAS;cAAkB;KAAa,GAC/D;IACE,GACD;GACJ,IACT;AAEN;;;;AC7CD,MAAaC,mBAAoC,CAAC,EAAE,YAAY,cAAc,iBAAwB,KAAK;CAEzG,MAAM,cAAc,MAAM;AACxB,MAAI,OAAO,eAAe,YACxB,YAAY;CAEf;CAED,MAAM,gBAAgB,MAAM;AAC1B,MAAI,OAAO,iBAAiB,YAC1B,cAAc;CAEjB;CAED,MAAM,mBAAmB,MAAM;AAC7B,MAAI,OAAO,oBAAoB,YAC7B,iBAAiB;CAEpB;AAED,wEAEK,yCACE,2CACE;EAAa,YAAY;EAAa,cAAc;GAAiB,GAC5D,GACJ,sBACT;EAAQ,UAAS;EAAS,QAAO;EAAI,SAAQ;EAAS,QAAO;EAAM,YAAW;gCAC5E,2CACE,KAAK;GAAI,gBAAe;iCACtB,sCACE;IAAO,SAAQ;IAAY,SAAS;cAAkB;KAAa,GAC/D;IACE,GACD;GACJ,IACT;AAEN;;;;ACvCD,MAAaC,0BAA2C,CAAC,EAAE,cAAc,iBAAwB,KAAK;CAEpG,MAAM,gBAAgB,MAAM;AAC1B,MAAI,OAAO,iBAAiB,YAC1B,cAAc;CAEjB;CAED,MAAM,mBAAmB,MAAM;AAC7B,MAAI,OAAO,oBAAoB,YAC7B,iBAAiB;CAEpB;AAED,wEAEK,yCACE,2CACE,uBAAoB,cAAc,gBAAiB,GAC1C,GACJ,sBACT;EAAQ,UAAS;EAAS,QAAO;EAAI,SAAQ;EAAS,QAAO;EAAM,YAAW;gCAC5E,2CACE,KAAK;GAAI,gBAAe;iCACtB,sCACE;IAAO,SAAQ;IAAY,SAAS;cAAkB;KAAa,GAC/D;IACE,GACD;GACJ,IACT;AAEN;;;;ACzBD,MAAaC,mBAAoD,CAAC,EAAE,MAAM,YAAY,iBAAwC,KAAK;CACjI,MAAM,QAAQ,UAAU;CAExB,MAAM,MAAM,QAAQ;CAEpB,MAAM,WAAW,YAAY,CAAC,UAAU,MAAM,SAAS;CACvD,MAAM,EAAE,aAAa,GAAG,YAAY,CAAC,UAAU,MAAM,QAAQ;CAE7D,MAAM,CAAC,SAAS,QAAQ,GAAG,WAA4B,kBAAkB,SAAS;CAElF,MAAM,WAAW,mBAAmB;CACf,uBAAuB;CAC5C,MAAM,QAAQ,gBAAgB;CAE9B,MAAM,0BAA0B,oBAAoB,CAAC,OAAO,cAAc,WAAW,iBAAiB,SAAS,OAAO,KAAK;CAC3H,MAAM,2BAA2B,CAACC,OAAYC,cAAmB,EAAE,WAAW,iBAAiB,SAAS,OAAO;CAE/G,MAAM,kBAAkB,oBAAoB,CAAC,OAAO,cAAc,WAAW,eAAe,KAAK;CACjG,MAAM,gBAAgB,CAACD,OAAYC,cAAmB,EAAE,WAAW,eAAe;CAClF,MAAM,0BAA0B,CAACD,OAAYC,cAAmB,EAAE,WAAW,gBAAgB,SAAS,OAAO;CAG7G,MAAM,EAAE,MAAM,UAAU,YAAY,GAAG,cAA2C;EAEhF,iBAAiB;GACf,QAAQ;GAAS,OAAO;GAAyB,UAAU;IACzD,WAAW;KAAE,QAAQ;KAAQ,OAAO;KAClC,YAAY,CAAC,QAAS;IACvB;IACD,UAAU;KAAE,QAAQ;KAAQ,OAAO;KACjC,YAAY,CAAC,QAAS;IACvB;IACD,OAAO;KAAE,QAAQ;KAAQ,OAAO;KAC9B,YAAY,CAAC,UAAU,KAAM;IAC9B;IACD,aAAa;KAAE,QAAQ;KAAQ,OAAO;KACpC,YAAY,CAAC,QAAS;IACvB;IACD,SAAS;KAAE,QAAQ;KAAU,OAAO;KAAiB,SAAS,SAAS;KACrE,YAAY,CAAC,QAAS;IACvB;IACD,QAAQ;KACN,QAAQ;KAAU,OAAO;KAAgB,SAAS,SAAS;KAC3D,YAAY;KACZ,UAAU;KACV,QAAQ;IACT;IACD,UAAU;KACR,QAAQ;KAAY,OAAO;KAAkB,SAAS,SAAS;KAC/D,YAAY;KACZ,UAAU;KACV,QAAQ;IACT;IACD,SAAS;KAAE,QAAQ;KAAQ,OAAO;KAChC,YAAY,CAAC,QAAS;IACvB;IACD,cAAc;KAAE,QAAQ;KAAQ,OAAO;KACrC,YAAY,CAAC,QAAS;IACvB;IACD,SAAS;KAAE,QAAQ;KAAQ,OAAO;KAChC,YAAY,CAAC,QAAS;IACvB;IACD,MAAM;KAAE,QAAQ;KAAQ,OAAO;KAC7B,YAAY,CAAC,QAAS;IACvB;GACF;EACF;EAED,YAAY;GAAE,QAAQ;GAAY,OAAO;EAAoB;EAE7D,YAAY;GAAE,QAAQ;GAAY,OAAO;EAAoB;EAE7D,gBAAgB;GACd,QAAQ;GAAS,OAAO;GAAwB,UAAU;IACxD,WAAW;KAAE,QAAQ;KAAQ,OAAO;KAClC,YAAY,CAAC,eAAgB;IAC9B;IACD,UAAU;KAAE,QAAQ;KAAQ,OAAO;KACjC,YAAY,CAAC,eAAgB;IAC9B;IACD,OAAO;KAAE,QAAQ;KAAQ,OAAO;KAC9B,YAAY,CAAC,iBAAiB,KAAM;IAAE;IACxC,aAAa;KAAE,QAAQ;KAAQ,OAAO;KACpC,YAAY,CAAC,eAAgB;IAC9B;IACD,SAAS;KAAE,QAAQ;KAAU,OAAO;KAAiB,SAAS,SAAS;KACrE,YAAY,CAAC,eAAgB;IAC9B;IACD,QAAQ;KACN,QAAQ;KAAU,OAAO;KAAgB,SAAS,SAAS;KAC3D,YAAY,CAAC,eAAgB;KAC7B,UAAU;KACV,QAAQ;IACT;IACD,UAAU;KACR,QAAQ;KAAY,OAAO;KAAkB,SAAS,SAAS;KAC/D,YAAY,CAAC,eAAgB;KAC7B,UAAU;KACV,QAAQ;IACT;IACD,SAAS;KAAE,QAAQ;KAAQ,OAAO;KAChC,YAAY,CAAC,eAAgB;IAC9B;IACD,cAAc;KAAE,QAAQ;KAAQ,OAAO;KACrC,YAAY,CAAC,eAAgB;IAC9B;IACD,SAAS;KAAE,QAAQ;KAAQ,OAAO;KAChC,YAAY,CAAC,eAAgB;IAC9B;IACD,MAAM;KAAE,QAAQ;KAAQ,OAAO;KAC7B,YAAY,CAAC,eAAgB;IAC9B;GACF;GACD,UAAU;GACV,QAAQ;EACT;EAED,YAAY;GAAE,QAAQ;GAAQ,QAAQ;EAAM;CAE7C,GAAE,CAAC,OAAQ,EAAC;CAEb,UAAU,MAAM;AAGd,MAAI,SAAS,iBACX,SAAS;GACP,iBAAiB,SAAS;GAC1B,YAAY,SAAS;GACrB,YAAY,SAAS;GACrB,gBAAgB,SAAS;EAC1B,EAAC;WACO,MACT,SAAS,EACP,iBAAiB;GACf,WAAW,KAAK;GAChB,UAAU,KAAK;EAChB,EACF,EAAC;CAGL,GAAE,CAAC,OAAQ,EAAC;CAEb,MAAM,CAAC,OAAO,SAAS,GAAG,UAAiB;CAE3C,MAAM,WAAW,OAAOC,UAA4E;EAClG,MAAM,gBAAgB;AACtB,MAAI,KAAK,SAAS,KAAK,OAAO;GAC5B,QAAQ,IAAI,0BAA0B,KAAK,MAAM;AACjD,OAAI;IACF,SAAS,OAAU;IACnB,MAAM,WAAW,MAAM,IAAI,KAAuB,oBAAoB;KACpE,QAAQ;KACR,UAAU;MAAE,GAAG;MAAU,GAAG,KAAK;MAAO;KAAM;IAC/C,EAAC;IACF,YAAY,SAAS;AACrB,QAAI,OAAO,eAAe,YACxB,WAAW;KAAE,GAAG,KAAK;KAAO;IAAM,EAAC;GAEtC,SAAQC,SAAO;IACd,QAAQ,IAAI,0BAA0BA,QAAM;IAC5C,SAASA,QAAe;GACzB;EACF,OAAM;GACL,QAAQ,IAAI,2BAA2B;GACvC,YAAY;EACb;CACF;CAED,MAAM,mBAAmB,MAAM;AAC7B,MAAI,OAAO,oBAAoB,YAC7B,iBAAiB;CAEpB;AAED,wEAEK,yCACE,2CACE,KAAK;EAAI,gBAAe;gCACtB;GAAW;GAAgB;kCACzB,KAAK;IAAI,MAAK;IAAI,QAAO;;yBACvB;MAAK,SAAQ;MAAY,YAAW;MAAM,cAAa;gBAAO;OAAwB;yBACtF;MAAK,SAAQ;MAAc,cAAa;MAAO,UAAS;gBAAO;OAA4G;yBAC3K,KAAK;MAAI,QAAO;oCACd,mBAAgB,YAAY,OAAQ;OAC5B;KACV,6BAAU;MAAiB;gBAAQ,MAAM,oBAAoB;OAAa;yBAC1E;MAAiB;MAAM,MAAM;OAC5B,iBAAiB;QACf,WAAW;QACX,UAAU;QACV,OAAO;QACP,aAAa;QACb,SAAS;SAAE,IAAI;SAAM,MAAM;QAAS;QACpC,QAAQ;SAAE,IAAI;SAAM,MAAM;QAAU;QACpC,UAAU;SAAE,IAAI;SAAO,MAAM;QAAmB;QAChD,SAAS;QACT,cAAc;QACd,SAAS;QACT,MAAM;OACP;OACD,YAAY;OACZ,YAAY;MACb;OAAgB;;KACR;IACN;GACE,GACD,GACJ,sBACT;EAAQ,UAAS;EAAS,QAAO;EAAI,SAAQ;EAAS,QAAO;EAAM,YAAW;gCAC5E,4CACE,KAAK;GAAI,gBAAe;kCACtB,sCACE;IAAO,SAAQ;IAAY,SAAS;cAAkB;KAAa,GAC/D,sBACN,sCACE;IAAO,SAAQ;IAAU,SAAS;IAAU,UAAU;cAAS;KAAgB,GAC3E;IACE,GACD;GACJ,IACT;AAEN;;;;AC5ND,MAAaC,eAA4C,CAAC,EAAE,YAAY,QAA2B,KAAK;CACxF,UAAU;CAExB,MAAM,WAAW,YAAY,CAAC,UAAU,MAAM,SAAS;CACvD,MAAM,OAAO,QAAQ,CAAC,UAAU,MAAM,KAAK;CAC3C,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC,UAAU,MAAM,QAAQ;CAErD,MAAM,CAAC,MAAM,QAAQ,GAAG,SAAU,SAAS,mBAAmB,OAAQ,YAAY,SAAS;CAI3F,MAAM,SAAS,CAACC,WAAiB;EAC/B,QAAQC,OAAK;EACb,UAAU,EAAE;CACb;CAED,MAAM,aAAa,CAACC,SAAwB;AAC1C,MAAI,OAAO,WAAW,YACpB,OAAO,KAAK;CAEf;CAED,MAAM,aAAa,CAACC,WAAgB;EAClC,QAAQ,IAAI,aAAa;EACzB,QAAQC,OAAK;EACb,OAAO,UAAU;CAClB;CAED,MAAM,aAAa,MAAM;EACvB,QAAQ,IAAI,aAAa;EACzB,OAAO,mBAAmB;CAC3B;CAED,MAAM,iBAAiB,MAAM;EAC3B,QAAQ,IAAI,iBAAiB;EAC7B,OAAO,iBAAiB;CACzB;CAED,MAAM,eAAe,MAAM;EACzB,OAAO,QAAQ;CAChB;CAED,MAAM,kBAAkB,MAAM;EAC5B,OAAO,WAAW;CACnB;CAED,MAAM,gBAAgB,MAAM;EAC1B,OAAO,SAAS;CACjB;CAED,MAAM,kBAAkB,MAAM;EAC5B,OAAO,SAAS;CACjB;CAED,MAAM,cAAc,MAAM;AACxB,MAAI,OAAO,eAAe,YACxB,YAAY;EAEd,UAAU,EAAE;CACb;CAED,MAAM,UAAU,MAAM;AACpB,UAAQ,MAAR;GACE,KAAK,SACH,wEAEK,yCACE;IAAU,WAAU;mCAClB,KAAK;KAAI,QAAO;oCACd;MAAK,IAAI;qCACP,KAAK;OAAI,KAAI;OAAO,YAAW;;4BAC7B;SAAK,SAAQ;SAAY,YAAW;mBAAM;UAAY;4BACtD;SAAK,SAAQ;SAAc,cAAa;SAAO,UAAS;mBAAO;UAAkF;4BACjJ;SAAO,SAAQ;SAAU,SAAS,MAAM,QAAQ,QAAQ;mBAAE;UAAc;;QAChE;OACN,sBACN;MAAK,IAAI;qCACP,KAAK;OAAI,KAAI;uCACX,KAAK;QAAI,KAAI;QAAO,YAAW;QAAa,cAAa;;6BACvD;UAAK,SAAQ;UAAY,YAAW;oBAAM;WAAe;6BACzD;UAAK,SAAQ;UAAc,cAAa;UAAO,UAAS;oBAAO;WAAqF;6BACpJ;UAAO,SAAQ;UAAU,SAAS,MAAM,QAAQ,WAAW;oBAAE;WAAiB;;SACtE,uBACV,KAAK;QAAI,KAAI;QAAO,YAAW;;6BAC7B;UAAK,SAAQ;UAAY,YAAW;oBAAM;WAAuB;6BACjE;UAAK,SAAQ;UAAc,cAAa;UAAO,UAAS;oBAAO;WAAgT;6BAC/W;UAAO,SAAQ;UAAU,SAAS,MAAM,QAAQ,UAAU;oBAAE;WAAgB;;SACpE;QACF;OACN;MACE;KACD,GACJ,sBACT;IAAQ,UAAS;IAAS,QAAO;IAAI,SAAQ;IAAS,QAAO;IAAM,YAAW;kCAC5E,2CACE,KAAK;KAAI,gBAAe;mCACtB,sCACE;MAAO,SAAQ;MAAY,SAAS;gBAAa;OAAa,GAC1D;MACE,GACD;KACJ,IACT;GAEP,KAAK,UACH,4BAAS;IAAuB;IAAkB;IAA6B;KAAmB;GACpG,KAAK,QACH,4BAAS;IAA0B;IAA2B;IAAgC;IAAkC;KAAmB;GACrJ,KAAK,WACH,4BAAS;IAA6B;IAA0B;IAA+B;KAAmB;GACpH,KAAK,mBACH,4BAAS;IAAsC;IAA+B;KAAmB;GACnG,KAAK,SACH,4BAAS;IAA+B;IAA8B;IAA+B;IAAkC;KAAmB;GAC5J,KAAK,iBACH,4BAAS;IAAoC;IAA+B;KAAmB;GACjG,QACE,QAAO;EACV;CACF;AACD,kDAEK,SAAS,GACT;AAEN;;;;ACnID,MAAaC,kBAAkD,CAAC,EAAE,YAAY,WAAiC,KAAK;CAClH,MAAM,QAAQ,UAAU;CAExB,MAAM,MAAM,QAAQ;CAEpB,MAAM,WAAW,YAAY,CAAC,UAAU,MAAM,SAAS;CACvD,MAAM,EAAE,aAAa,GAAG,YAAY,CAAC,UAAU,MAAM,QAAQ;CAE7D,MAAM,CAAC,SAAS,QAAQ,GAAG,WAA6C,sBAAsB,SAAS;CAEvG,MAAM,CAAC,OAAO,SAAS,GAAG,UAAiB;CAE3C,MAAM,WAAW,mBAAmB;CAEpC,MAAM,EAAE,MAAM,YAAY,UAAU,GAAG,cAA6C,EAClF,SAAS;EAAE,QAAQ;EAAU,OAAO;EAAiB,SAAS,SAAS;EAAU,YAAY,CAAC,QAAS;CAAE,EAC1G,GAAE,CAAC,OAAQ,EAAC;CAEb,UAAU,MAAM;AACd,MAAI,SAAS,SACX,SAAS,EAAE,SAAS,SAAS,QAAS,EAAC;WAC9B,SACT,SAAS,EACP,SAAS,QAAQ,SAAS,GAC3B,EAAC;CAGL,GAAE,CAAC,OAAQ,EAAC;CAEb,MAAM,WAAW,OAAOC,UAA4E;EAClG,MAAM,gBAAgB;AACtB,MAAI,KAAK,SAAS,KAAK,OAAO;GAC5B,QAAQ,IAAI,yBAAyB,KAAK,MAAM;AAChD,OAAI;IACF,SAAS,OAAU;IACnB,MAAMC,YAAU,KAAK,MAAM;IAC3B,MAAM,WAAW,MAAM,IAAI,KAAuB,oBAAoB;KACpE,QAAQ;KACR,UAAU;MAAE,GAAG;MAAU;KAAS;IACnC,EAAC;IACF,YAAY,SAAS;AACrB,QAAI,OAAO,cAAc,YACvB,UAAUA,UAAQ;GAErB,SAAQC,SAAO;IACd,QAAQ,IAAI,yBAAyBA,QAAM;IAC3C,SAASA,QAAe;GACzB;EACF,OAAM;GACL,QAAQ,IAAI,0BAA0B;GACtC,YAAY;EACb;CACF;CAED,MAAM,cAAc,MAAM;AACxB,MAAI,OAAO,eAAe,YACxB,YAAY;CAEf;CAED,MAAM,UAAU,KAAK,SAAS;CAE9B,MAAM,kBAAkB,CAACC,UAA+C;EACtE,KAAK,SAAS,QAAQ,QAAQ,SAAS,SAAS,KAAK,OAAK,EAAE,GAAG,UAAU,KAAK,MAAM,OAAO,MAAM;CAClG;AAED,wEAEK,yCACE,2CACE;EAAW;EAAgB;iCACzB,KAAK;GAAI,MAAK;GAAI,QAAO;;wBACvB;KAAK,SAAQ;KAAY,YAAW;eAAM;MAA8B;IACxE,+BAAY,YAAU;IACd,+BACN,UAAU;KAAM,cAAc,QAAQ,OAAO,GAAG,UAAU;KAAE,UAAU;eACpE,SAAS,SAAS,IAAI,iCACpB;MAA0B,OAAO,OAAO,GAAG,UAAU;MAAE,MAAK;;2BAC1D,UAAU,mBAAO,OAAO,OAAuB;OAC/C,OAAO,gCAAa,UAAU,YAAS,yBAAyB,EAAE,QAAQ,OAAO,SAAU,IAAuB;OAClH,OAAO,6BAAU,UAAU,SAAM,MAAM,OAAO,QAAS;;QAH1C,OAAO,GAIX,CACZ;MACc;IAEnB;IACA,6BAAU;KAAiB;eAAQ,MAAM,oBAAoB;MAAa;;IAClE;GACN,GACG,GACJ,sBACT;EAAQ,UAAS;EAAS,QAAO;EAAI,SAAQ;EAAS,QAAO;EAAM,YAAW;gCAC5E,4CACE,KAAK;GAAI,gBAAe;kCACtB,sCACE;IAAO,SAAQ;IAAY,SAAS;cAAa;KAAa,GAC1D,sBACN,sCACE;IAAO,SAAQ;IAAU,SAAS;cAAU;KAAgB,GACxD;IACE,GACD;GACJ,IACT;AAEN;;;;ACxGD,MAAaC,iBAAgD,CAAC,EAAE,YAAY,UAA+B,KAAK;CAC9G,MAAM,QAAQ,UAAU;CAExB,MAAM,MAAM,QAAQ;CAEpB,MAAM,WAAW,aAAa;CAE9B,MAAM,WAAW,QAAQ,YAAY;CAErC,MAAM,WAAW,YAAY,CAAC,UAAU,MAAM,SAAS;CACvD,MAAM,EAAE,aAAa,GAAG,YAAY,CAAC,UAAU,MAAM,QAAQ;CAE7D,MAAM,CAAC,SAAS,QAAQ,GAAG,WAA+C,uBAAuB,SAAS;CAI1G,MAAM,CAAC,OAAO,SAAS,GAAG,UAAiB;CAE3C,MAAM,WAAW,mBAAmB;CAEpC,MAAM,EAAE,MAAM,UAAU,YAAY,GAAG,cAA+C,EACpF,UAAU;EAAE,QAAQ;EAAU,OAAO;EAAkB,SAAS,SAAS;EAAW,YAAY,CAAC,QAAS;CAAE,EAC7G,GAAE,CAAC,OAAQ,EAAC;CAEb,UAAU,MAAM;AACd,MAAI,SAAS,YAAY,SAAS,WAChC,SAAS,EACP,UAAU,SAAS,SACpB,EAAC;WACO,SACT,SAAS,EACP,UAAU,QAAQ,UAAU,GAC7B,EAAC;CAGL,GAAE,CAAC,OAAQ,EAAC;CAEb,MAAM,mBAAmB,KAAK,OAAO;CACrC,MAAM,kBAAkB,SAAS;CACjC,MAAM,iBAAiB,SAAS;CAChC,MAAM,WAAW,SAAS;CAC1B,MAAM,WAAW,SAAS,YAAY;CACtC,MAAM,eAAe,SAAS,gBAAgB;CAC9C,MAAM,QAAQ,SAAS,SAAS;CAChC,MAAM,QAAQ,SAAS,SAAS;CAEhC,MAAM,WAAW,OAAOC,UAA4E;EAClG,MAAM,gBAAgB;AACtB,MAAI,KAAK,SAAS,KAAK,OAAO;GAC5B,QAAQ,IAAI,wBAAwB,KAAK,MAAM;AAC/C,OAAI;IACF,SAAS,OAAU;IACnB,MAAMC,aAAW,KAAK,MAAM;IAC5B,MAAM,WAAW,MAAM,IAAI,KAAuB,oBAAoB;KACpE,QAAQ;KACR,UAAU;MAAE,GAAG;MAAU;KAAU;IACpC,EAAC;IACF,YAAY,SAAS;AACrB,QAAI,OAAO,aAAa,YACtB,SAASA,WAAS;GAErB,SAAQC,SAAO;IACd,QAAQ,IAAI,wBAAwBA,QAAM;IAC1C,SAASA,QAAe;GACzB;EACF,OAAM;GACL,QAAQ,IAAI,yBAAyB;GACrC,YAAY;EACb;CACF;CAED,MAAM,cAAc,MAAM;AACxB,MAAI,OAAO,eAAe,YACxB,YAAY;CAEf;CAED,MAAM,WAAW,KAAK,SAAS;CAE/B,MAAM,gBAAgB,CAACC,UAA+C;EACpE,KAAK,SAAS,SAAS,QAAQ,SAAS,UAAU,KAAK,OAAK,EAAE,GAAG,UAAU,KAAK,MAAM,OAAO,MAAM;CACpG;AAED,wEAEK,yCACE,4CACE,KAAK;EAAI,KAAI;EAAO,iBAAgB;iCAClC;GAAK,QAAO;GAAgC,cAAa;iCACvD;IAAW;IAAgB;mCACzB,KAAK;KAAI,MAAK;KAAI,QAAO;;0BACvB;OAAK,SAAQ;OAAY,YAAW;iBAAM;QAAsB;0BAChE;OAAK,SAAQ;OAAc,cAAa;iBAAO;QAAmE;MAClH,+BAAY,YAAU;MACtB,yCACE,KAAK;OAAI,cAAa;;4BACpB;SAAK,SAAQ;SAAY,YAAW;mBAAO,iBAAiB;UAAY;6BACxE;SAAM,iBAAiB;SAAQ;SAAG,iBAAiB;YAAoB;6BACvE;SAAM,iBAAiB;SAAQ;SAAE,iBAAiB;SAAK;SAAE,iBAAiB,SAAS;YAAY;4BAC/F,kBAAM,iBAAiB,cAAmB;;QAClC;MAEJ,gCACN,UAAU;OAAM,cAAc,SAAS,OAAO,GAAG,UAAU;OAAE,UAAU;OAAe,UAAS;iBAC7F,SAAS,UAAU,IAAI,iCACrB;QAA0B,OAAO,OAAO,GAAG,UAAU;;6BACnD,UAAU,mBAAO,OAAO,OAAuB;SAC/C,OAAO,gCAAa,UAAU,sBAAU,OAAO,SAAS,OAA0B;SAClF,OAAO,gCAAa,UAAU,mBAAO,SAAS,OAAO,SAAS,GAAmB;;UAHpE,OAAO,GAIX,CACZ;QACc;MAEnB;MACA,6BAAU;OAAiB;iBAAQ,MAAM,oBAAoB;QAAa;2BAC1E,KAAK;OAAI,SAAQ;sCACf;QAAK,IAAI;kBACP,wCACE,KAAK;SAAI,KAAI;wCACX;UAAK,SAAQ;UAAY,YAAW;oBAAM;WAAuB,uBACjE,KAAK;+BACH;WAAK,SAAQ;WAAY,YAAW;;YAAO,gBAAgB;YAAU;YAAE,gBAAgB;;YAAgB;+BACvG;WAAM,gBAAgB;WAAQ;WAAG,gBAAgB;cAAoB;+BACrE;WAAM,gBAAgB;WAAQ;WAAE,gBAAgB;WAAK;WAAE,gBAAgB,SAAS;cAAY;8BAC5F,kBAAM,gBAAgB,cAAmB;8BACzC,kBAAM,gBAAgB,QAAa;aAC3B;UACF;SAER,sBACN;QAAK,IAAI;kBACP,uCACE,KAAK;SAAI,KAAI;wCACX;UAAK,SAAQ;UAAY,YAAW;oBAAM;WAAsB,uBAChE,KAAK;+BACH;WAAK,SAAQ;WAAY,YAAW;;YAAO,eAAe;YAAU;YAAE,eAAe;;YAAgB;+BACrG;WAAM,eAAe;WAAQ;WAAG,eAAe;cAAoB;+BACnE;WAAM,eAAe;WAAQ;WAAE,eAAe;WAAK;WAAE,eAAe,SAAS;cAAY;8BACzF,kBAAM,eAAe,cAAmB;8BACxC,kBAAM,eAAe,QAAa;aAC1B;UAAW;SAErB;QACE;;MACF;KACN;IACF,sBACN;GAAK,QAAO;GAAY,cAAa;kCACnC,KAAK;IAAI,KAAI;IAAO,YAAW;IAAS,OAAM;oCAC5C,KAAK;KAAI,KAAI;KAAO,SAAQ;KAAO,cAAa;KAAQ,QAAO;KAC9D,UAAS;KAAQ,YAAW;;2BAC3B,KAAK;OAAI,KAAI;OAAO,YAAW;;4BAC7B;SAAK,UAAS;mBAAI;UAAc;4BAChC;SAAK,WAAU;SAAO,WAAU;mBAAQ;UAAU;4BAClD;SAAK,WAAU;SAAO,WAAU;mBAAQ;UAAY;;QAC5C;0BACV,KAAK;OAAI,MAAK;OAAI,KAAI;OAAO,SAAQ;OACpC,WAAU;OACV,cAAa;iBACZ,SAAS,SAAS,SAAS,MAAM,IAAI,CAACC,MAAqBC,2BACzD,KAAK;QAAY,KAAI;;6BACnB;UAAK,UAAS;oBAAK,KAAK,QAAQ;WAAa;6BAC7C;UAAK,WAAU;UAAO,WAAU;oBAAS,KAAK;WAAW;8BACzD,KAAK;UAAI,WAAU;UAAO,YAAW;UAAW,WAAU;yCACxD,kBAAM,SAAS,KAAK,MAAM,KAAK,MAAM,GAAQ,EAC7C,KAAK,YAAY,KAAK,6BAAU;WAAK,SAAQ;WAAc,gBAAe;WAAe,OAAM;qBAA4B,SAAS,KAAK,YAAY,KAAK,IAAI;YAAQ;WAC9J;;UANE,EAOJ,CACZ;QACQ;2BACV,KAAK;OAAI,KAAI;;4BACX;SAAK,UAAS;mBAAI;UAAe;4BACjC;SAAK,WAAU;SAAO,WAAU;mBAAQ;UAAa;6BACrD,KAAK;SAAI,WAAU;SAAO,YAAW;SAAW,WAAU;wCACxD,kBAAM,SAAS,SAAS,GAAQ,EAChC,eAAe,gCAAa;UAAK,SAAQ;UAAc,gBAAe;UAAe,OAAM;oBAA4B,SAAS,aAAa;WAAQ;UAC7I;;QACF;MACV,SAAS,aAAa,SAAS,UAAU,IAAI,CAAC,MAAM,2BAClD,KAAK;OAAY,KAAI;;4BACnB;SAAK,UAAS;uCAAK,mBAAO,KAAK,SAAS,KAAW;UAAO;QAC1D,KAAK,SAAS,gCACZ;SAAK,WAAU;SAAO,WAAU;SAAQ,yBAAyB,EAAE,QAAQ,KAAK,SAAS,SAAU;UAAI;4BAEzG;SAAK,WAAU;SAAO,WAAU;mBAAS,SAAS,KAAK,MAAM;UAAQ;;SALzD,EAMJ,CACZ;MACA,QAAQ,0BACN,KAAK;OAAI,KAAI;;4BACX;SAAK,UAAS;mBAAI;UAAY;4BAC9B;SAAK,WAAU;SAAO,WAAU;mBAAQ;UAAa;4BACrD;SAAK,WAAU;SAAO,WAAU;mBAAS,SAAS,MAAM;UAAQ;;QACxD;MAEZ,iCACE,KAAK;OAAI,KAAI;;QACX,SAAS,gCACP;SAAK,UAAS;mBAAK,SAAS,SAAS;UAAY;4BAEnD;SAAK,WAAU;SAAO,WAAU;mBAAQ;UAAa;4BACrD;SAAK,WAAU;SAAO,WAAU;mBAAS,SAAS,SAAS,MAAM;UAAQ;;QACjE;2BAEZ,KAAK;OAAI,KAAI;OAAO,YAAW;OAAM,cAAa;;4BAChD;SAAK,UAAS;mBAAI;UAAY;4BAC9B;SAAK,WAAU;SAAO,WAAU;mBAAQ;UAAa;4BACrD;SAAK,WAAU;SAAO,WAAU;mBAAS,SAAS,MAAM;UAAQ;;QACxD;;MACF,sBACV;KAAI,SAAQ;KAAO,cAAa;KAAQ,QAAO;mCAC7C,qBAAmB;MAChB;KACG;IACN;GACE,GACD,GACJ,sBACT;EAAQ,UAAS;EAAS,QAAO;EAAI,SAAQ;EAAS,QAAO;EAAM,YAAW;gCAC5E,4CACE,KAAK;GAAI,gBAAe;kCACtB,sCACE;IAAO,SAAQ;IAAY,SAAS;cAAa;KAAa,GAC1D,sBACN,sCACE;IAAO,SAAQ;IAAU,SAAS;cAAU;KAAgB,GACxD;IACE,GACD;GACJ,IACT;AAEN;;;;AC5OD,MAAaC,eAA4C,CAAC,EAAE,MAAM,OAAO,KAAK;AAC5E,6BACG,KAAK;EAAI,KAAI;aACX,6BAAU;GAAK,SAAQ;GAAY,YAAW;aAAO;IAAa,uBAClE,KAAK;wBACH;IAAK,YAAW;;KAAO,KAAK;KAAU;KAAE,KAAK;;KAAgB;wBAC7D;IAAM,KAAK;IAAQ;IAAG,KAAK;OAAoB;wBAC/C;IAAM,KAAK;IAAQ;IAAE,KAAK;IAAK;IAAE,KAAK,SAAS;OAAY;uBAC3D,kBAAM,KAAK,cAAmB;uBAC9B,kBAAM,KAAK,QAAa;MAChB;GACF;AAEd;;;;ACRD,MAAaC,gBAA8C,CAAC,EAAE,WAAW,MAAM,YAAgC,KAAK;CAClH,MAAM,QAAQ,UAAU;CAExB,MAAM,CAAC,YAAY,cAAc,GAAG,SAAkB,MAAM;CAE5D,MAAM,WAAW,mBAAmB;CACpC,MAAM,eAAe,uBAAuB;CAC5C,MAAM,QAAQ,gBAAgB;CAC9B,MAAM,QAAQ,eAAe,CAAC,OAAO,WAAW,SAAS,SAAS;AAChE,SAAO,WAAW;CACnB,EAAC;CAEF,MAAM,EAAE,MAAM,YAAY,GAAG,cAA6B;EACxD,UAAU;GAAE,QAAQ;GAAY,OAAO;GAAkB,YAAY;EAAU;EAC/E,iBAAiB;GAAE,QAAQ;GAAY,OAAO;GAAyB,YAAY,CAAC,UAAU,KAAM;EAAE;EACtG,WAAW;GAAE,OAAO,KAAK;GAAW,QAAQ;GAAQ,OAAO;GAAmB,YAAY,CAAC,QAAS;EAAE;EACtG,UAAU;GAAE,OAAO,KAAK;GAAU,QAAQ;GAAQ,OAAO;GAAkB,YAAY,CAAC,QAAS;EAAE;EACnG,OAAO;GAAE,OAAO,KAAK;GAAO,QAAQ;GAAQ,OAAO;GAAe,YAAY,CAAC,UAAU,KAAM;EAAE;EACjG,SAAS;GAAE,QAAQ;GAAY,OAAO;GAAiB,YAAY,CAAC,YAAa;EAAE;EACnF,YAAY;GAAE,QAAQ;GAAQ,QAAQ;EAAM;CAC7C,EAAC;CAEF,MAAM,CAAC,OAAO,SAAS,GAAG,UAAiB;CAE3C,MAAM,WAAW,OAAOC,UAA4C;EAClE,MAAM,gBAAgB;AACtB,MAAI,KAAK,OAAO;GACd,QAAQ,IAAI,sBAAsB,KAAK,MAAM;AAC7C,OAAI;IACF,SAAS,OAAU;IACnB,MAAM,SAAS,sBAAsB,KAAK,MAAM;IAChD,cAAc,KAAK;AACnB,QAAI,OAAO,eAAe,YACxB,YAAY;GAEf,SAAQC,SAAO;IACd,QAAQ,IAAI,sBAAsBA,QAAM;IACxC,SAASA,QAAe;GACzB;EACF,OAAM;GACL,QAAQ,IAAI,uBAAuB;GACnC,YAAY;EACb;CACF;AAED,4BACG;EAAmB;gCACjB,2CACE,KAAK;GAAI,KAAI;GAAO,SAAQ;GAAc,cAAa;GAAQ,QAAO;aACpE,6EAEI;IAAK,SAAQ;IAAY,YAAW;cAAM;KAAsB,uBAChE;IAAK,SAAQ;IAAc,cAAa;IAAO,UAAS;;KAAO;KAA6C,KAAK,OAAO;KAAM;;KAAiC,IAC/J;wBAEA;KAAK,SAAQ;KAAY,YAAW;eAAM;MAAgC;wBAC1E;KAAK,SAAQ;KAAc,cAAa;KAAO,UAAS;eAAO;MAAmG;yBAClK;KAAW;KAAgB;;0BACzB,KAAK;OAAI,QAAO;qCACd,mBAAgB,YAAY,OAAQ;QAC5B;MACV,6BAAU;OAAiB;iBAAQ,MAAM,oBAAoB;QAAa;0BAC1E;OAAO,MAAK;OAAS,SAAQ;OAAU,MAAK;OAAK,gBAAe;OAAS,QAAO;qCAAU,oBAAK,mBAAqB;QAAS;0BAC7H;OAAiB;OAAM,MAAM;QAC5B,WAAW;QACX,UAAU;QACV,OAAO;QACP,UAAU;QACV,iBAAiB;QACjB,SAAS;OACV;QAAe;;MACX;OACN;IAEI,GACD;GACJ;AAEb;;;;ACvFD,MAAaC,mBAAsD,CAAC,EAAE,MAA+B,KAAK;CAExG,MAAM,WAAW,aAAa;CAC9B,MAAM,UAAU,KAAK;CACrB,MAAM,QAAQ,SAAS,KAAK,MAAM;CAClC,MAAM,aAAa,SAAS,KAAK,QAAQ,KAAK,IAAI;AAElD,6BACG,KAAK;EAAI,KAAI;EAAO,eAAc;EAAO,cAAa;;uBACpD;IAAK,UAAS;mCACZ,KAAK;KAAI,KAAI;gBACX,QAAQ,6BACN;MAAM,MAAM,QAAQ;MAAO,aAAa;MAAG,OAAM;MAAQ,QAAO;MAAQ,MAAK;MAAY;OAAU,uBAErG,KAAK;MAAI,YAAW;qCAClB;OAAK,MAAM,QAAQ;qCACjB;QAAO,IAAG;QAAI,SAAQ;sCACpB;SAAK,SAAQ;SAAc,YAAW;mBAAO,QAAQ;UAAa;SAC5D;QACJ,EACN,QAAQ,gCACN;OAAK,SAAQ;OAAc,yBAAyB,EAAE,QAAQ,QAAQ,SAAU;QAAI;OAE9E;MACF;KACN;uBACN;IAAK,WAAU;IAAQ,gBAAe;kCACpC,kBAAM,QAAa;KACf;uBACN;IAAK,WAAU;IAAQ,gBAAe;cAAU,KAAK,IAAI,UAAU;KAAQ;uBAC3E;IAAK,WAAU;IAAQ,gBAAe;kCACpC,kBAAM,aAAkB;KACpB;;GACE;AAEd;;;;AC9BD,MAAaC,eAA4C,CAAC,EAAE,OAA0B,KAAK;CAC3E,UAAU;CACT,WAAW;CAC1B,MAAM,WAAW,aAAa;AAE9B,sEAEK,0CACE;sBACE;GAAK,SAAQ;GAAY,YAAW;aAAM;IAAoB;uBAC9D,KAAK;GAAI,KAAI;GAAO,SAAQ;GAAS,YAAW;;wBAC9C;KAAK,UAAS;eAAI;MAAc;wBAChC;KAAK,WAAU;KAAQ,WAAU;eAAQ;MAAiB;wBAC1D;KAAK,WAAU;KAAQ,WAAU;eAAS;MAAe;wBACzD;KAAK,WAAU;KAAQ,WAAU;eAAQ;MAAY;;IAC7C;uBACV,KAAK;GAAI,MAAK;GAAI,KAAI;;IACpB,MAAM,SAAS,MAAM,MAAM,IAAI,CAAC,MAAM,0BACpC,oBAA+B,QAAT,EAAiB,CACzC;yBACA,KAAK;KAAI,KAAI;;0BACX;OAAK,UAAS;iBAAI;QAAe;0BACjC;OAAK,WAAU;OAAQ,WAAU;iBAAQ;QAAa;0BACtD;OAAK,WAAU;OAAQ,WAAU;iBAAS;QAAa;0BACvD;OAAK,WAAU;OAAO,WAAU;iBAAS,SAAS,MAAM,SAAS;QAAQ;;MACjE;IACV,MAAM,aAAa,MAAM,UAAU,IAAI,CAAC,MAAM,2BAC5C,KAAK;KAAY,KAAI;;0BACnB;OAAK,UAAS;qCAAK,mBAAO,KAAK,SAAS,KAAW;QAAO;0BAC1D;OAAK,WAAU;OAAQ,WAAU;iBAAQ;QAAa;MACtD,KAAK,UAAU,gCACb;OAAK,WAAU;OAAQ,WAAU;OAAS,yBAAyB,EAAE,QAAQ,KAAK,SAAS,SAAU;QAAI;0BAE3G;OAAK,WAAU;OAAO,WAAU;iBAAS,SAAS,KAAK,MAAM;QAAQ;;OANzD,EAOJ,CACZ;IACA,MAAM,QAAQ,0BACZ,KAAK;KAAI,KAAI;;0BACX;OAAK,UAAS;iBAAI;QAAY;0BAC9B;OAAK,WAAU;OAAQ,WAAU;iBAAQ;QAAa;0BACtD;OAAK,WAAU;OAAQ,WAAU;iBAAS;QAAa;0BACvD;OAAK,WAAU;OAAO,WAAU;iBAAS,SAAS,MAAM,MAAM;QAAQ;;MAC9D;IAEZ,MAAM,iCACJ,KAAK;KAAI,KAAI;;0BACX;OAAK,UAAS;iBAAK,MAAM,SAAS,SAAS;QAAY;0BACvD;OAAK,WAAU;OAAQ,WAAU;iBAAQ;QAAa;0BACtD;OAAK,WAAU;OAAQ,WAAU;iBAAS;QAAa;0BACvD;OAAK,WAAU;OAAQ,WAAU;iBAAS,SAAS,MAAM,SAAS,MAAM;QAAQ;;MACxE;yBAEZ,KAAK;KAAI,KAAI;KAAO,YAAW;KAAM,cAAa;;0BAChD;OAAK,UAAS;iBAAI;QAAY;0BAC9B;OAAK,WAAU;OAAQ,WAAU;iBAAQ;QAAa;0BACtD;OAAK,WAAU;OAAQ,WAAU;iBAAS;QAAa;0BACvD;OAAK,WAAU;OAAQ,WAAU;iBAAS,SAAS,MAAM,MAAM;QAAQ;;MAC/D;;IACF;KACD,GACJ,GACT;AAEN;;;;AC3DD,MAAaC,kBAAkD,CAAC,EAAE,OAA6B,KAAK;CAClG,MAAM,QAAQ,UAAU;CACxB,MAAM,EAAE,OAAO,GAAG,QAAQ,WAAS,MAAM,QAAQ;CAEjD,UAAU,MAAM;EACd,OAAO;CACR,GAAE,CAAC,KAAM,EAAC;AAGX;sBAEK;GAAQ,UAAS;GAAS,KAAI;GAAO,SAAQ;GAAS,QAAO;GAAM,YAAW;iCAC5E,UAAU,wCACR,KAAK;IAAI,gBAAe;oCACtB;KAAK,SAAQ;KAAc,YAAW;;MAAM;MAAQ,MAAM;MAAO;0BAAE,mBAAO,MAAM,CAAC,aAAa,EAAE,MAAM,QAAQ,CAAC,GAAS;;MAAO,sBAC/H;KAAO,WAAU;KAAa,SAAQ;KAAU,SAAS,MAAM,OAAO,OAAO;eAAE;MAAc;KACrF,GACK;IACV;sBACT;GAAQ,WAAU;iCAChB,4CACE,KAAK;IAAI,KAAI;IAAO,YAAW;IAAS,WAAU;oCAChD;KAAK,SAAQ;KAAY,YAAW;gBAAM,8BAA2B,MAAM,OAAO,MAAM,KAAK,YAAY,MAAM,gBAAgB;MAAiB,uBAChJ;KAAK,SAAQ;KAAc,cAAa;KAAO,UAAS;;MAAO;MAA6C,MAAM,OAAO,MAAM,KAAK,QAAQ,MAAM,gBAAgB;MAAM;;MAAyC;KACzM,GACD;IACJ;EACT,CAAC,MAAM,4BACL;GAAc,WAAU;GAAa,MAAM,MAAM;IAAmB;sBAEtE,gBAAoB,QAAS;sBAC7B,yCACE,4CACE,KAAK;GAAI,SAAQ;kCACf;IAAK,IAAI;cACP,MAAM,uCACJ;KAAa,MAAM,MAAM;KAAiB,OAAO;MAAsB;KAErE,sBACN;IAAK,IAAI;cACP,MAAM,sCACJ;KAAa,MAAM,MAAM;KAAgB,OAAO;MAAqB;KAEnE;IACE,GACD,GACJ;KACT;AAEN;;;;AC/CD,IAAY,4DAAL;;;;;;;;;;AASN;AAED,MAAM,eAAe,OAAO,KAAK,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCtC,CAAC;AAQD,MAAaC,iBAAgD,CAAC,EAAE,WAAY,GAAG,OAA4B,KAAK;CAC9G,MAAM,SAAS,WAAW;CAC1B,MAAM,MAAM,QAAQ;CAEpB,MAAM,WAAW,YAAY,CAAC,UAAU,MAAM,SAAS;CAEvD,MAAM,CAAC,QAAQ,UAAU,GAAG,SAAyB,eAAe,OAAO;CAE3E,QAAQ,IAAI,kBAAkB,UAAU,OAAO;CAE/C,MAAM,cAAc,CAACC,eAA+B;AAElD,MAAI,OAAO,eAAe,YACxB,WAAWC,WAAS;EAEtB,UAAU,EAAE;CACb;CAGD,MAAM,WAAW,CAACC,UAA2B;EAC3C,QAAQ,IAAI,2BAA2B,MAAM;EAC7C,YAAY;GAAE,GAAG;GAAU;EAAO,EAAC;EACnC,UAAU,eAAe,KAAK;CAC/B;CAGD,MAAM,SAAS,CAACC,SAAwB;EACtC,QAAQ,IAAI,yBAAyB,KAAK;EAC1C,YAAY;GAAE,GAAG;GAAU,GAAG;EAAM,EAAC;EACrC,UAAU,eAAe,SAAS;CACnC;CAGD,MAAM,aAAa,CAACC,aAAgC;EAClD,QAAQ,IAAI,6BAA6B,SAAS;EAClD,YAAY;GAAE,GAAG;GAAU;EAAU,EAAC;EACtC,UAAU,eAAe,OAAO;CACjC;CAGD,MAAM,WAAW,CAACC,aAAgC;EAChD,QAAQ,IAAI,2BAA2B,SAAS;EAChD,YAAY;GAAE,GAAG;GAAU;EAAU,EAAC;EACtC,UAAU,eAAe,QAAQ;CAClC;CAGD,MAAM,YAAY,OAAOC,YAA8B;EACrD,QAAQ,IAAI,4BAA4B,QAAQ;AAChD,MAAI;GACF,MAAM,WAAW,MAAM,IAAI,KAA+B,oBAAoB;IAAE,GAAG;IAAU;GAAS,EAAC;GACvG,QAAQ,IAAI,sBAAsB,SAAS;AAC3C,OAAI,kBAAkB,cAAc,MAClC,OAAO,KAAK,SAAS,YAAY;QAEjC,OAAO,SAAS,OAAO,SAAS;EAEnC,SAAQ,OAAO;GACd,QAAQ,MAAM,mBAAmB,MAAM;EACxC;CAKF;CAED,MAAM,aAAa,MAAM;EACvB,QAAQ,IAAI,4BAA4B;AACxC,MAAI,SAAS,eAAe,QAC1B,UAAU,SAAS,EAAE;EAEvB,UAAU,EAAE;CACb;AAED;sBAEK;GAAQ,UAAS;GAAS,KAAI;GAAO,SAAQ;GAAS,QAAO;GAAM,YAAW;iCAC5E,4CACE;IAAa,gBAAe;;yBAC1B;MAAK,WAAW,cAAc,EAAE,QAAQ,WAAW,eAAe,OAAQ,EAAC;gBAAE;OAAa;yBAC1F;MAAK,WAAW,cAAc,EAAE,QAAQ,WAAW,eAAe,KAAM,EAAC;gBAAE;OAAgB;yBAC3F;MAAK,WAAW,cAAc,EAAE,QAAQ,WAAW,eAAe,SAAU,EAAC;gBAAE;OAAe;yBAC9F;MAAK,WAAW,cAAc,EAAE,QAAQ,WAAW,eAAe,OAAQ,EAAC;gBAAE;OAAa;yBAC1F;MAAK,WAAW,cAAc,EAAE,QAAQ,WAAW,eAAe,QAAS,EAAC;gBAAE;OAAc;yBAC5F;MAAK,WAAW,cAAc,EAAE,QAAQ,WAAW,eAAe,SAAU,EAAC;gBAAE;OAAe;;KAClF,GACL;IACJ;EACT,WAAW,eAAe,8BAAW,kBAAyB,WAAY;EAC1E,WAAW,eAAe,4BAAS;GAAqB;GAAoB;IAAc;EAC1F,WAAW,eAAe,gCAAa;GAA6B;GAAwB;IAAc;EAC1G,WAAW,eAAe,8BAAW;GAAyB;GAAsB;IAAc;EAClG,WAAW,eAAe,+BAAY;GAA2B;GAAuB;IAAc;KACtG;AAEN;;;;AC/JD,MAAa,eAAe;CAC1B,SAAS;CACT,iBAAiB;CACjB,qBAAqB;CACrB,kBAAkB;CAClB,gBAAgB;CAChB,kBAAkB;CAClB,WAAW;CACX,SAAS;CACT,WAAW;CACX,UAAU;CACV,UAAU;CACV,UAAU;CACV,4BAA4B;CAC5B,mBAAmB;AACpB;;;;ACVD,MAAaC,YAAsC,CAAC,EAAE,MAAM,KAAK;CAChD,WAAW;CAE1B,MAAM,QAAQ,UAAU;CAExB,MAAM,iBAAiB,kBAAkB;EACvC,MAAM;EACN,OAAO;EACP,KAAK;CACN,EAAC;CAEF,MAAM,WAAW,aAAa;CAE9B,MAAM,MAAM,KAAK,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,KAAK,EAAE;AAErD,6BACG,KAAK;EAAI,KAAI;EAAO,SAAQ;EAAO,QAAO;;wBACxC;IAAI,WAAU;mCACZ;KAAK,SAAQ;KAAc,YAAW;eAAM;MAAS,sBACrD;KAAQ,MAAM,KAAK;oCACjB;MAAO,IAAG;MAAI,SAAQ;iBAAY,KAAE,KAAK;OAAgB;MAClD;KACN;wBACL;IAAI,WAAU;mCACZ;KAAK,SAAQ;KAAc,YAAW;eAAM;MAAmB,sBAC/D;KAAK,SAAQ;eAAe,eAAe,KAAK,UAAU;MAAQ;KAC/D;wBACL;IAAI,WAAU;mCACZ;KAAK,SAAQ;KAAc,YAAW;eAAM;MAAqB,sBACjE,mBAAO,MAAM,CAAC,aAAa,EAAE,KAAK,QAAQ,CAAC,GAAS;KACjD;wBACL;IAAI,WAAU;mCACZ;KAAK,SAAQ;KAAc,YAAW;eAAM;MAAe,sBAC3D;KAAK,SAAQ;eAAe,IAAI,UAAU;MAAQ;KAC/C;wBACL;IAAI,WAAU;IAAQ,WAAU;mCAC9B;KAAK,SAAQ;KAAc,YAAW;eAAM;MAAY,sBACxD;KAAK,SAAQ;eAAe,SAAS,KAAK,MAAM;MAAQ;KACrD;uBACL;IAAI,UAAS;IAAI,WAAU;kCACzB;KAAQ,MAAM,KAAK;mCACjB;MAAO,IAAG;MAAI,SAAQ;MAAU,MAAK;gBAAK;OAAqB;MACxD;KACN;;GACG;AAEd"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@websolutespa/bom-mixer-checkout",
3
- "version": "2.0.1-next.2",
3
+ "version": "3.0.1",
4
4
  "description": "Mixer Checkout module of the BOM Repository",
5
5
  "keywords": [
6
6
  "bom",
@@ -25,40 +25,45 @@
25
25
  },
26
26
  "dependencies": {},
27
27
  "peerDependencies": {
28
- "@websolutespa/bom-core": "2.0.1-next.2",
29
- "@websolutespa/bom-mixer-auth": "2.0.1-next.2",
30
- "@websolutespa/bom-mixer-emails": "2.0.1-next.2",
31
- "@websolutespa/bom-mixer-forms": "2.0.1-next.2",
32
- "@websolutespa/bom-mixer-hooks": "2.0.1-next.2",
33
- "@websolutespa/bom-mixer-icons": "2.0.1-next.2",
34
- "@websolutespa/bom-mixer-models": "2.0.1-next.2",
35
- "@websolutespa/bom-mixer-store": "2.0.1-next.2",
36
- "@websolutespa/bom-mixer-ui": "2.0.1-next.2",
37
- "next": "15.4.10",
38
- "react-dom": "19.2.1",
39
- "react": "19.2.1",
28
+ "@websolutespa/bom-core": "^3.0.1",
29
+ "@websolutespa/bom-mixer-auth": "^3.0.1",
30
+ "@websolutespa/bom-mixer-emails": "^3.0.1",
31
+ "@websolutespa/bom-mixer-forms": "^3.0.1",
32
+ "@websolutespa/bom-mixer-hooks": "^3.0.1",
33
+ "@websolutespa/bom-mixer-icons": "^3.0.1",
34
+ "@websolutespa/bom-mixer-models": "^3.0.2",
35
+ "@websolutespa/bom-mixer-store": "^3.0.1",
36
+ "@websolutespa/bom-mixer-ui": "^3.0.1",
37
+ "next": "16.1.6",
38
+ "react-dom": "19.2.3",
39
+ "react": "19.2.3",
40
40
  "styled-components": "5.3.11",
41
41
  "zustand": "4.5.7"
42
42
  },
43
43
  "devDependencies": {
44
- "@types/react-dom": "19.2.1",
45
- "@types/react": "19.2.1",
44
+ "@types/react-dom": "19.2.3",
45
+ "@types/react": "19.2.10",
46
46
  "@types/styled-components": "5.1.34",
47
- "@websolutespa/bom-cli": "2.0.1-next.2",
48
- "@websolutespa/test": "2.0.1-next.2",
49
- "@websolutespa/tsconfig": "2.0.1-next.2",
50
- "@websolutespa/eslint-config": "2.0.1-next.2",
47
+ "@websolutespa/bom-cli": "^3.0.1",
48
+ "@websolutespa/eslint-config": "^3.0.0",
49
+ "@websolutespa/test": "^3.0.1",
50
+ "@websolutespa/tsconfig": "^3.0.0",
51
51
  "eslint": "9.31.0",
52
52
  "npm-run-all": "4.1.5",
53
53
  "raw-loader": "4.0.2",
54
- "react-dom": "19.2.1",
55
- "react": "19.2.1",
54
+ "react-dom": "19.2.3",
55
+ "react": "19.2.3",
56
56
  "styled-components": "5.3.11",
57
57
  "typescript": "5.8.3",
58
58
  "vitest": "3.2.3"
59
59
  },
60
60
  "publishConfig": {
61
- "access": "public"
61
+ "access": "public",
62
+ "exports": {
63
+ ".": "./dist/index.js",
64
+ "./exports\\server": "./dist/exports\\server.js",
65
+ "./package.json": "./package.json"
66
+ }
62
67
  },
63
68
  "sideEffects": false,
64
69
  "type": "module",
@@ -95,6 +100,7 @@
95
100
  }
96
101
  }
97
102
  },
103
+ "module": "./dist/index.js",
98
104
  "types": "./dist/index.d.ts",
99
105
  "main": "./dist/index.js",
100
106
  "source": "./src/index.ts",
@@ -1,4 +1,4 @@
1
- import { act, renderHook } from '@testing-library/react-hooks';
1
+ import { act, renderHook } from '@testing-library/react';
2
2
  import { beforeEach, describe, expect, it, test, vi } from 'vitest';
3
3
  import { IArticle } from '../../models';
4
4
  import { CartProvider, useCart } from './useCart';
@@ -2,7 +2,9 @@ import { isObject } from '@websolutespa/bom-core';
2
2
  import { createContext, useContext, useEffect, useRef, useState } from 'react';
3
3
  import { createStore, useStore } from 'zustand';
4
4
  import { StateStorage, createJSONStorage, persist } from 'zustand/middleware';
5
- import { IArticle, ICartItem, ITenant } from '../../models';
5
+ import { IArticle } from '../../models/article/article';
6
+ import { ICartItem } from '../../models/cart/cart';
7
+ import { ITenant } from '../../models/tenant/tenant';
6
8
  import { useTenant } from '../useTenant/useTenant';
7
9
 
8
10
  type CartProps = {
@@ -2,7 +2,8 @@ import { IAddressOptions } from '@websolutespa/bom-mixer-models';
2
2
  import { createContext, useContext, useEffect, useRef, useState } from 'react';
3
3
  import { createStore, useStore } from 'zustand';
4
4
  import { StateStorage, createJSONStorage, persist } from 'zustand/middleware';
5
- import { ICheckoutPartial, ITenant } from '../../models';
5
+ import { ICheckoutPartial } from '../../models/checkout/checkout';
6
+ import { ITenant } from '../../models/tenant/tenant';
6
7
  import { useTenant } from '../useTenant/useTenant';
7
8
 
8
9
  type CheckoutInitialProps = Partial<
@@ -1,7 +1,7 @@
1
1
  import { createContext, useContext, useRef } from 'react';
2
2
  import { createStore, useStore } from 'zustand';
3
3
  import { StateStorage, createJSONStorage, persist } from 'zustand/middleware';
4
- import { ITenant } from '../../models';
4
+ import { ITenant } from '../../models/tenant/tenant';
5
5
 
6
6
  type TenantInitialProps = Partial<
7
7
  Omit<TenantProps, 'hydrated'>