@billdog.io/react-native 1.0.0-beta.2
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/BillDogReactNative.podspec +30 -0
- package/LICENSE +21 -0
- package/README.md +330 -0
- package/android/build.gradle +99 -0
- package/android/src/main/AndroidManifest.xml +1 -0
- package/android/src/main/kotlin/io/billdog/reactnative/BillDogABTestModule.kt +317 -0
- package/android/src/main/kotlin/io/billdog/reactnative/BillDogAnalyticsModule.kt +389 -0
- package/android/src/main/kotlin/io/billdog/reactnative/BillDogModule.kt +817 -0
- package/android/src/main/kotlin/io/billdog/reactnative/BillDogPaywallViewManager.kt +383 -0
- package/android/src/main/kotlin/io/billdog/reactnative/BillDogSurveyModule.kt +427 -0
- package/android/src/main/kotlin/io/billdog/reactnative/BillDogVirtualCurrencyModule.kt +407 -0
- package/android/src/main/kotlin/io/billdog/virtualcurrency/BillDogVirtualCurrencyPackage.kt +44 -0
- package/dist/AdvancedPaywallCache.d.ts +70 -0
- package/dist/AdvancedPaywallCache.js +344 -0
- package/dist/BillDog.d.ts +255 -0
- package/dist/BillDog.js +918 -0
- package/dist/BillDogConfiguration.d.ts +145 -0
- package/dist/BillDogConfiguration.js +229 -0
- package/dist/ComponentRenderer.d.ts +17 -0
- package/dist/ComponentRenderer.js +886 -0
- package/dist/LayoutEngine.d.ts +101 -0
- package/dist/LayoutEngine.js +394 -0
- package/dist/LocalizationResolver.d.ts +99 -0
- package/dist/LocalizationResolver.js +266 -0
- package/dist/NativePaywallView.d.ts +36 -0
- package/dist/NativePaywallView.js +59 -0
- package/dist/PaywallCache.d.ts +74 -0
- package/dist/PaywallCache.js +293 -0
- package/dist/PaywallStateManager.d.ts +62 -0
- package/dist/PaywallStateManager.js +147 -0
- package/dist/PaywallView.d.ts +42 -0
- package/dist/PaywallView.js +275 -0
- package/dist/ProductVariableProvider.d.ts +60 -0
- package/dist/ProductVariableProvider.js +239 -0
- package/dist/VariableResolver.d.ts +120 -0
- package/dist/VariableResolver.js +379 -0
- package/dist/WebViewPaywall.d.ts +75 -0
- package/dist/WebViewPaywall.js +360 -0
- package/dist/animations/presets.d.ts +49 -0
- package/dist/animations/presets.js +367 -0
- package/dist/components/AccoladeCpsComponent.d.ts +13 -0
- package/dist/components/AccoladeCpsComponent.js +248 -0
- package/dist/components/AccordionComponent.d.ts +10 -0
- package/dist/components/AccordionComponent.js +187 -0
- package/dist/components/AnimatedWrapper.d.ts +35 -0
- package/dist/components/AnimatedWrapper.js +277 -0
- package/dist/components/CarouselComponent.d.ts +23 -0
- package/dist/components/CarouselComponent.js +484 -0
- package/dist/components/ChartCurveComponent.d.ts +13 -0
- package/dist/components/ChartCurveComponent.js +333 -0
- package/dist/components/CheckboxComponent.d.ts +9 -0
- package/dist/components/CheckboxComponent.js +172 -0
- package/dist/components/ConfettiComponent.d.ts +9 -0
- package/dist/components/ConfettiComponent.js +172 -0
- package/dist/components/CountdownComponent.d.ts +16 -0
- package/dist/components/CountdownComponent.js +414 -0
- package/dist/components/DelayedXComponent.d.ts +12 -0
- package/dist/components/DelayedXComponent.js +240 -0
- package/dist/components/DrawerModalComponent.d.ts +20 -0
- package/dist/components/DrawerModalComponent.js +286 -0
- package/dist/components/GradientView.d.ts +38 -0
- package/dist/components/GradientView.js +126 -0
- package/dist/components/HapticFeedbackComponent.d.ts +16 -0
- package/dist/components/HapticFeedbackComponent.js +64 -0
- package/dist/components/HorizontalProductsComponent.d.ts +17 -0
- package/dist/components/HorizontalProductsComponent.js +284 -0
- package/dist/components/MultiChoiceGridComponent.d.ts +13 -0
- package/dist/components/MultiChoiceGridComponent.js +234 -0
- package/dist/components/NPSScaleComponent.d.ts +16 -0
- package/dist/components/NPSScaleComponent.js +260 -0
- package/dist/components/NavigationComponent.d.ts +26 -0
- package/dist/components/NavigationComponent.js +302 -0
- package/dist/components/OAuthButtonComponent.d.ts +20 -0
- package/dist/components/OAuthButtonComponent.js +237 -0
- package/dist/components/ProgressLoaderComponent.d.ts +13 -0
- package/dist/components/ProgressLoaderComponent.js +308 -0
- package/dist/components/ProgressStepperComponent.d.ts +18 -0
- package/dist/components/ProgressStepperComponent.js +228 -0
- package/dist/components/SegmentedPickerComponent.d.ts +10 -0
- package/dist/components/SegmentedPickerComponent.js +221 -0
- package/dist/components/ShareButtonsComponent.d.ts +21 -0
- package/dist/components/ShareButtonsComponent.js +265 -0
- package/dist/components/ShareCodeComponent.d.ts +16 -0
- package/dist/components/ShareCodeComponent.js +274 -0
- package/dist/components/SingleChoiceGridComponent.d.ts +13 -0
- package/dist/components/SingleChoiceGridComponent.js +210 -0
- package/dist/components/SliderComponent.d.ts +9 -0
- package/dist/components/SliderComponent.js +263 -0
- package/dist/components/StarRatingInputComponent.d.ts +20 -0
- package/dist/components/StarRatingInputComponent.js +198 -0
- package/dist/components/StickerCompositeComponent.d.ts +13 -0
- package/dist/components/StickerCompositeComponent.js +136 -0
- package/dist/components/TabsComponent.d.ts +19 -0
- package/dist/components/TabsComponent.js +431 -0
- package/dist/components/TextInputComponent.d.ts +18 -0
- package/dist/components/TextInputComponent.js +227 -0
- package/dist/components/TimelineComponent.d.ts +19 -0
- package/dist/components/TimelineComponent.js +104 -0
- package/dist/components/ToggleComponent.d.ts +14 -0
- package/dist/components/ToggleComponent.js +132 -0
- package/dist/components/VerticalProductsComponent.d.ts +17 -0
- package/dist/components/VerticalProductsComponent.js +311 -0
- package/dist/dynamicValues.d.ts +36 -0
- package/dist/dynamicValues.js +142 -0
- package/dist/filters/dateFilters.d.ts +50 -0
- package/dist/filters/dateFilters.js +390 -0
- package/dist/filters/index.d.ts +18 -0
- package/dist/filters/index.js +253 -0
- package/dist/hooks/useOfferings.d.ts +76 -0
- package/dist/hooks/useOfferings.js +99 -0
- package/dist/hooks/usePaywall.d.ts +27 -0
- package/dist/hooks/usePaywall.js +114 -0
- package/dist/hooks/usePlacement.d.ts +34 -0
- package/dist/hooks/usePlacement.js +89 -0
- package/dist/hooks/useSubscription.d.ts +40 -0
- package/dist/hooks/useSubscription.js +97 -0
- package/dist/index.d.ts +98 -0
- package/dist/index.js +198 -0
- package/dist/models/BillDogError.d.ts +40 -0
- package/dist/models/BillDogError.js +11 -0
- package/dist/models/CacheFetchPolicy.d.ts +8 -0
- package/dist/models/CacheFetchPolicy.js +4 -0
- package/dist/models/CustomProduct.d.ts +32 -0
- package/dist/models/CustomProduct.js +15 -0
- package/dist/models/CustomerInfo.d.ts +17 -0
- package/dist/models/CustomerInfo.js +11 -0
- package/dist/models/Delegate.d.ts +20 -0
- package/dist/models/Delegate.js +11 -0
- package/dist/models/EntitlementInfo.d.ts +19 -0
- package/dist/models/EntitlementInfo.js +2 -0
- package/dist/models/Placement.d.ts +54 -0
- package/dist/models/Placement.js +15 -0
- package/dist/models/PurchaseParams.d.ts +39 -0
- package/dist/models/PurchaseParams.js +60 -0
- package/dist/models/PurchaseResult.d.ts +30 -0
- package/dist/models/PurchaseResult.js +15 -0
- package/dist/models/RestoreResult.d.ts +30 -0
- package/dist/models/RestoreResult.js +22 -0
- package/dist/models/RestoredItem.d.ts +26 -0
- package/dist/models/RestoredItem.js +13 -0
- package/dist/modules/ABTest.d.ts +65 -0
- package/dist/modules/ABTest.js +113 -0
- package/dist/modules/Analytics.d.ts +91 -0
- package/dist/modules/Analytics.js +182 -0
- package/dist/modules/Survey.d.ts +65 -0
- package/dist/modules/Survey.js +82 -0
- package/dist/modules/VirtualCurrency.d.ts +63 -0
- package/dist/modules/VirtualCurrency.js +147 -0
- package/dist/murmur.d.ts +23 -0
- package/dist/murmur.js +104 -0
- package/dist/notifications/LiveActivitiesManager.d.ts +47 -0
- package/dist/notifications/LiveActivitiesManager.js +106 -0
- package/dist/notifications/NotificationScheduler.d.ts +55 -0
- package/dist/notifications/NotificationScheduler.js +199 -0
- package/dist/notifications/PurchaseNotificationHandler.d.ts +24 -0
- package/dist/notifications/PurchaseNotificationHandler.js +55 -0
- package/dist/notifications/useDeviceToken.d.ts +36 -0
- package/dist/notifications/useDeviceToken.js +97 -0
- package/dist/notifications/useLiveActivity.d.ts +39 -0
- package/dist/notifications/useLiveActivity.js +104 -0
- package/dist/review/ReviewAnalytics.d.ts +34 -0
- package/dist/review/ReviewAnalytics.js +73 -0
- package/dist/review/ReviewManager.d.ts +83 -0
- package/dist/review/ReviewManager.js +339 -0
- package/dist/review/ReviewTimingManager.d.ts +82 -0
- package/dist/review/ReviewTimingManager.js +224 -0
- package/dist/survey-core/types.d.ts +215 -0
- package/dist/survey-core/types.js +8 -0
- package/dist/types.d.ts +438 -0
- package/dist/types.js +158 -0
- package/dist/utils/ApiClient.d.ts +65 -0
- package/dist/utils/ApiClient.js +132 -0
- package/dist/utils/CSSConverter.d.ts +49 -0
- package/dist/utils/CSSConverter.js +470 -0
- package/dist/utils/animations.d.ts +41 -0
- package/dist/utils/animations.js +194 -0
- package/dist/utils/calendarIntegration.d.ts +36 -0
- package/dist/utils/calendarIntegration.js +89 -0
- package/dist/utils/configurationResolver.d.ts +23 -0
- package/dist/utils/configurationResolver.js +78 -0
- package/dist/utils/deviceDetection.d.ts +38 -0
- package/dist/utils/deviceDetection.js +59 -0
- package/dist/utils/hapticFeedback.d.ts +17 -0
- package/dist/utils/hapticFeedback.js +53 -0
- package/dist/utils/iconMapper.d.ts +26 -0
- package/dist/utils/iconMapper.js +113 -0
- package/dist/utils/notificationPermissions.d.ts +13 -0
- package/dist/utils/notificationPermissions.js +51 -0
- package/dist/utils/priceFormatting.d.ts +19 -0
- package/dist/utils/priceFormatting.js +99 -0
- package/dist/utils/shareSheet.d.ts +17 -0
- package/dist/utils/shareSheet.js +42 -0
- package/dist/utils/subscriptionUpgrade.d.ts +84 -0
- package/dist/utils/subscriptionUpgrade.js +100 -0
- package/dist/valueUtils.d.ts +48 -0
- package/dist/valueUtils.js +129 -0
- package/dist/xFlowTags.d.ts +18 -0
- package/dist/xFlowTags.js +385 -0
- package/ios/BillDogABTest.m +50 -0
- package/ios/BillDogABTest.swift +188 -0
- package/ios/BillDogAnalytics.m +105 -0
- package/ios/BillDogAnalytics.swift +324 -0
- package/ios/BillDogBridge.m +222 -0
- package/ios/BillDogBridge.swift +715 -0
- package/ios/BillDogLiveActivities.m +41 -0
- package/ios/BillDogLiveActivities.swift +104 -0
- package/ios/BillDogPaywallViewManager.m +39 -0
- package/ios/BillDogPaywallViewManager.swift +361 -0
- package/ios/BillDogSurvey.m +34 -0
- package/ios/BillDogSurvey.swift +257 -0
- package/ios/BillDogVirtualCurrencyBridge.m +63 -0
- package/ios/BillDogVirtualCurrencyBridge.swift +511 -0
- package/junit.xml +25 -0
- package/package.json +61 -0
- package/react-native.config.js +13 -0
- package/src/AdvancedPaywallCache.ts +433 -0
- package/src/BillDog.ts +983 -0
- package/src/BillDogConfiguration.ts +318 -0
- package/src/ComponentRenderer.tsx +1325 -0
- package/src/LayoutEngine.ts +459 -0
- package/src/LocalizationResolver.ts +311 -0
- package/src/NativePaywallView.tsx +132 -0
- package/src/PaywallCache.ts +358 -0
- package/src/PaywallStateManager.ts +154 -0
- package/src/PaywallView.tsx +328 -0
- package/src/ProductVariableProvider.ts +282 -0
- package/src/VariableResolver.ts +516 -0
- package/src/WebViewPaywall.tsx +454 -0
- package/src/animations/presets.ts +421 -0
- package/src/components/AccoladeCpsComponent.tsx +259 -0
- package/src/components/AccordionComponent.tsx +213 -0
- package/src/components/AnimatedWrapper.tsx +316 -0
- package/src/components/CarouselComponent.tsx +615 -0
- package/src/components/ChartCurveComponent.tsx +452 -0
- package/src/components/CheckboxComponent.tsx +185 -0
- package/src/components/ConfettiComponent.tsx +178 -0
- package/src/components/CountdownComponent.tsx +454 -0
- package/src/components/DelayedXComponent.tsx +266 -0
- package/src/components/DrawerModalComponent.tsx +324 -0
- package/src/components/GradientView.tsx +129 -0
- package/src/components/HapticFeedbackComponent.tsx +39 -0
- package/src/components/HorizontalProductsComponent.tsx +329 -0
- package/src/components/MultiChoiceGridComponent.tsx +265 -0
- package/src/components/NPSScaleComponent.tsx +294 -0
- package/src/components/NavigationComponent.tsx +329 -0
- package/src/components/OAuthButtonComponent.tsx +266 -0
- package/src/components/ProgressLoaderComponent.tsx +366 -0
- package/src/components/ProgressStepperComponent.tsx +250 -0
- package/src/components/SegmentedPickerComponent.tsx +245 -0
- package/src/components/ShareButtonsComponent.tsx +299 -0
- package/src/components/ShareCodeComponent.tsx +303 -0
- package/src/components/SingleChoiceGridComponent.tsx +229 -0
- package/src/components/SliderComponent.tsx +280 -0
- package/src/components/StarRatingInputComponent.tsx +223 -0
- package/src/components/StickerCompositeComponent.tsx +168 -0
- package/src/components/TabsComponent.tsx +496 -0
- package/src/components/TextInputComponent.tsx +258 -0
- package/src/components/TimelineComponent.tsx +129 -0
- package/src/components/ToggleComponent.tsx +142 -0
- package/src/components/VerticalProductsComponent.tsx +357 -0
- package/src/dynamicValues.ts +180 -0
- package/src/filters/dateFilters.ts +411 -0
- package/src/filters/index.ts +281 -0
- package/src/hooks/useOfferings.ts +192 -0
- package/src/hooks/usePaywall.ts +154 -0
- package/src/hooks/usePlacement.ts +143 -0
- package/src/hooks/useSubscription.ts +154 -0
- package/src/index.ts +245 -0
- package/src/models/BillDogError.ts +24 -0
- package/src/models/CacheFetchPolicy.ts +13 -0
- package/src/models/CustomProduct.ts +33 -0
- package/src/models/CustomerInfo.ts +26 -0
- package/src/models/Delegate.ts +22 -0
- package/src/models/EntitlementInfo.ts +27 -0
- package/src/models/Placement.ts +50 -0
- package/src/models/PurchaseParams.ts +81 -0
- package/src/models/PurchaseResult.ts +32 -0
- package/src/models/RestoreResult.ts +27 -0
- package/src/models/RestoredItem.ts +25 -0
- package/src/modules/ABTest.ts +131 -0
- package/src/modules/Analytics.ts +227 -0
- package/src/modules/Survey.ts +126 -0
- package/src/modules/VirtualCurrency.ts +223 -0
- package/src/murmur.ts +102 -0
- package/src/notifications/LiveActivitiesManager.ts +140 -0
- package/src/notifications/NotificationScheduler.ts +292 -0
- package/src/notifications/PurchaseNotificationHandler.ts +67 -0
- package/src/notifications/useDeviceToken.ts +116 -0
- package/src/notifications/useLiveActivity.ts +125 -0
- package/src/review/ReviewAnalytics.ts +89 -0
- package/src/review/ReviewManager.ts +355 -0
- package/src/review/ReviewTimingManager.ts +265 -0
- package/src/survey-core/types.ts +244 -0
- package/src/types/ambient.d.ts +9 -0
- package/src/types.ts +680 -0
- package/src/utils/ApiClient.ts +163 -0
- package/src/utils/CSSConverter.ts +552 -0
- package/src/utils/animations.ts +232 -0
- package/src/utils/calendarIntegration.ts +113 -0
- package/src/utils/configurationResolver.ts +106 -0
- package/src/utils/deviceDetection.ts +83 -0
- package/src/utils/hapticFeedback.ts +55 -0
- package/src/utils/iconMapper.ts +102 -0
- package/src/utils/notificationPermissions.ts +48 -0
- package/src/utils/priceFormatting.ts +119 -0
- package/src/utils/shareSheet.ts +55 -0
- package/src/utils/subscriptionUpgrade.ts +183 -0
- package/src/valueUtils.ts +108 -0
- package/src/xFlowTags.ts +463 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GradientView Component
|
|
4
|
+
* Wraps content with a gradient background using LinearGradient
|
|
5
|
+
* Falls back to solid color if LinearGradient is not available
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.GradientView = void 0;
|
|
42
|
+
exports.isGradientSupported = isGradientSupported;
|
|
43
|
+
exports.getGradientStyleOrFallback = getGradientStyleOrFallback;
|
|
44
|
+
const react_1 = __importStar(require("react"));
|
|
45
|
+
const react_native_1 = require("react-native");
|
|
46
|
+
const CSSConverter_1 = require("../utils/CSSConverter");
|
|
47
|
+
// Try to import LinearGradient - user must have expo-linear-gradient or react-native-linear-gradient installed
|
|
48
|
+
let LinearGradient = null;
|
|
49
|
+
try {
|
|
50
|
+
// Try expo-linear-gradient first (most common in Expo projects)
|
|
51
|
+
LinearGradient = require('expo-linear-gradient').LinearGradient;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
try {
|
|
55
|
+
// Fall back to react-native-linear-gradient
|
|
56
|
+
LinearGradient = require('react-native-linear-gradient').default;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// LinearGradient not available - will use fallback
|
|
60
|
+
LinearGradient = null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* GradientView renders a gradient background
|
|
65
|
+
* Uses LinearGradient if available, falls back to first stop color otherwise
|
|
66
|
+
*/
|
|
67
|
+
const GradientView = ({ gradient, fallbackColor, style, children, borderRadius, borderWidth, borderColor, }) => {
|
|
68
|
+
// Calculate gradient colors and positions
|
|
69
|
+
const { colors, locations, start, end } = (0, react_1.useMemo)(() => {
|
|
70
|
+
var _a;
|
|
71
|
+
const colors = gradient.stops.map(stop => stop.color);
|
|
72
|
+
const locations = gradient.stops.map(stop => {
|
|
73
|
+
var _a;
|
|
74
|
+
const pos = (_a = stop.position) !== null && _a !== void 0 ? _a : 0;
|
|
75
|
+
return pos <= 1 ? pos : pos / 100;
|
|
76
|
+
});
|
|
77
|
+
// Get start/end points based on angle
|
|
78
|
+
const points = gradient.type === 'linear'
|
|
79
|
+
? (0, CSSConverter_1.angleToGradientPoints)((_a = gradient.angle) !== null && _a !== void 0 ? _a : 180)
|
|
80
|
+
: { start: { x: 0.5, y: 0.5 }, end: { x: 1, y: 1 } }; // Radial approximation
|
|
81
|
+
return { colors, locations, ...points };
|
|
82
|
+
}, [gradient]);
|
|
83
|
+
// Container style with border properties
|
|
84
|
+
const containerStyle = {
|
|
85
|
+
borderRadius,
|
|
86
|
+
borderWidth,
|
|
87
|
+
borderColor,
|
|
88
|
+
overflow: 'hidden', // Ensure gradient respects borderRadius
|
|
89
|
+
};
|
|
90
|
+
// If LinearGradient is available, use it
|
|
91
|
+
if (LinearGradient && gradient.type === 'linear') {
|
|
92
|
+
return (<LinearGradient colors={colors} locations={locations} start={start} end={end} style={[style, containerStyle]}>
|
|
93
|
+
{children}
|
|
94
|
+
</LinearGradient>);
|
|
95
|
+
}
|
|
96
|
+
// For radial gradients or if LinearGradient isn't available, use fallback
|
|
97
|
+
const backgroundColor = fallbackColor || colors[0] || 'transparent';
|
|
98
|
+
return (<react_native_1.View style={[style, containerStyle, { backgroundColor }]}>
|
|
99
|
+
{children}
|
|
100
|
+
</react_native_1.View>);
|
|
101
|
+
};
|
|
102
|
+
exports.GradientView = GradientView;
|
|
103
|
+
/**
|
|
104
|
+
* Check if LinearGradient is available
|
|
105
|
+
*/
|
|
106
|
+
function isGradientSupported() {
|
|
107
|
+
return LinearGradient !== null;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get gradient background style or fallback color
|
|
111
|
+
* Use this when you need to decide between GradientView or regular View
|
|
112
|
+
*/
|
|
113
|
+
function getGradientStyleOrFallback(gradient, fallbackColor) {
|
|
114
|
+
var _a, _b;
|
|
115
|
+
if (!gradient || !LinearGradient) {
|
|
116
|
+
return {
|
|
117
|
+
useGradient: false,
|
|
118
|
+
backgroundColor: fallbackColor || ((_a = gradient === null || gradient === void 0 ? void 0 : gradient.stops[0]) === null || _a === void 0 ? void 0 : _a.color) || 'transparent',
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
useGradient: true,
|
|
123
|
+
backgroundColor: fallbackColor || ((_b = gradient.stops[0]) === null || _b === void 0 ? void 0 : _b.color) || 'transparent',
|
|
124
|
+
gradient,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { PaywallComponent } from '../types';
|
|
3
|
+
interface HapticFeedbackComponentProps {
|
|
4
|
+
component: PaywallComponent;
|
|
5
|
+
isPreviewMode?: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* HapticFeedbackComponent — invisible behavior component.
|
|
9
|
+
*
|
|
10
|
+
* Fires a single device haptic on mount, reusing the shared `triggerHaptic`
|
|
11
|
+
* util (the same one the haptic tap-action uses). Skipped in the builder
|
|
12
|
+
* preview. The style comes from `properties.hapticStyle` (the six canonical
|
|
13
|
+
* HapticType values), falling back to `medium`. Renders nothing visible.
|
|
14
|
+
*/
|
|
15
|
+
export declare const HapticFeedbackComponent: React.FC<HapticFeedbackComponentProps>;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.HapticFeedbackComponent = void 0;
|
|
37
|
+
const react_1 = __importStar(require("react"));
|
|
38
|
+
const react_native_1 = require("react-native");
|
|
39
|
+
const hapticFeedback_1 = require("../utils/hapticFeedback");
|
|
40
|
+
const HAPTIC_STYLES = new Set([
|
|
41
|
+
'light', 'medium', 'heavy', 'success', 'warning', 'error',
|
|
42
|
+
]);
|
|
43
|
+
/**
|
|
44
|
+
* HapticFeedbackComponent — invisible behavior component.
|
|
45
|
+
*
|
|
46
|
+
* Fires a single device haptic on mount, reusing the shared `triggerHaptic`
|
|
47
|
+
* util (the same one the haptic tap-action uses). Skipped in the builder
|
|
48
|
+
* preview. The style comes from `properties.hapticStyle` (the six canonical
|
|
49
|
+
* HapticType values), falling back to `medium`. Renders nothing visible.
|
|
50
|
+
*/
|
|
51
|
+
const HapticFeedbackComponent = ({ component, isPreviewMode = false, }) => {
|
|
52
|
+
const hasFiredRef = (0, react_1.useRef)(false);
|
|
53
|
+
(0, react_1.useEffect)(() => {
|
|
54
|
+
if (isPreviewMode || hasFiredRef.current)
|
|
55
|
+
return;
|
|
56
|
+
hasFiredRef.current = true;
|
|
57
|
+
const props = component.properties || {};
|
|
58
|
+
const raw = typeof props.hapticStyle === 'string' ? props.hapticStyle : 'medium';
|
|
59
|
+
const style = (HAPTIC_STYLES.has(raw) ? raw : 'medium');
|
|
60
|
+
(0, hapticFeedback_1.triggerHaptic)(style);
|
|
61
|
+
}, [component.id, isPreviewMode]);
|
|
62
|
+
return <react_native_1.View style={{ width: 0, height: 0 }}/>;
|
|
63
|
+
};
|
|
64
|
+
exports.HapticFeedbackComponent = HapticFeedbackComponent;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Horizontal Products Component for React Native
|
|
3
|
+
* Pure Child Model: renders children via renderChild with horizontal FlatList layout,
|
|
4
|
+
* overlay extraction, child sanitization, and selection state propagation.
|
|
5
|
+
* Matches Android ProductsComponent.kt and iOS ProductsRenderer.swift architecture.
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import { PaywallComponent, PaywallConfiguration } from '../types';
|
|
9
|
+
export interface HorizontalProductsComponentProps {
|
|
10
|
+
component: PaywallComponent;
|
|
11
|
+
configuration: PaywallConfiguration;
|
|
12
|
+
renderChild: (child: PaywallComponent) => React.ReactNode;
|
|
13
|
+
stateManager?: any;
|
|
14
|
+
onAction?: (componentId: string, action: string) => void;
|
|
15
|
+
}
|
|
16
|
+
export declare const HorizontalProductsComponent: React.FC<HorizontalProductsComponentProps>;
|
|
17
|
+
export default HorizontalProductsComponent;
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Horizontal Products Component for React Native
|
|
4
|
+
* Pure Child Model: renders children via renderChild with horizontal FlatList layout,
|
|
5
|
+
* overlay extraction, child sanitization, and selection state propagation.
|
|
6
|
+
* Matches Android ProductsComponent.kt and iOS ProductsRenderer.swift architecture.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.HorizontalProductsComponent = void 0;
|
|
43
|
+
const react_1 = __importStar(require("react"));
|
|
44
|
+
const react_native_1 = require("react-native");
|
|
45
|
+
const PaywallStateManager_1 = require("../PaywallStateManager");
|
|
46
|
+
function getRole(child) {
|
|
47
|
+
var _a;
|
|
48
|
+
return child.role || ((_a = child.properties) === null || _a === void 0 ? void 0 : _a.role);
|
|
49
|
+
}
|
|
50
|
+
function extractOverlays(children) {
|
|
51
|
+
if (!(children === null || children === void 0 ? void 0 : children.length)) {
|
|
52
|
+
return { badge: null, checkmark: null, radioIndicator: null, remainingChildren: [] };
|
|
53
|
+
}
|
|
54
|
+
const badge = children.find(c => getRole(c) === 'badge') || null;
|
|
55
|
+
const checkmark = children.find(c => getRole(c) === 'checkmark') || null;
|
|
56
|
+
const radioIndicator = children.find(c => getRole(c) === 'radio-indicator') || null;
|
|
57
|
+
const remaining = children.filter(c => c !== badge && c !== checkmark && c !== radioIndicator);
|
|
58
|
+
return { badge, checkmark, radioIndicator, remainingChildren: remaining };
|
|
59
|
+
}
|
|
60
|
+
// ============= CHILD SANITIZATION =============
|
|
61
|
+
function sanitizeProductChild(child) {
|
|
62
|
+
const sanitized = { ...child };
|
|
63
|
+
if (sanitized.appearance) {
|
|
64
|
+
const { fill, backgroundColor, cornerRadius, borderColor, borderWidth, shadow, ...rest } = sanitized.appearance;
|
|
65
|
+
sanitized.appearance = rest;
|
|
66
|
+
}
|
|
67
|
+
sanitized.selectedAppearance = undefined;
|
|
68
|
+
if (sanitized.layout) {
|
|
69
|
+
const { padding, ...restLayout } = sanitized.layout;
|
|
70
|
+
sanitized.layout = restLayout;
|
|
71
|
+
}
|
|
72
|
+
return sanitized;
|
|
73
|
+
}
|
|
74
|
+
// ============= SELECTION STATE PROPAGATION =============
|
|
75
|
+
function applySelectionState(component, isSelected, isHybridMode) {
|
|
76
|
+
var _a;
|
|
77
|
+
if (!isHybridMode)
|
|
78
|
+
return component;
|
|
79
|
+
const role = getRole(component);
|
|
80
|
+
if (role === 'radio-indicator' && component.type === 'stack' && component.children) {
|
|
81
|
+
return {
|
|
82
|
+
...component,
|
|
83
|
+
children: component.children.map(iconChild => {
|
|
84
|
+
const iconRole = getRole(iconChild);
|
|
85
|
+
if (iconRole === 'selected-icon')
|
|
86
|
+
return { ...iconChild, visible: isSelected };
|
|
87
|
+
if (iconRole === 'unselected-icon')
|
|
88
|
+
return { ...iconChild, visible: !isSelected };
|
|
89
|
+
return applySelectionState(iconChild, isSelected, isHybridMode);
|
|
90
|
+
}),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
if (role === 'checkmark') {
|
|
94
|
+
return { ...component, visible: isSelected };
|
|
95
|
+
}
|
|
96
|
+
if ((_a = component.children) === null || _a === void 0 ? void 0 : _a.length) {
|
|
97
|
+
return {
|
|
98
|
+
...component,
|
|
99
|
+
children: component.children.map(c => applySelectionState(c, isSelected, isHybridMode)),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
return component;
|
|
103
|
+
}
|
|
104
|
+
// ============= HYBRID MODE DETECTION =============
|
|
105
|
+
function hasHybridChildren(children) {
|
|
106
|
+
return children.some(child => {
|
|
107
|
+
if (getRole(child))
|
|
108
|
+
return true;
|
|
109
|
+
return hasChildWithRole(child);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
function hasChildWithRole(component) {
|
|
113
|
+
if (!component.children)
|
|
114
|
+
return false;
|
|
115
|
+
for (const child of component.children) {
|
|
116
|
+
if (getRole(child))
|
|
117
|
+
return true;
|
|
118
|
+
if (hasChildWithRole(child))
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
// ============= HELPERS =============
|
|
124
|
+
function resolveNumber(val, fallback) {
|
|
125
|
+
if (typeof val === 'number')
|
|
126
|
+
return val;
|
|
127
|
+
if (val && typeof val === 'object' && 'value' in val)
|
|
128
|
+
return val.value;
|
|
129
|
+
return fallback;
|
|
130
|
+
}
|
|
131
|
+
function resolveColor(appearance, key, fallback) {
|
|
132
|
+
if (!appearance)
|
|
133
|
+
return fallback;
|
|
134
|
+
const val = appearance[key];
|
|
135
|
+
if (!val)
|
|
136
|
+
return fallback;
|
|
137
|
+
if (typeof val === 'string')
|
|
138
|
+
return val;
|
|
139
|
+
if (val.resolvedColor)
|
|
140
|
+
return val.resolvedColor;
|
|
141
|
+
if (val.color)
|
|
142
|
+
return typeof val.color === 'string' ? val.color : fallback;
|
|
143
|
+
if (val.hex)
|
|
144
|
+
return val.hex;
|
|
145
|
+
return fallback;
|
|
146
|
+
}
|
|
147
|
+
function resolveFillColor(appearance, fallback) {
|
|
148
|
+
if (!appearance)
|
|
149
|
+
return fallback;
|
|
150
|
+
if (appearance.fill)
|
|
151
|
+
return resolveColor(appearance, 'fill', fallback);
|
|
152
|
+
if (appearance.backgroundColor)
|
|
153
|
+
return resolveColor(appearance, 'backgroundColor', fallback);
|
|
154
|
+
return fallback;
|
|
155
|
+
}
|
|
156
|
+
// ============= MAIN COMPONENT =============
|
|
157
|
+
const HorizontalProductsComponent = ({ component, configuration, renderChild, stateManager, onAction, }) => {
|
|
158
|
+
const properties = component.properties || {};
|
|
159
|
+
const allChildren = component.children || [];
|
|
160
|
+
const flatListRef = (0, react_1.useRef)(null);
|
|
161
|
+
// Package binding
|
|
162
|
+
const bindToPackages = properties.bindToPackages !== false;
|
|
163
|
+
const packageIdentifiers = properties.packageIdentifiers || [];
|
|
164
|
+
const boundPackages = bindToPackages
|
|
165
|
+
? (packageIdentifiers.length > 0
|
|
166
|
+
? packageIdentifiers
|
|
167
|
+
.map(id => (configuration.packages || []).find(p => p.identifier === id || p.productId === id))
|
|
168
|
+
.filter(Boolean)
|
|
169
|
+
: configuration.packages || [])
|
|
170
|
+
: [];
|
|
171
|
+
const children = (bindToPackages && boundPackages.length > 0)
|
|
172
|
+
? allChildren.slice(0, boundPackages.length)
|
|
173
|
+
: allChildren.filter(c => c.visible !== false);
|
|
174
|
+
const gap = resolveNumber(properties.gap, 12);
|
|
175
|
+
const defaultSelectedIndex = resolveNumber(properties.defaultSelectedIndex, 0);
|
|
176
|
+
const cardWidth = resolveNumber(properties.cardWidth, 160);
|
|
177
|
+
const cardHeight = resolveNumber(properties.cardHeight, 200);
|
|
178
|
+
const showBadge = !!properties.showBadge;
|
|
179
|
+
const badgeProductIndex = resolveNumber(properties.badgeProductIndex, 0);
|
|
180
|
+
const enableSnapScrolling = properties.enableSnapScrolling !== false;
|
|
181
|
+
const isHybridMode = hasHybridChildren(children);
|
|
182
|
+
// State
|
|
183
|
+
const stateKey = `element:${component.id}.selectedIndex`;
|
|
184
|
+
const [selectedIndex, setSelectedIndex] = (0, react_1.useState)(defaultSelectedIndex);
|
|
185
|
+
(0, react_1.useEffect)(() => {
|
|
186
|
+
var _a, _b, _c;
|
|
187
|
+
if (!stateManager)
|
|
188
|
+
return;
|
|
189
|
+
const existing = (_a = stateManager.getState) === null || _a === void 0 ? void 0 : _a.call(stateManager, stateKey);
|
|
190
|
+
if (existing !== undefined && existing !== null) {
|
|
191
|
+
setSelectedIndex(Number(existing));
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
(_b = stateManager.setState) === null || _b === void 0 ? void 0 : _b.call(stateManager, stateKey, defaultSelectedIndex);
|
|
195
|
+
}
|
|
196
|
+
// Return the unsubscribe. This was dropped on the floor while nothing supplied a
|
|
197
|
+
// stateManager and every call no-opped; now that one is provided, an uncleaned
|
|
198
|
+
// subscription leaks a listener holding a stale setSelectedIndex on each remount.
|
|
199
|
+
return (_c = stateManager.subscribe) === null || _c === void 0 ? void 0 : _c.call(stateManager, stateKey, (value) => {
|
|
200
|
+
setSelectedIndex(Number(value) || 0);
|
|
201
|
+
});
|
|
202
|
+
}, [component.id, stateManager]);
|
|
203
|
+
// Publish the live selection PAYWALL-WIDE so Dynamic Values can react to it
|
|
204
|
+
// (`products.selectedIndex == 1` templates) and so `selectedProduct.*` resolves for
|
|
205
|
+
// the user's actual choice. The per-element key above is scoped to this component.
|
|
206
|
+
// With multiple products components, last write wins — same contract as Android
|
|
207
|
+
// ProductsComponent and iOS ProductsRenderer.updateSelectionState.
|
|
208
|
+
(0, react_1.useEffect)(() => {
|
|
209
|
+
var _a;
|
|
210
|
+
(_a = stateManager === null || stateManager === void 0 ? void 0 : stateManager.setState) === null || _a === void 0 ? void 0 : _a.call(stateManager, PaywallStateManager_1.PaywallStateManager.SELECTED_INDEX_KEY, selectedIndex);
|
|
211
|
+
}, [selectedIndex, stateManager]);
|
|
212
|
+
const handleSelect = (0, react_1.useCallback)((index) => {
|
|
213
|
+
var _a, _b;
|
|
214
|
+
setSelectedIndex(index);
|
|
215
|
+
(_a = stateManager === null || stateManager === void 0 ? void 0 : stateManager.setState) === null || _a === void 0 ? void 0 : _a.call(stateManager, stateKey, index);
|
|
216
|
+
onAction === null || onAction === void 0 ? void 0 : onAction(component.id, `select_package:${index},${(_b = children[index]) === null || _b === void 0 ? void 0 : _b.id}`);
|
|
217
|
+
react_native_1.AccessibilityInfo.announceForAccessibility(`Selected product ${index + 1}`);
|
|
218
|
+
}, [stateKey, stateManager, onAction, component.id, children]);
|
|
219
|
+
const renderProductCard = (child, index) => {
|
|
220
|
+
const isSelected = index === selectedIndex;
|
|
221
|
+
const childAppearance = child.appearance;
|
|
222
|
+
const childSelectedAppearance = child.selectedAppearance;
|
|
223
|
+
const childLayout = child.layout;
|
|
224
|
+
const cardBg = resolveFillColor(childAppearance, 'transparent');
|
|
225
|
+
const cardCornerRadius = resolveNumber(childAppearance === null || childAppearance === void 0 ? void 0 : childAppearance.cornerRadius, 12);
|
|
226
|
+
const cardBorderColor = resolveColor(childAppearance, 'borderColor', 'rgba(128,128,128,0.2)');
|
|
227
|
+
const cardBorderWidth = resolveNumber(childAppearance === null || childAppearance === void 0 ? void 0 : childAppearance.borderWidth, 0);
|
|
228
|
+
const selectedBg = resolveFillColor(childSelectedAppearance, 'rgba(59,130,246,0.1)');
|
|
229
|
+
const selectedBorderColor = resolveColor(childSelectedAppearance, 'borderColor', '#3B82F6');
|
|
230
|
+
const selectedBorderWidth = resolveNumber(childSelectedAppearance === null || childSelectedAppearance === void 0 ? void 0 : childSelectedAppearance.borderWidth, 2);
|
|
231
|
+
const bgColor = isSelected ? selectedBg : cardBg;
|
|
232
|
+
const borderColorVal = isSelected ? selectedBorderColor : cardBorderColor;
|
|
233
|
+
const borderWidthVal = isSelected ? selectedBorderWidth : cardBorderWidth;
|
|
234
|
+
// Padding from child.layout.padding
|
|
235
|
+
const padding = childLayout === null || childLayout === void 0 ? void 0 : childLayout.padding;
|
|
236
|
+
const paddingTop = resolveNumber(padding === null || padding === void 0 ? void 0 : padding.top, 14);
|
|
237
|
+
const paddingRight = resolveNumber(padding === null || padding === void 0 ? void 0 : padding.right, 16);
|
|
238
|
+
const paddingBottom = resolveNumber(padding === null || padding === void 0 ? void 0 : padding.bottom, 14);
|
|
239
|
+
const paddingLeft = resolveNumber(padding === null || padding === void 0 ? void 0 : padding.left, 16);
|
|
240
|
+
const extraction = extractOverlays(child.children);
|
|
241
|
+
const childWithRemaining = { ...child, children: extraction.remainingChildren };
|
|
242
|
+
const sanitized = sanitizeProductChild(childWithRemaining);
|
|
243
|
+
const transformed = applySelectionState(sanitized, isSelected, isHybridMode);
|
|
244
|
+
return (<react_native_1.TouchableOpacity activeOpacity={0.8} onPress={() => handleSelect(index)} accessibilityRole="radio" accessibilityState={{ selected: isSelected }} accessibilityLabel={`Product ${index + 1}, ${isSelected ? 'selected' : 'not selected'}`} style={{ marginRight: index < children.length - 1 ? gap : 0 }}>
|
|
245
|
+
<react_native_1.View style={{ width: cardWidth, height: cardHeight, position: 'relative' }}>
|
|
246
|
+
{/* Layer 1: Background */}
|
|
247
|
+
<react_native_1.View style={{
|
|
248
|
+
...react_native_1.StyleSheet.absoluteFillObject,
|
|
249
|
+
backgroundColor: bgColor,
|
|
250
|
+
borderRadius: cardCornerRadius,
|
|
251
|
+
borderColor: borderColorVal,
|
|
252
|
+
borderWidth: borderWidthVal,
|
|
253
|
+
}}/>
|
|
254
|
+
|
|
255
|
+
{/* Layer 2: Content */}
|
|
256
|
+
<react_native_1.View style={{
|
|
257
|
+
flex: 1,
|
|
258
|
+
alignItems: 'center',
|
|
259
|
+
justifyContent: 'center',
|
|
260
|
+
paddingTop,
|
|
261
|
+
paddingRight,
|
|
262
|
+
paddingBottom,
|
|
263
|
+
paddingLeft,
|
|
264
|
+
}}>
|
|
265
|
+
{renderChild(transformed)}
|
|
266
|
+
</react_native_1.View>
|
|
267
|
+
|
|
268
|
+
{/* Layer 3: Badge overlay */}
|
|
269
|
+
{extraction.badge && showBadge && index === badgeProductIndex && (<react_native_1.View style={{ position: 'absolute', top: -10, right: 12, zIndex: 10 }}>
|
|
270
|
+
{renderChild(extraction.badge)}
|
|
271
|
+
</react_native_1.View>)}
|
|
272
|
+
</react_native_1.View>
|
|
273
|
+
</react_native_1.TouchableOpacity>);
|
|
274
|
+
};
|
|
275
|
+
return (<react_native_1.View accessibilityRole="radiogroup" accessibilityLabel="Select a product">
|
|
276
|
+
<react_native_1.FlatList ref={flatListRef} data={children} renderItem={({ item, index }) => renderProductCard(item, index)} keyExtractor={(item, index) => item.id || `product-${index}`} horizontal showsHorizontalScrollIndicator={false} snapToInterval={enableSnapScrolling ? cardWidth + gap : undefined} snapToAlignment="start" decelerationRate={enableSnapScrolling ? 'fast' : 'normal'} contentContainerStyle={{ paddingTop: 12 }} getItemLayout={(_, index) => ({
|
|
277
|
+
length: cardWidth + gap,
|
|
278
|
+
offset: (cardWidth + gap) * index,
|
|
279
|
+
index,
|
|
280
|
+
})}/>
|
|
281
|
+
</react_native_1.View>);
|
|
282
|
+
};
|
|
283
|
+
exports.HorizontalProductsComponent = HorizontalProductsComponent;
|
|
284
|
+
exports.default = exports.HorizontalProductsComponent;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi Choice Grid Component for React Native
|
|
3
|
+
* Checkbox style grid selection (multiple selection)
|
|
4
|
+
*/
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import { PaywallComponent } from '../types';
|
|
7
|
+
interface MultiChoiceGridProps {
|
|
8
|
+
component: PaywallComponent;
|
|
9
|
+
stateManager?: any;
|
|
10
|
+
isPreviewMode?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare const MultiChoiceGridComponent: React.FC<MultiChoiceGridProps>;
|
|
13
|
+
export {};
|