@wix/headless-bookings 0.0.30 → 0.0.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/cjs/dist/react/core/payment/Payment.d.ts +193 -0
  2. package/cjs/dist/react/core/payment/Payment.js +202 -0
  3. package/cjs/dist/react/index.d.ts +2 -0
  4. package/cjs/dist/react/index.js +2 -0
  5. package/cjs/dist/react/payment/Payment.d.ts +342 -0
  6. package/cjs/dist/react/payment/Payment.js +294 -0
  7. package/cjs/dist/react/payment/PaymentLineItem.d.ts +144 -0
  8. package/cjs/dist/react/payment/PaymentLineItem.js +141 -0
  9. package/cjs/dist/services/index.d.ts +1 -0
  10. package/cjs/dist/services/index.js +1 -0
  11. package/cjs/dist/services/payment/payment.d.ts +32 -0
  12. package/cjs/dist/services/payment/payment.def.d.ts +66 -0
  13. package/cjs/dist/services/payment/payment.def.js +9 -0
  14. package/cjs/dist/services/payment/payment.js +167 -0
  15. package/cjs/dist/utils/money.d.ts +11 -0
  16. package/cjs/dist/utils/money.js +16 -0
  17. package/dist/react/core/payment/Payment.d.ts +193 -0
  18. package/dist/react/core/payment/Payment.js +202 -0
  19. package/dist/react/index.d.ts +2 -0
  20. package/dist/react/index.js +2 -0
  21. package/dist/react/payment/Payment.d.ts +342 -0
  22. package/dist/react/payment/Payment.js +294 -0
  23. package/dist/react/payment/PaymentLineItem.d.ts +144 -0
  24. package/dist/react/payment/PaymentLineItem.js +141 -0
  25. package/dist/services/index.d.ts +1 -0
  26. package/dist/services/index.js +1 -0
  27. package/dist/services/payment/payment.d.ts +32 -0
  28. package/dist/services/payment/payment.def.d.ts +66 -0
  29. package/dist/services/payment/payment.def.js +9 -0
  30. package/dist/services/payment/payment.js +167 -0
  31. package/dist/utils/money.d.ts +11 -0
  32. package/dist/utils/money.js +16 -0
  33. package/package.json +2 -2
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Core Payment Components
3
+ * Provides low-level access to PaymentService via render props
4
+ * Note: Currently supports single service only
5
+ */
6
+ import React from 'react';
7
+ import { type PaymentServiceConfig, type PaymentDetails, type SlotService } from '../../../services/payment/payment.js';
8
+ import type { MoneyData } from '@wix/headless-components/react';
9
+ /**
10
+ * Props for Payment.Root component
11
+ */
12
+ export interface RootProps {
13
+ children: React.ReactNode | ((props: {
14
+ isLoading: boolean;
15
+ hasError: boolean;
16
+ }) => React.ReactNode);
17
+ /** Service config - SSR only (paymentDetails) */
18
+ paymentServiceConfig?: PaymentServiceConfig;
19
+ /** Slot services for lazy loading (triggers API call) */
20
+ slotServices?: SlotService[];
21
+ /** Number of participants for lazy loading */
22
+ numberOfParticipants?: number;
23
+ }
24
+ /**
25
+ * Root component that provides payment context.
26
+ * Supports 3 modes:
27
+ * 1. SSR: paymentServiceConfig.paymentDetails - pre-fetched data
28
+ * 2. Lazy loading: slotServices + numberOfParticipants props - calls API on init
29
+ * 3. Reactive: no config/props - reads from BookingService signals
30
+ *
31
+ * @component
32
+ * @example
33
+ * ```tsx
34
+ * // SSR mode
35
+ * <Payment.Root paymentServiceConfig={{ paymentDetails }}>
36
+ * <Payment.Summary />
37
+ * </Payment.Root>
38
+ *
39
+ * // Lazy loading mode
40
+ * <Payment.Root slotServices={[...]} numberOfParticipants={2}>
41
+ * {({ isLoading }) => isLoading ? <div>Loading...</div> : <Payment.Summary />}
42
+ * </Payment.Root>
43
+ *
44
+ * // Reactive mode
45
+ * <Payment.Root>
46
+ * <Payment.Summary />
47
+ * </Payment.Root>
48
+ * ```
49
+ */
50
+ export declare function Root(props: RootProps): React.ReactNode;
51
+ /**
52
+ * Props for Payment render prop component
53
+ */
54
+ export interface PaymentProps {
55
+ children: (data: {
56
+ paymentDetails: PaymentDetails | null;
57
+ isLoading: boolean;
58
+ error: string | null;
59
+ }) => React.ReactNode;
60
+ }
61
+ /**
62
+ * Core component that provides access to full payment details via render props.
63
+ *
64
+ * @component
65
+ * @example
66
+ * ```tsx
67
+ * <Payment.Payment>
68
+ * {({ paymentDetails, isLoading, error }) => (
69
+ * isLoading ? <div>Loading...</div> : <div>{JSON.stringify(paymentDetails)}</div>
70
+ * )}
71
+ * </Payment.Payment>
72
+ * ```
73
+ */
74
+ export declare function Payment(props: PaymentProps): React.ReactNode;
75
+ /**
76
+ * Props for Summary render prop component
77
+ */
78
+ export interface SummaryProps {
79
+ children: (data: {
80
+ subtotal: MoneyData | null;
81
+ total: MoneyData | null;
82
+ currency: string;
83
+ tax: MoneyData | null;
84
+ hasTax: boolean;
85
+ discount: MoneyData | null;
86
+ hasDiscount: boolean;
87
+ payNow: MoneyData | null;
88
+ payLater: MoneyData | null;
89
+ isDeposit: boolean;
90
+ }) => React.ReactNode;
91
+ }
92
+ /**
93
+ * Core component that provides access to payment summary totals via render props.
94
+ * Returns all pricing totals with MoneyData format for the Money component.
95
+ * Use data-attributes for conditional visibility via CSS.
96
+ *
97
+ * @component
98
+ * @example
99
+ * ```tsx
100
+ * <Payment.Summary>
101
+ * {({ subtotal, tax, total, hasTax, hasDiscount, discount, isDeposit, payNow }) => (
102
+ * <div>
103
+ * <div>Subtotal: <Money money={subtotal} /></div>
104
+ * <div data-has-tax={hasTax}>Tax: <Money money={tax} /></div>
105
+ * <div data-has-discount={hasDiscount}>Discount: <Money money={discount} /></div>
106
+ * <div>Total: <Money money={total} /></div>
107
+ * <div data-has-deposit={isDeposit}>Pay Now: <Money money={payNow} /></div>
108
+ * </div>
109
+ * )}
110
+ * </Payment.Summary>
111
+ * ```
112
+ */
113
+ export declare function Summary(props: SummaryProps): React.ReactNode;
114
+ import type { CalculatedLineItem as ApiCalculatedLineItem } from '@wix/auto_sdk_ecom_totals-calculator';
115
+ import type { LineItemAdditionalInfo } from '../../../services/payment/payment.js';
116
+ /**
117
+ * Combined line item with SDK data and additional computed info
118
+ */
119
+ export interface CombinedLineItem {
120
+ /** SDK line item data */
121
+ sdkLineItem: ApiCalculatedLineItem;
122
+ /** Additional computed info */
123
+ additionalInfo: LineItemAdditionalInfo | undefined;
124
+ }
125
+ /**
126
+ * Props for LineItems render prop component
127
+ */
128
+ export interface LineItemsProps {
129
+ children: (data: {
130
+ lineItems: CombinedLineItem[];
131
+ hasLineItems: boolean;
132
+ currency: string;
133
+ }) => React.ReactNode;
134
+ }
135
+ /**
136
+ * Core component that provides access to calculated line items via render props.
137
+ * Combines SDK line items with additional computed info.
138
+ * Note: Currently supports single service only (always 1 line item).
139
+ *
140
+ * @component
141
+ * @example
142
+ * ```tsx
143
+ * <Payment.LineItems>
144
+ * {({ lineItems, hasLineItems, currency }) => (
145
+ * <ul data-has-items={hasLineItems}>
146
+ * {lineItems.map((item) => (
147
+ * <Payment.LineItem key={item.sdkLineItem.lineItemId} lineItem={item} currency={currency}>
148
+ * {({ totalPriceAfterTaxAndDiscount }) => (
149
+ * <li><Money money={totalPriceAfterTaxAndDiscount} /></li>
150
+ * )}
151
+ * </Payment.LineItem>
152
+ * ))}
153
+ * </ul>
154
+ * )}
155
+ * </Payment.LineItems>
156
+ * ```
157
+ */
158
+ export declare function LineItems(props: LineItemsProps): React.ReactNode;
159
+ /**
160
+ * Props for LineItem render prop component
161
+ */
162
+ export interface LineItemProps {
163
+ lineItem: CombinedLineItem;
164
+ currency: string;
165
+ children: (data: {
166
+ totalPrice: MoneyData | null;
167
+ subtotal: MoneyData | null;
168
+ tax: MoneyData | null;
169
+ discount: MoneyData | null;
170
+ deposit: MoneyData | null;
171
+ priceText: string | null;
172
+ }) => React.ReactNode;
173
+ }
174
+ /**
175
+ * Core component that provides access to a single line item via render props.
176
+ * Use data-attributes for conditional visibility via CSS.
177
+ *
178
+ * @component
179
+ * @example
180
+ * ```tsx
181
+ * <Payment.LineItem lineItem={item} currency="USD">
182
+ * {({ totalPrice, subtotal, tax, discount, deposit, priceText }) => (
183
+ * <div>
184
+ * <span><Money money={totalPrice} /></span>
185
+ * <span data-has-discount={!!discount?.amount}><Money money={discount} /></span>
186
+ * <span data-has-deposit={!!deposit?.amount}><Money money={deposit} /></span>
187
+ * <span data-has-price-text={!!priceText}>{priceText}</span>
188
+ * </div>
189
+ * )}
190
+ * </Payment.LineItem>
191
+ * ```
192
+ */
193
+ export declare function LineItem(props: LineItemProps): React.ReactNode;
@@ -0,0 +1,202 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { WixServices, useService } from '@wix/services-manager-react';
3
+ import { createServicesMap } from '@wix/services-manager';
4
+ import { PaymentServiceDefinition, PaymentService, } from '../../../services/payment/payment.js';
5
+ import { convertMultiCurrencyPriceToMoneyData } from '../../../utils/money.js';
6
+ /**
7
+ * Internal content component that reads from service
8
+ */
9
+ function RootContent({ children, }) {
10
+ const paymentService = useService(PaymentServiceDefinition);
11
+ const isLoading = paymentService.isLoadingSignal.get();
12
+ const error = paymentService.errorSignal.get();
13
+ const hasError = !!error;
14
+ if (typeof children === 'function') {
15
+ return children({ isLoading, hasError });
16
+ }
17
+ return children;
18
+ }
19
+ /**
20
+ * Root component that provides payment context.
21
+ * Supports 3 modes:
22
+ * 1. SSR: paymentServiceConfig.paymentDetails - pre-fetched data
23
+ * 2. Lazy loading: slotServices + numberOfParticipants props - calls API on init
24
+ * 3. Reactive: no config/props - reads from BookingService signals
25
+ *
26
+ * @component
27
+ * @example
28
+ * ```tsx
29
+ * // SSR mode
30
+ * <Payment.Root paymentServiceConfig={{ paymentDetails }}>
31
+ * <Payment.Summary />
32
+ * </Payment.Root>
33
+ *
34
+ * // Lazy loading mode
35
+ * <Payment.Root slotServices={[...]} numberOfParticipants={2}>
36
+ * {({ isLoading }) => isLoading ? <div>Loading...</div> : <Payment.Summary />}
37
+ * </Payment.Root>
38
+ *
39
+ * // Reactive mode
40
+ * <Payment.Root>
41
+ * <Payment.Summary />
42
+ * </Payment.Root>
43
+ * ```
44
+ */
45
+ export function Root(props) {
46
+ const { children, paymentServiceConfig = {}, slotServices, numberOfParticipants } = props;
47
+ // Merge public config with lazy loading props into internal config
48
+ const internalConfig = {
49
+ ...paymentServiceConfig,
50
+ slotServices,
51
+ numberOfParticipants,
52
+ };
53
+ return (_jsx(WixServices, { servicesMap: createServicesMap().addService(PaymentServiceDefinition, PaymentService, internalConfig), children: _jsx(RootContent, { children: children }) }));
54
+ }
55
+ /**
56
+ * Core component that provides access to full payment details via render props.
57
+ *
58
+ * @component
59
+ * @example
60
+ * ```tsx
61
+ * <Payment.Payment>
62
+ * {({ paymentDetails, isLoading, error }) => (
63
+ * isLoading ? <div>Loading...</div> : <div>{JSON.stringify(paymentDetails)}</div>
64
+ * )}
65
+ * </Payment.Payment>
66
+ * ```
67
+ */
68
+ export function Payment(props) {
69
+ const paymentService = useService(PaymentServiceDefinition);
70
+ const paymentDetails = paymentService.paymentDetailsSignal.get();
71
+ const isLoading = paymentService.isLoadingSignal.get();
72
+ const error = paymentService.errorSignal.get();
73
+ return props.children({ paymentDetails, isLoading, error });
74
+ }
75
+ /**
76
+ * Core component that provides access to payment summary totals via render props.
77
+ * Returns all pricing totals with MoneyData format for the Money component.
78
+ * Use data-attributes for conditional visibility via CSS.
79
+ *
80
+ * @component
81
+ * @example
82
+ * ```tsx
83
+ * <Payment.Summary>
84
+ * {({ subtotal, tax, total, hasTax, hasDiscount, discount, isDeposit, payNow }) => (
85
+ * <div>
86
+ * <div>Subtotal: <Money money={subtotal} /></div>
87
+ * <div data-has-tax={hasTax}>Tax: <Money money={tax} /></div>
88
+ * <div data-has-discount={hasDiscount}>Discount: <Money money={discount} /></div>
89
+ * <div>Total: <Money money={total} /></div>
90
+ * <div data-has-deposit={isDeposit}>Pay Now: <Money money={payNow} /></div>
91
+ * </div>
92
+ * )}
93
+ * </Payment.Summary>
94
+ * ```
95
+ */
96
+ export function Summary(props) {
97
+ const paymentService = useService(PaymentServiceDefinition);
98
+ const paymentDetails = paymentService.paymentDetailsSignal.get();
99
+ const currency = paymentDetails?.response?.currency || 'USD';
100
+ const priceSummary = paymentDetails?.response?.priceSummary;
101
+ // Always present
102
+ const subtotal = convertMultiCurrencyPriceToMoneyData(priceSummary?.subtotal, currency);
103
+ const total = convertMultiCurrencyPriceToMoneyData(priceSummary?.total, currency);
104
+ // May or may not exist
105
+ const tax = convertMultiCurrencyPriceToMoneyData(priceSummary?.tax, currency);
106
+ const hasTax = tax !== null && tax.amount > 0;
107
+ const discount = convertMultiCurrencyPriceToMoneyData(priceSummary?.discount, currency);
108
+ const hasDiscount = discount !== null && discount.amount > 0;
109
+ // Deposit scenarios only
110
+ const payNow = convertMultiCurrencyPriceToMoneyData(paymentDetails?.response?.payNow?.total, currency);
111
+ const payLater = convertMultiCurrencyPriceToMoneyData(paymentDetails?.response?.payLater?.total, currency);
112
+ const isDeposit = payNow !== null && total !== null && payNow.amount < total.amount;
113
+ return props.children({
114
+ subtotal,
115
+ total,
116
+ currency,
117
+ tax,
118
+ hasTax,
119
+ discount,
120
+ hasDiscount,
121
+ payNow,
122
+ payLater,
123
+ isDeposit,
124
+ });
125
+ }
126
+ /**
127
+ * Core component that provides access to calculated line items via render props.
128
+ * Combines SDK line items with additional computed info.
129
+ * Note: Currently supports single service only (always 1 line item).
130
+ *
131
+ * @component
132
+ * @example
133
+ * ```tsx
134
+ * <Payment.LineItems>
135
+ * {({ lineItems, hasLineItems, currency }) => (
136
+ * <ul data-has-items={hasLineItems}>
137
+ * {lineItems.map((item) => (
138
+ * <Payment.LineItem key={item.sdkLineItem.lineItemId} lineItem={item} currency={currency}>
139
+ * {({ totalPriceAfterTaxAndDiscount }) => (
140
+ * <li><Money money={totalPriceAfterTaxAndDiscount} /></li>
141
+ * )}
142
+ * </Payment.LineItem>
143
+ * ))}
144
+ * </ul>
145
+ * )}
146
+ * </Payment.LineItems>
147
+ * ```
148
+ */
149
+ export function LineItems(props) {
150
+ const paymentService = useService(PaymentServiceDefinition);
151
+ const paymentDetails = paymentService.paymentDetailsSignal.get();
152
+ const sdkLineItems = paymentDetails?.response?.calculatedLineItems || [];
153
+ const additionalInfoList = paymentDetails?.additionalInfo?.lineItems || [];
154
+ const currency = paymentDetails?.response?.currency || 'USD';
155
+ // Combine SDK line items with additional info
156
+ const lineItems = sdkLineItems.map((sdkLineItem) => ({
157
+ sdkLineItem,
158
+ additionalInfo: additionalInfoList.find((info) => info.lineItemId === sdkLineItem.lineItemId),
159
+ }));
160
+ const hasLineItems = lineItems.length > 0;
161
+ return props.children({ lineItems, hasLineItems, currency });
162
+ }
163
+ /**
164
+ * Core component that provides access to a single line item via render props.
165
+ * Use data-attributes for conditional visibility via CSS.
166
+ *
167
+ * @component
168
+ * @example
169
+ * ```tsx
170
+ * <Payment.LineItem lineItem={item} currency="USD">
171
+ * {({ totalPrice, subtotal, tax, discount, deposit, priceText }) => (
172
+ * <div>
173
+ * <span><Money money={totalPrice} /></span>
174
+ * <span data-has-discount={!!discount?.amount}><Money money={discount} /></span>
175
+ * <span data-has-deposit={!!deposit?.amount}><Money money={deposit} /></span>
176
+ * <span data-has-price-text={!!priceText}>{priceText}</span>
177
+ * </div>
178
+ * )}
179
+ * </Payment.LineItem>
180
+ * ```
181
+ */
182
+ export function LineItem(props) {
183
+ const { lineItem, currency, children } = props;
184
+ const { sdkLineItem, additionalInfo } = lineItem;
185
+ const pricesBreakdown = sdkLineItem?.pricesBreakdown;
186
+ // Prices (from SDK)
187
+ const totalPrice = convertMultiCurrencyPriceToMoneyData(pricesBreakdown?.totalPriceAfterTax, currency);
188
+ const subtotal = convertMultiCurrencyPriceToMoneyData(pricesBreakdown?.fullPrice, currency);
189
+ const tax = convertMultiCurrencyPriceToMoneyData(pricesBreakdown?.taxDetails?.totalTax, currency);
190
+ const discount = convertMultiCurrencyPriceToMoneyData(pricesBreakdown?.totalDiscount, currency);
191
+ const deposit = convertMultiCurrencyPriceToMoneyData(pricesBreakdown?.depositAmount, currency);
192
+ // Custom price text (for CUSTOM rate type)
193
+ const priceText = additionalInfo?.priceText || null;
194
+ return children({
195
+ totalPrice,
196
+ subtotal,
197
+ tax,
198
+ discount,
199
+ deposit,
200
+ priceText,
201
+ });
202
+ }
@@ -5,3 +5,5 @@ export * as ServiceMedia from './service/ServiceMedia.js';
5
5
  export * as TimeSlotList from './time-slot-list/TimeSlotList.js';
6
6
  export * as ServiceList from './service-list/ServiceList.js';
7
7
  export * as Location from './location/Location.js';
8
+ export * as Payment from './payment/Payment.js';
9
+ export * as PaymentLineItem from './payment/PaymentLineItem.js';
@@ -5,3 +5,5 @@ export * as ServiceMedia from './service/ServiceMedia.js';
5
5
  export * as TimeSlotList from './time-slot-list/TimeSlotList.js';
6
6
  export * as ServiceList from './service-list/ServiceList.js';
7
7
  export * as Location from './location/Location.js';
8
+ export * as Payment from './payment/Payment.js';
9
+ export * as PaymentLineItem from './payment/PaymentLineItem.js';