@tagadapay/plugin-sdk 3.1.11 → 3.1.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1129 -1129
- package/build-cdn.js +231 -228
- package/dist/data/iso3166.d.ts +23 -33
- package/dist/data/iso3166.js +134 -198
- package/dist/data/languages.d.ts +5 -64
- package/dist/data/languages.js +23 -143
- package/dist/external-tracker.js +968 -102
- package/dist/external-tracker.min.js +2 -2
- package/dist/external-tracker.min.js.map +4 -4
- package/dist/react/hooks/useISOData.js +1 -1
- package/dist/react/hooks/usePaymentPolling.d.ts +3 -3
- package/dist/react/hooks/useShippingRates.d.ts +6 -0
- package/dist/react/hooks/useShippingRates.js +38 -0
- package/dist/react/providers/TagadaProvider.js +5 -5
- package/dist/react/services/apiService.d.ts +21 -0
- package/dist/react/services/apiService.js +10 -0
- package/dist/tagada-sdk.js +2079 -179
- package/dist/tagada-sdk.min.js +4 -2
- package/dist/tagada-sdk.min.js.map +4 -4
- package/dist/v2/core/client.d.ts +4 -2
- package/dist/v2/core/client.js +4 -3
- package/dist/v2/core/errors.d.ts +75 -0
- package/dist/v2/core/errors.js +104 -0
- package/dist/v2/core/funnelClient.d.ts +16 -15
- package/dist/v2/core/funnelClient.js +1 -1
- package/dist/v2/core/index.d.ts +1 -0
- package/dist/v2/core/index.js +2 -0
- package/dist/v2/core/pixelMapping.d.ts +49 -0
- package/dist/v2/core/pixelMapping.js +325 -0
- package/dist/v2/core/resources/apiClient.d.ts +2 -0
- package/dist/v2/core/resources/apiClient.js +52 -9
- package/dist/v2/core/resources/checkout.d.ts +89 -30
- package/dist/v2/core/resources/checkout.js +8 -0
- package/dist/v2/core/resources/customer.d.ts +20 -19
- package/dist/v2/core/resources/funnel.d.ts +17 -17
- package/dist/v2/core/resources/payments.d.ts +84 -13
- package/dist/v2/core/resources/payments.js +26 -9
- package/dist/v2/core/resources/shippingRates.d.ts +15 -0
- package/dist/v2/core/resources/shippingRates.js +11 -0
- package/dist/v2/core/types.d.ts +50 -12
- package/dist/v2/core/types.js +0 -3
- package/dist/v2/core/utils/checkout.d.ts +2 -2
- package/dist/v2/core/utils/checkout.js +7 -2
- package/dist/v2/core/utils/order.d.ts +11 -9
- package/dist/v2/core/utils/previewModeIndicator.js +101 -101
- package/dist/v2/index.d.ts +4 -2
- package/dist/v2/index.js +1 -1
- package/dist/v2/react/components/ApplePayButton.js +13 -4
- package/dist/v2/react/components/FunnelScriptInjector.js +51 -30
- package/dist/v2/react/components/WhopCheckout.d.ts +24 -0
- package/dist/v2/react/components/WhopCheckout.js +231 -0
- package/dist/v2/react/hooks/__examples__/FunnelContextExample.js +1 -1
- package/dist/v2/react/hooks/payment-actions/useAirwallexRadarAction.d.ts +14 -0
- package/dist/v2/react/hooks/payment-actions/useAirwallexRadarAction.js +181 -0
- package/dist/v2/react/hooks/payment-actions/useErrorAction.d.ts +9 -0
- package/dist/v2/react/hooks/payment-actions/useErrorAction.js +21 -0
- package/dist/v2/react/hooks/payment-actions/useFinixRadarAction.d.ts +14 -0
- package/dist/v2/react/hooks/payment-actions/useFinixRadarAction.js +187 -0
- package/dist/v2/react/hooks/payment-actions/useKessPayAction.d.ts +11 -0
- package/dist/v2/react/hooks/payment-actions/useKessPayAction.js +91 -0
- package/dist/v2/react/hooks/payment-actions/useMasterCardAction.d.ts +24 -0
- package/dist/v2/react/hooks/payment-actions/useMasterCardAction.js +221 -0
- package/dist/v2/react/hooks/payment-actions/usePaymentActionHandler.d.ts +15 -0
- package/dist/v2/react/hooks/payment-actions/usePaymentActionHandler.js +142 -0
- package/dist/v2/react/hooks/payment-actions/useProcessorAuthAction.d.ts +3 -0
- package/dist/v2/react/hooks/payment-actions/useProcessorAuthAction.js +13 -0
- package/dist/v2/react/hooks/payment-actions/useRedirectAction.d.ts +10 -0
- package/dist/v2/react/hooks/payment-actions/useRedirectAction.js +35 -0
- package/dist/v2/react/hooks/payment-actions/useStripeRadarAction.d.ts +14 -0
- package/dist/v2/react/hooks/payment-actions/useStripeRadarAction.js +192 -0
- package/dist/v2/react/hooks/payment-actions/useThreedsAuthAction.d.ts +14 -0
- package/dist/v2/react/hooks/payment-actions/useThreedsAuthAction.js +81 -0
- package/dist/v2/react/hooks/payment-actions/useTrustFlowAction.d.ts +11 -0
- package/dist/v2/react/hooks/payment-actions/useTrustFlowAction.js +84 -0
- package/dist/v2/react/hooks/payment-processing/usePaymentInstruments.d.ts +14 -0
- package/dist/v2/react/hooks/payment-processing/usePaymentInstruments.js +36 -0
- package/dist/v2/react/hooks/payment-processing/usePaymentProcessors.d.ts +31 -0
- package/dist/v2/react/hooks/payment-processing/usePaymentProcessors.js +212 -0
- package/dist/v2/react/hooks/payment-redirect/useAirwallex3dsReturn.d.ts +14 -0
- package/dist/v2/react/hooks/payment-redirect/useAirwallex3dsReturn.js +207 -0
- package/dist/v2/react/hooks/payment-redirect/useGenericPaymentReturn.d.ts +12 -0
- package/dist/v2/react/hooks/payment-redirect/useGenericPaymentReturn.js +101 -0
- package/dist/v2/react/hooks/useCheckoutQuery.d.ts +6 -0
- package/dist/v2/react/hooks/useCheckoutQuery.js +45 -0
- package/dist/v2/react/hooks/useFunnel.d.ts +1 -2
- package/dist/v2/react/hooks/useGeoLocation.d.ts +2 -1
- package/dist/v2/react/hooks/useGeoLocation.js +4 -2
- package/dist/v2/react/hooks/useGoogleAutocomplete.js +82 -33
- package/dist/v2/react/hooks/useISOData.js +1 -1
- package/dist/v2/react/hooks/usePaymentPolling.d.ts +3 -3
- package/dist/v2/react/hooks/usePaymentQuery.d.ts +18 -5
- package/dist/v2/react/hooks/usePaymentQuery.js +63 -1015
- package/dist/v2/react/hooks/usePaymentRetrieve.d.ts +3 -2
- package/dist/v2/react/hooks/usePaymentRetrieve.js +3 -1
- package/dist/v2/react/hooks/usePixelTracking.d.ts +5 -43
- package/dist/v2/react/hooks/usePixelTracking.js +213 -407
- package/dist/v2/react/hooks/useShippingRatesQuery.d.ts +6 -0
- package/dist/v2/react/hooks/useShippingRatesQuery.js +47 -4
- package/dist/v2/react/hooks/useStepConfig.d.ts +2 -8
- package/dist/v2/react/hooks/useStepConfig.js +1 -1
- package/dist/v2/react/hooks/useWhopPaymentPolling.d.ts +30 -0
- package/dist/v2/react/hooks/useWhopPaymentPolling.js +61 -0
- package/dist/v2/react/index.d.ts +7 -0
- package/dist/v2/react/index.js +4 -0
- package/dist/v2/react/providers/ExpressPaymentMethodsProvider.d.ts +2 -1
- package/dist/v2/react/providers/ExpressPaymentMethodsProvider.js +3 -1
- package/dist/v2/react/providers/TagadaProvider.js +76 -7
- package/dist/v2/standalone/external-tracker.d.ts +52 -46
- package/dist/v2/standalone/external-tracker.js +205 -98
- package/dist/v2/standalone/index.d.ts +22 -0
- package/dist/v2/standalone/index.js +125 -0
- package/package.json +112 -112
- package/dist/react/utils/__tests__/urlUtils.test.d.ts +0 -1
- package/dist/react/utils/__tests__/urlUtils.test.js +0 -189
- package/dist/v2/core/__tests__/pathRemapping.test.d.ts +0 -11
- package/dist/v2/core/__tests__/pathRemapping.test.js +0 -776
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Order Utility Functions
|
|
3
3
|
* Pure functions for order data manipulation
|
|
4
4
|
*/
|
|
5
|
+
import type { OrderSummary, PromotionSummary, PaymentSummary, Subscription, OrderAddress } from '../types';
|
|
5
6
|
export interface OrderLineItem {
|
|
6
7
|
id: string;
|
|
7
8
|
orderId: string;
|
|
@@ -95,7 +96,7 @@ export interface Order {
|
|
|
95
96
|
paymentInstrumentId: string;
|
|
96
97
|
refundedAt?: string | null;
|
|
97
98
|
refundedAmount?: number | null;
|
|
98
|
-
metadata?:
|
|
99
|
+
metadata?: Record<string, unknown>;
|
|
99
100
|
customer?: {
|
|
100
101
|
id: string;
|
|
101
102
|
email: string;
|
|
@@ -105,27 +106,28 @@ export interface Order {
|
|
|
105
106
|
lastOrderId: string;
|
|
106
107
|
accountId: string;
|
|
107
108
|
storeId: string;
|
|
108
|
-
billingAddress?:
|
|
109
|
-
shippingAddress?:
|
|
109
|
+
billingAddress?: OrderAddress | null;
|
|
110
|
+
shippingAddress?: OrderAddress | null;
|
|
110
111
|
currency: string;
|
|
111
112
|
locale: string;
|
|
112
113
|
draft: boolean;
|
|
113
114
|
acceptsMarketing: boolean;
|
|
114
115
|
createdAt: string;
|
|
115
116
|
updatedAt: string;
|
|
116
|
-
metadata?:
|
|
117
|
+
metadata?: Record<string, unknown>;
|
|
117
118
|
device?: Record<string, unknown> | null;
|
|
118
119
|
};
|
|
119
120
|
items: OrderLineItem[];
|
|
120
|
-
summaries?:
|
|
121
|
-
promotions?:
|
|
121
|
+
summaries?: OrderSummary[];
|
|
122
|
+
promotions?: PromotionSummary[];
|
|
122
123
|
checkoutSession?: {
|
|
123
124
|
id: string;
|
|
124
125
|
selectedPresentmentCurrency?: string;
|
|
125
|
-
|
|
126
|
+
returnUrl?: string;
|
|
127
|
+
[key: string]: unknown;
|
|
126
128
|
};
|
|
127
|
-
payments?:
|
|
128
|
-
subscriptions?:
|
|
129
|
+
payments?: PaymentSummary[];
|
|
130
|
+
subscriptions?: Subscription[];
|
|
129
131
|
store?: {
|
|
130
132
|
name: string;
|
|
131
133
|
chargeCurrencies: string[];
|
|
@@ -212,143 +212,143 @@ export function injectPreviewModeIndicator() {
|
|
|
212
212
|
// Create container
|
|
213
213
|
const container = document.createElement('div');
|
|
214
214
|
container.id = 'tgd-preview-indicator';
|
|
215
|
-
container.style.cssText = `
|
|
216
|
-
position: fixed;
|
|
217
|
-
bottom: 16px;
|
|
218
|
-
right: 16px;
|
|
219
|
-
z-index: 999999;
|
|
220
|
-
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
215
|
+
container.style.cssText = `
|
|
216
|
+
position: fixed;
|
|
217
|
+
bottom: 16px;
|
|
218
|
+
right: 16px;
|
|
219
|
+
z-index: 999999;
|
|
220
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
221
221
|
`;
|
|
222
222
|
// Create badge
|
|
223
223
|
const badge = document.createElement('div');
|
|
224
|
-
badge.style.cssText = `
|
|
225
|
-
background: ${draftMode ? '#ff9500' : '#007aff'};
|
|
226
|
-
color: white;
|
|
227
|
-
padding: 8px 12px;
|
|
228
|
-
border-radius: 8px;
|
|
229
|
-
font-size: 13px;
|
|
230
|
-
font-weight: 600;
|
|
231
|
-
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
|
|
232
|
-
cursor: pointer;
|
|
233
|
-
transition: all 0.2s ease;
|
|
234
|
-
display: flex;
|
|
235
|
-
align-items: center;
|
|
236
|
-
gap: 6px;
|
|
224
|
+
badge.style.cssText = `
|
|
225
|
+
background: ${draftMode ? '#ff9500' : '#007aff'};
|
|
226
|
+
color: white;
|
|
227
|
+
padding: 8px 12px;
|
|
228
|
+
border-radius: 8px;
|
|
229
|
+
font-size: 13px;
|
|
230
|
+
font-weight: 600;
|
|
231
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
|
|
232
|
+
cursor: pointer;
|
|
233
|
+
transition: all 0.2s ease;
|
|
234
|
+
display: flex;
|
|
235
|
+
align-items: center;
|
|
236
|
+
gap: 6px;
|
|
237
237
|
`;
|
|
238
|
-
badge.innerHTML = `
|
|
239
|
-
<span style="font-size: 16px;">🔍</span>
|
|
240
|
-
<span>${draftMode ? 'Preview Mode' : 'Dev Mode'}</span>
|
|
238
|
+
badge.innerHTML = `
|
|
239
|
+
<span style="font-size: 16px;">🔍</span>
|
|
240
|
+
<span>${draftMode ? 'Preview Mode' : 'Dev Mode'}</span>
|
|
241
241
|
`;
|
|
242
242
|
// Create details popup (with padding-top to bridge gap with badge)
|
|
243
243
|
const details = document.createElement('div');
|
|
244
|
-
details.style.cssText = `
|
|
245
|
-
position: absolute;
|
|
246
|
-
bottom: calc(100% + 8px);
|
|
247
|
-
right: 0;
|
|
248
|
-
background: white;
|
|
249
|
-
border: 1px solid #e5e5e5;
|
|
250
|
-
border-radius: 8px;
|
|
251
|
-
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
|
252
|
-
padding: 12px;
|
|
253
|
-
min-width: 250px;
|
|
254
|
-
font-size: 12px;
|
|
255
|
-
line-height: 1.5;
|
|
256
|
-
display: none;
|
|
244
|
+
details.style.cssText = `
|
|
245
|
+
position: absolute;
|
|
246
|
+
bottom: calc(100% + 8px);
|
|
247
|
+
right: 0;
|
|
248
|
+
background: white;
|
|
249
|
+
border: 1px solid #e5e5e5;
|
|
250
|
+
border-radius: 8px;
|
|
251
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
|
252
|
+
padding: 12px;
|
|
253
|
+
min-width: 250px;
|
|
254
|
+
font-size: 12px;
|
|
255
|
+
line-height: 1.5;
|
|
256
|
+
display: none;
|
|
257
257
|
`;
|
|
258
258
|
details.style.paddingTop = '20px'; // Extra padding to bridge the gap
|
|
259
259
|
// Add invisible bridge between badge and popup to prevent flickering
|
|
260
260
|
const bridge = document.createElement('div');
|
|
261
|
-
bridge.style.cssText = `
|
|
262
|
-
position: absolute;
|
|
263
|
-
bottom: 100%;
|
|
264
|
-
left: 0;
|
|
265
|
-
right: 0;
|
|
266
|
-
height: 8px;
|
|
267
|
-
display: none;
|
|
261
|
+
bridge.style.cssText = `
|
|
262
|
+
position: absolute;
|
|
263
|
+
bottom: 100%;
|
|
264
|
+
left: 0;
|
|
265
|
+
right: 0;
|
|
266
|
+
height: 8px;
|
|
267
|
+
display: none;
|
|
268
268
|
`;
|
|
269
269
|
// Build details content
|
|
270
270
|
let detailsHTML = '<div style="margin-bottom: 8px; font-weight: 600; color: #1d1d1f;">Current Environment</div>';
|
|
271
271
|
detailsHTML += '<div style="display: flex; flex-direction: column; gap: 6px;">';
|
|
272
272
|
if (draftMode) {
|
|
273
|
-
detailsHTML += `
|
|
274
|
-
<div style="display: flex; justify-content: space-between; color: #86868b;">
|
|
275
|
-
<span>Draft Mode:</span>
|
|
276
|
-
<span style="color: #ff9500; font-weight: 600;">ON</span>
|
|
277
|
-
</div>
|
|
273
|
+
detailsHTML += `
|
|
274
|
+
<div style="display: flex; justify-content: space-between; color: #86868b;">
|
|
275
|
+
<span>Draft Mode:</span>
|
|
276
|
+
<span style="color: #ff9500; font-weight: 600;">ON</span>
|
|
277
|
+
</div>
|
|
278
278
|
`;
|
|
279
279
|
}
|
|
280
280
|
if (trackingDisabled) {
|
|
281
|
-
detailsHTML += `
|
|
282
|
-
<div style="display: flex; justify-content: space-between; color: #86868b;">
|
|
283
|
-
<span>Tracking:</span>
|
|
284
|
-
<span style="color: #ff3b30; font-weight: 600;">DISABLED</span>
|
|
285
|
-
</div>
|
|
281
|
+
detailsHTML += `
|
|
282
|
+
<div style="display: flex; justify-content: space-between; color: #86868b;">
|
|
283
|
+
<span>Tracking:</span>
|
|
284
|
+
<span style="color: #ff3b30; font-weight: 600;">DISABLED</span>
|
|
285
|
+
</div>
|
|
286
286
|
`;
|
|
287
287
|
}
|
|
288
288
|
if (params.funnelEnv) {
|
|
289
|
-
detailsHTML += `
|
|
290
|
-
<div style="display: flex; justify-content: space-between; color: #86868b;">
|
|
291
|
-
<span>Funnel Env:</span>
|
|
292
|
-
<span style="color: #1d1d1f; font-weight: 600; font-family: monospace; font-size: 11px;">
|
|
293
|
-
${params.funnelEnv}
|
|
294
|
-
</span>
|
|
295
|
-
</div>
|
|
289
|
+
detailsHTML += `
|
|
290
|
+
<div style="display: flex; justify-content: space-between; color: #86868b;">
|
|
291
|
+
<span>Funnel Env:</span>
|
|
292
|
+
<span style="color: #1d1d1f; font-weight: 600; font-family: monospace; font-size: 11px;">
|
|
293
|
+
${params.funnelEnv}
|
|
294
|
+
</span>
|
|
295
|
+
</div>
|
|
296
296
|
`;
|
|
297
297
|
}
|
|
298
298
|
if (params.tagadaClientEnv) {
|
|
299
|
-
detailsHTML += `
|
|
300
|
-
<div style="display: flex; justify-content: space-between; color: #86868b;">
|
|
301
|
-
<span>API Env:</span>
|
|
302
|
-
<span style="color: #1d1d1f; font-weight: 600; font-family: monospace; font-size: 11px;">
|
|
303
|
-
${params.tagadaClientEnv}
|
|
304
|
-
</span>
|
|
305
|
-
</div>
|
|
299
|
+
detailsHTML += `
|
|
300
|
+
<div style="display: flex; justify-content: space-between; color: #86868b;">
|
|
301
|
+
<span>API Env:</span>
|
|
302
|
+
<span style="color: #1d1d1f; font-weight: 600; font-family: monospace; font-size: 11px;">
|
|
303
|
+
${params.tagadaClientEnv}
|
|
304
|
+
</span>
|
|
305
|
+
</div>
|
|
306
306
|
`;
|
|
307
307
|
}
|
|
308
308
|
if (params.tagadaClientBaseUrl) {
|
|
309
|
-
detailsHTML += `
|
|
310
|
-
<div style="color: #86868b;">
|
|
311
|
-
<div style="margin-bottom: 4px;">API URL:</div>
|
|
312
|
-
<div style="color: #1d1d1f; font-weight: 600; font-family: monospace; font-size: 10px; word-break: break-all; background: #f5f5f7; padding: 4px 6px; border-radius: 4px;">
|
|
313
|
-
${params.tagadaClientBaseUrl}
|
|
314
|
-
</div>
|
|
315
|
-
</div>
|
|
309
|
+
detailsHTML += `
|
|
310
|
+
<div style="color: #86868b;">
|
|
311
|
+
<div style="margin-bottom: 4px;">API URL:</div>
|
|
312
|
+
<div style="color: #1d1d1f; font-weight: 600; font-family: monospace; font-size: 10px; word-break: break-all; background: #f5f5f7; padding: 4px 6px; border-radius: 4px;">
|
|
313
|
+
${params.tagadaClientBaseUrl}
|
|
314
|
+
</div>
|
|
315
|
+
</div>
|
|
316
316
|
`;
|
|
317
317
|
}
|
|
318
318
|
if (params.funnelId) {
|
|
319
|
-
detailsHTML += `
|
|
320
|
-
<div style="color: #86868b; margin-top: 4px; padding-top: 8px; border-top: 1px solid #e5e5e5;">
|
|
321
|
-
<div style="margin-bottom: 4px;">Funnel ID:</div>
|
|
322
|
-
<div style="color: #1d1d1f; font-family: monospace; font-size: 10px; word-break: break-all; background: #f5f5f7; padding: 4px 6px; border-radius: 4px;">
|
|
323
|
-
${params.funnelId}
|
|
324
|
-
</div>
|
|
325
|
-
</div>
|
|
319
|
+
detailsHTML += `
|
|
320
|
+
<div style="color: #86868b; margin-top: 4px; padding-top: 8px; border-top: 1px solid #e5e5e5;">
|
|
321
|
+
<div style="margin-bottom: 4px;">Funnel ID:</div>
|
|
322
|
+
<div style="color: #1d1d1f; font-family: monospace; font-size: 10px; word-break: break-all; background: #f5f5f7; padding: 4px 6px; border-radius: 4px;">
|
|
323
|
+
${params.funnelId}
|
|
324
|
+
</div>
|
|
325
|
+
</div>
|
|
326
326
|
`;
|
|
327
327
|
}
|
|
328
328
|
detailsHTML += '</div>';
|
|
329
|
-
detailsHTML += `
|
|
330
|
-
<div style="margin-top: 12px; padding-top: 8px; border-top: 1px solid #e5e5e5; font-size: 11px; color: #86868b; text-align: center;">
|
|
331
|
-
Add <code style="background: #f5f5f7; padding: 2px 4px; border-radius: 3px;">?forceReset=true</code> to reset
|
|
332
|
-
</div>
|
|
329
|
+
detailsHTML += `
|
|
330
|
+
<div style="margin-top: 12px; padding-top: 8px; border-top: 1px solid #e5e5e5; font-size: 11px; color: #86868b; text-align: center;">
|
|
331
|
+
Add <code style="background: #f5f5f7; padding: 2px 4px; border-radius: 3px;">?forceReset=true</code> to reset
|
|
332
|
+
</div>
|
|
333
333
|
`;
|
|
334
334
|
// Add action button
|
|
335
|
-
detailsHTML += `
|
|
336
|
-
<div style="margin-top: 12px; padding-top: 8px; border-top: 1px solid #e5e5e5;">
|
|
337
|
-
<button id="tgd-leave-preview" style="
|
|
338
|
-
background: #ff3b30;
|
|
339
|
-
color: white;
|
|
340
|
-
border: none;
|
|
341
|
-
border-radius: 6px;
|
|
342
|
-
padding: 10px 12px;
|
|
343
|
-
font-size: 13px;
|
|
344
|
-
font-weight: 600;
|
|
345
|
-
cursor: pointer;
|
|
346
|
-
transition: opacity 0.2s;
|
|
347
|
-
width: 100%;
|
|
348
|
-
">
|
|
349
|
-
🚪 Leave Preview Mode
|
|
350
|
-
</button>
|
|
351
|
-
</div>
|
|
335
|
+
detailsHTML += `
|
|
336
|
+
<div style="margin-top: 12px; padding-top: 8px; border-top: 1px solid #e5e5e5;">
|
|
337
|
+
<button id="tgd-leave-preview" style="
|
|
338
|
+
background: #ff3b30;
|
|
339
|
+
color: white;
|
|
340
|
+
border: none;
|
|
341
|
+
border-radius: 6px;
|
|
342
|
+
padding: 10px 12px;
|
|
343
|
+
font-size: 13px;
|
|
344
|
+
font-weight: 600;
|
|
345
|
+
cursor: pointer;
|
|
346
|
+
transition: opacity 0.2s;
|
|
347
|
+
width: 100%;
|
|
348
|
+
">
|
|
349
|
+
🚪 Leave Preview Mode
|
|
350
|
+
</button>
|
|
351
|
+
</div>
|
|
352
352
|
`;
|
|
353
353
|
details.innerHTML = detailsHTML;
|
|
354
354
|
// Hover behavior - keep popup visible when hovering over badge, bridge, or popup
|
package/dist/v2/index.d.ts
CHANGED
|
@@ -14,7 +14,7 @@ export * from './core/utils/previewMode';
|
|
|
14
14
|
export { injectPreviewModeIndicator, isIndicatorInjected, removePreviewModeIndicator } from './core/utils/previewModeIndicator';
|
|
15
15
|
export * from './core/utils/products';
|
|
16
16
|
export { getAssignedPaymentFlowId, getAssignedScripts, getAssignedStaticResources, getAssignedStepConfig, getLocalFunnelConfig, loadLocalFunnelConfig } from './core/funnelClient';
|
|
17
|
-
export type { LocalFunnelConfig, RuntimeStepConfig } from './core/funnelClient';
|
|
17
|
+
export type { LocalFunnelConfig, PixelsConfig, RuntimeStepConfig } from './core/funnelClient';
|
|
18
18
|
export * from './core/pathRemapping';
|
|
19
19
|
export type { CheckoutData, CheckoutInitParams, CheckoutLineItem, CheckoutSession, CheckoutSessionPreview, Promotion } from './core/resources/checkout';
|
|
20
20
|
export type { Order, OrderLineItem } from './core/utils/order';
|
|
@@ -28,7 +28,7 @@ export type { ToggleOrderBumpResponse, VipOffer, VipPreviewResponse } from './co
|
|
|
28
28
|
export type { StoreConfig } from './core/resources/storeConfig';
|
|
29
29
|
export { FunnelActionType } from './core/resources/funnel';
|
|
30
30
|
export type { BackNavigationActionData, CartUpdatedActionData, DirectNavigationActionData, FormSubmitActionData, FunnelContextUpdateRequest, FunnelContextUpdateResponse, FunnelAction as FunnelEvent, FunnelInitializeRequest, FunnelInitializeResponse, FunnelNavigateRequest, FunnelNavigateResponse, FunnelNavigationAction, FunnelNavigationResult, NextAction, OfferAcceptedActionData, OfferDeclinedActionData, PaymentFailedActionData, PaymentSuccessActionData, SimpleFunnelContext } from './core/resources/funnel';
|
|
31
|
-
export { ApplePayButton, ExpressPaymentMethodsProvider, formatMoney, getAvailableLanguages, GooglePayButton, PreviewModeIndicator, queryKeys, TagadaProvider, useApiMutation, useApiQuery, useApplePayCheckout, useAuth, useCheckout, useCheckoutToken, useClubOffers, useCountryOptions, useCredits, useCurrency, useCustomer, useCustomerInfos, useCustomerOrders, useCustomerSubscriptions, useDiscounts, useExpressPaymentMethods, useFunnel, useFunnelLegacy, useGeoLocation, useGoogleAutocomplete, useGooglePayCheckout, useInvalidateQuery, useISOData, useLanguageImport, useLogin, useOffer, useOrder, useOrderBump, usePayment, usePaymentRetrieve, usePixelTracking, usePluginConfig, usePostPurchases, usePreloadQuery, usePreviewOffer, useProducts, usePromotions, useRegionOptions, useRemappableParams, useShippingRates, useSimpleFunnel, useStepConfig, useStoreConfig, useTagadaContext, useThreeds, useThreedsModal, useTranslation, useVipOffers } from './react';
|
|
31
|
+
export { ApplePayButton, ExpressPaymentMethodsProvider, formatMoney, getAvailableLanguages, GooglePayButton, PreviewModeIndicator, queryKeys, TagadaProvider, useApiMutation, useApiQuery, useApplePayCheckout, useAuth, useCheckout, useCheckoutToken, useClubOffers, useCountryOptions, useCredits, useCurrency, useCustomer, useCustomerInfos, useCustomerOrders, useCustomerSubscriptions, useDiscounts, useExpressPaymentMethods, useFunnel, useFunnelLegacy, useGeoLocation, useGoogleAutocomplete, useGooglePayCheckout, useInvalidateQuery, useISOData, useLanguageImport, useLogin, useOffer, useOrder, useOrderBump, usePayment, usePaymentRetrieve, usePixelTracking, usePluginConfig, usePostPurchases, usePreloadQuery, usePreviewOffer, useProducts, usePromotions, useRegionOptions, useRemappableParams, useShippingRates, useSimpleFunnel, useStepConfig, useStoreConfig, useTagadaContext, useThreeds, useThreedsModal, useTranslation, useVipOffers, WhopCheckout, useWhopPaymentPolling } from './react';
|
|
32
32
|
export type { DebugScript } from './react';
|
|
33
33
|
export type { TranslateFunction, TranslationText, UseTranslationOptions, UseTranslationResult } from './react/hooks/useTranslation';
|
|
34
34
|
export type { FunnelContextValue } from './react/hooks/useFunnel';
|
|
@@ -37,6 +37,8 @@ export type { ClubOffer, ClubOfferItem, ClubOfferLineItem, ClubOfferSummary, Use
|
|
|
37
37
|
export type { UseCreditsOptions, UseCreditsResult } from './react/hooks/useCredits';
|
|
38
38
|
export type { UseGooglePayCheckoutOptions } from './react/hooks/useGooglePayCheckout';
|
|
39
39
|
export type { UseLoginOptions, UseLoginResult } from './react/hooks/useLogin';
|
|
40
|
+
export type { WhopCheckoutHandle, WhopCheckoutProps } from './react/components/WhopCheckout';
|
|
41
|
+
export type { WhopPayment, UseWhopPaymentPollingOptions, UseWhopPaymentPollingReturn } from './react/hooks/useWhopPaymentPolling';
|
|
40
42
|
export type { CustomerAddress, CustomerInfos, CustomerOrderSummary, OrderWithRelations, Subscription, SubscriptionsResponse } from './core/resources/customer';
|
|
41
43
|
export type { UseCustomerResult } from './react/hooks/useCustomer';
|
|
42
44
|
export type { UseCustomerInfosOptions, UseCustomerInfosResult } from './react/hooks/useCustomerInfos';
|
package/dist/v2/index.js
CHANGED
|
@@ -22,4 +22,4 @@ loadLocalFunnelConfig } from './core/funnelClient';
|
|
|
22
22
|
export * from './core/pathRemapping';
|
|
23
23
|
export { FunnelActionType } from './core/resources/funnel';
|
|
24
24
|
// React exports (hooks and components only, types are exported above)
|
|
25
|
-
export { ApplePayButton, ExpressPaymentMethodsProvider, formatMoney, getAvailableLanguages, GooglePayButton, PreviewModeIndicator, queryKeys, TagadaProvider, useApiMutation, useApiQuery, useApplePayCheckout, useAuth, useCheckout, useCheckoutToken, useClubOffers, useCountryOptions, useCredits, useCurrency, useCustomer, useCustomerInfos, useCustomerOrders, useCustomerSubscriptions, useDiscounts, useExpressPaymentMethods, useFunnel, useFunnelLegacy, useGeoLocation, useGoogleAutocomplete, useGooglePayCheckout, useInvalidateQuery, useISOData, useLanguageImport, useLogin, useOffer, useOrder, useOrderBump, usePayment, usePaymentRetrieve, usePixelTracking, usePluginConfig, usePostPurchases, usePreloadQuery, usePreviewOffer, useProducts, usePromotions, useRegionOptions, useRemappableParams, useShippingRates, useSimpleFunnel, useStepConfig, useStoreConfig, useTagadaContext, useThreeds, useThreedsModal, useTranslation, useVipOffers } from './react';
|
|
25
|
+
export { ApplePayButton, ExpressPaymentMethodsProvider, formatMoney, getAvailableLanguages, GooglePayButton, PreviewModeIndicator, queryKeys, TagadaProvider, useApiMutation, useApiQuery, useApplePayCheckout, useAuth, useCheckout, useCheckoutToken, useClubOffers, useCountryOptions, useCredits, useCurrency, useCustomer, useCustomerInfos, useCustomerOrders, useCustomerSubscriptions, useDiscounts, useExpressPaymentMethods, useFunnel, useFunnelLegacy, useGeoLocation, useGoogleAutocomplete, useGooglePayCheckout, useInvalidateQuery, useISOData, useLanguageImport, useLogin, useOffer, useOrder, useOrderBump, usePayment, usePaymentRetrieve, usePixelTracking, usePluginConfig, usePostPurchases, usePreloadQuery, usePreviewOffer, useProducts, usePromotions, useRegionOptions, useRemappableParams, useShippingRates, useSimpleFunnel, useStepConfig, useStoreConfig, useTagadaContext, useThreeds, useThreedsModal, useTranslation, useVipOffers, WhopCheckout, useWhopPaymentPolling } from './react';
|
|
@@ -41,11 +41,20 @@ export const ApplePayButton = ({ checkout, onSuccess, onError, onCancel }) => {
|
|
|
41
41
|
// Check Apple Pay availability (matches CMS pattern - useApplePayAvailable hook)
|
|
42
42
|
useEffect(() => {
|
|
43
43
|
const addExpress = () => handleAddExpressId('apple_pay');
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
try {
|
|
45
|
+
// Apple Pay requires a secure context (HTTPS). On HTTP (like localhost),
|
|
46
|
+
// calling canMakePayments() throws InvalidAccessError
|
|
47
|
+
if (window?.ApplePaySession && ApplePaySession.canMakePayments()) {
|
|
48
|
+
setIsApplePayAvailable(true);
|
|
49
|
+
addExpress();
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
setIsApplePayAvailable(false);
|
|
53
|
+
}
|
|
47
54
|
}
|
|
48
|
-
|
|
55
|
+
catch (error) {
|
|
56
|
+
// Likely "Trying to start an Apple Pay session from an insecure document"
|
|
57
|
+
console.warn('[ApplePay] Apple Pay not available:', error);
|
|
49
58
|
setIsApplePayAvailable(false);
|
|
50
59
|
}
|
|
51
60
|
}, [handleAddExpressId]);
|
|
@@ -143,6 +143,27 @@ export function FunnelScriptInjector({ context, isInitialized }) {
|
|
|
143
143
|
observer.disconnect();
|
|
144
144
|
}, timeout);
|
|
145
145
|
},
|
|
146
|
+
waitForElements: (selector, callback, timeout = 10000) => {
|
|
147
|
+
const elements = document.querySelectorAll(selector);
|
|
148
|
+
if (elements.length > 0) {
|
|
149
|
+
callback(elements);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const observer = new MutationObserver(() => {
|
|
153
|
+
const elements = document.querySelectorAll(selector);
|
|
154
|
+
if (elements.length > 0) {
|
|
155
|
+
observer.disconnect();
|
|
156
|
+
callback(elements);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
observer.observe(document.body, {
|
|
160
|
+
childList: true,
|
|
161
|
+
subtree: true,
|
|
162
|
+
});
|
|
163
|
+
setTimeout(() => {
|
|
164
|
+
observer.disconnect();
|
|
165
|
+
}, timeout);
|
|
166
|
+
},
|
|
146
167
|
pageType: context?.currentStepId || null,
|
|
147
168
|
isInitialized: isInitialized,
|
|
148
169
|
ressources: context?.resources || null,
|
|
@@ -199,27 +220,27 @@ export function FunnelScriptInjector({ context, isInitialized }) {
|
|
|
199
220
|
existingScript.remove();
|
|
200
221
|
}
|
|
201
222
|
// Wrap script content with error handling and context checks
|
|
202
|
-
const wrappedScript = `
|
|
203
|
-
(function() {
|
|
204
|
-
try {
|
|
205
|
-
// Check if we have basic DOM access
|
|
206
|
-
if (typeof document === 'undefined') {
|
|
207
|
-
console.error('[TagadaPay] Document not available');
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// Check if we have Tagada
|
|
212
|
-
if (!window.Tagada) {
|
|
213
|
-
console.error('[TagadaPay] Tagada not available');
|
|
214
|
-
return;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
// Execute the original script
|
|
218
|
-
${scriptBody}
|
|
219
|
-
} catch (error) {
|
|
220
|
-
console.error('[TagadaPay] Script execution error:', error);
|
|
221
|
-
}
|
|
222
|
-
})();
|
|
223
|
+
const wrappedScript = `
|
|
224
|
+
(function() {
|
|
225
|
+
try {
|
|
226
|
+
// Check if we have basic DOM access
|
|
227
|
+
if (typeof document === 'undefined') {
|
|
228
|
+
console.error('[TagadaPay] Document not available');
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Check if we have Tagada
|
|
233
|
+
if (!window.Tagada) {
|
|
234
|
+
console.error('[TagadaPay] Tagada not available');
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Execute the original script
|
|
239
|
+
${scriptBody}
|
|
240
|
+
} catch (error) {
|
|
241
|
+
console.error('[TagadaPay] Script execution error:', error);
|
|
242
|
+
}
|
|
243
|
+
})();
|
|
223
244
|
`;
|
|
224
245
|
// Create and inject new script element
|
|
225
246
|
const scriptElement = document.createElement('script');
|
|
@@ -273,15 +294,15 @@ export function FunnelScriptInjector({ context, isInitialized }) {
|
|
|
273
294
|
if (!scriptBody)
|
|
274
295
|
return;
|
|
275
296
|
// Wrap script content with error handling
|
|
276
|
-
const wrappedScript = `
|
|
277
|
-
(function() {
|
|
278
|
-
try {
|
|
279
|
-
// Script: ${script.name}
|
|
280
|
-
${scriptBody}
|
|
281
|
-
} catch (error) {
|
|
282
|
-
console.error('[TagadaPay] StepConfig script "${script.name}" error:', error);
|
|
283
|
-
}
|
|
284
|
-
})();
|
|
297
|
+
const wrappedScript = `
|
|
298
|
+
(function() {
|
|
299
|
+
try {
|
|
300
|
+
// Script: ${script.name}
|
|
301
|
+
${scriptBody}
|
|
302
|
+
} catch (error) {
|
|
303
|
+
console.error('[TagadaPay] StepConfig script "${script.name}" error:', error);
|
|
304
|
+
}
|
|
305
|
+
})();
|
|
285
306
|
`;
|
|
286
307
|
// Create script element
|
|
287
308
|
const scriptElement = document.createElement('script');
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { WhopPayment } from '../hooks/useWhopPaymentPolling';
|
|
2
|
+
export interface WhopCheckoutHandle {
|
|
3
|
+
submit: () => Promise<void>;
|
|
4
|
+
}
|
|
5
|
+
export interface WhopCheckoutProps {
|
|
6
|
+
checkoutSessionId: string;
|
|
7
|
+
storeId: string;
|
|
8
|
+
customerEmail?: string;
|
|
9
|
+
shippingAddress?: {
|
|
10
|
+
firstName?: string;
|
|
11
|
+
lastName?: string;
|
|
12
|
+
country?: string;
|
|
13
|
+
address1?: string;
|
|
14
|
+
city?: string;
|
|
15
|
+
state?: string;
|
|
16
|
+
postal?: string;
|
|
17
|
+
};
|
|
18
|
+
orderItemsCount?: number;
|
|
19
|
+
orderTotalAmount?: number;
|
|
20
|
+
onPaymentCompleted?: (payment: WhopPayment) => void;
|
|
21
|
+
onPaymentFailed?: (error: string) => void;
|
|
22
|
+
onReady?: () => void;
|
|
23
|
+
}
|
|
24
|
+
export declare const WhopCheckout: import("react").NamedExoticComponent<WhopCheckoutProps & import("react").RefAttributes<WhopCheckoutHandle>>;
|