@igaworks/adbrix-react-native-sdk 1.0.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/CHANGELOG.md +81 -26
  2. package/adbrix-react-native-sdk.podspec +1 -1
  3. package/android/build.gradle +1 -1
  4. package/package.json +1 -1
  5. package/example/.bundle/config +0 -2
  6. package/example/.watchmanconfig +0 -1
  7. package/example/Gemfile +0 -10
  8. package/example/README.md +0 -106
  9. package/example/android/README.md +0 -24
  10. package/example/android/app/build.gradle +0 -128
  11. package/example/android/app/debug.keystore +0 -0
  12. package/example/android/app/proguard-rules.pro +0 -10
  13. package/example/android/app/src/debug/AndroidManifest.xml +0 -9
  14. package/example/android/app/src/main/AndroidManifest.xml +0 -34
  15. package/example/android/app/src/main/ic_launcher-playstore.png +0 -0
  16. package/example/android/app/src/main/java/igaworks/adbrixreactnativesdk/example/MainActivity.kt +0 -28
  17. package/example/android/app/src/main/java/igaworks/adbrixreactnativesdk/example/MainApplication.kt +0 -44
  18. package/example/android/app/src/main/res/drawable/rn_edit_text_material.xml +0 -37
  19. package/example/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +0 -5
  20. package/example/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +0 -5
  21. package/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
  22. package/example/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp +0 -0
  23. package/example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
  24. package/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
  25. package/example/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp +0 -0
  26. package/example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
  27. package/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
  28. package/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp +0 -0
  29. package/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
  30. package/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
  31. package/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp +0 -0
  32. package/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
  33. package/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
  34. package/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp +0 -0
  35. package/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
  36. package/example/android/app/src/main/res/values/ic_launcher_background.xml +0 -4
  37. package/example/android/app/src/main/res/values/strings.xml +0 -3
  38. package/example/android/app/src/main/res/values/styles.xml +0 -9
  39. package/example/android/build.gradle +0 -21
  40. package/example/android/gradle.properties +0 -39
  41. package/example/android/settings.gradle +0 -6
  42. package/example/app.json +0 -4
  43. package/example/babel.config.js +0 -4
  44. package/example/index.js +0 -5
  45. package/example/ios/.xcode.env +0 -11
  46. package/example/ios/AdbrixReactNativeSdkExample/AppDelegate.swift +0 -53
  47. package/example/ios/AdbrixReactNativeSdkExample/Images.xcassets/AppIcon.appiconset/Contents.json +0 -53
  48. package/example/ios/AdbrixReactNativeSdkExample/Images.xcassets/Contents.json +0 -6
  49. package/example/ios/AdbrixReactNativeSdkExample/Info.plist +0 -62
  50. package/example/ios/AdbrixReactNativeSdkExample/LaunchScreen.storyboard +0 -47
  51. package/example/ios/AdbrixReactNativeSdkExample/PrivacyInfo.xcprivacy +0 -37
  52. package/example/ios/AdbrixReactNativeSdkExample.xcodeproj/project.pbxproj +0 -488
  53. package/example/ios/AdbrixReactNativeSdkExample.xcodeproj/xcshareddata/xcschemes/AdbrixReactNativeSdkExample.xcscheme +0 -88
  54. package/example/ios/AdbrixReactNativeSdkExample.xcworkspace/contents.xcworkspacedata +0 -10
  55. package/example/ios/Podfile +0 -35
  56. package/example/ios/Podfile.lock +0 -1821
  57. package/example/jest.config.js +0 -3
  58. package/example/metro.config.js +0 -27
  59. package/example/package.json +0 -33
  60. package/example/react-native.config.js +0 -21
  61. package/example/src/App.tsx +0 -755
@@ -1,755 +0,0 @@
1
- import { useState, useEffect } from 'react';
2
- import {
3
- StyleSheet,
4
- View,
5
- Text,
6
- TouchableOpacity,
7
- Alert,
8
- ScrollView,
9
- Platform,
10
- Linking,
11
- SafeAreaView
12
- } from 'react-native';
13
- import Adbrix, {
14
- ABEvent,
15
- ABCurrency,
16
- ABPaymentMethod,
17
- ABConfig,
18
- ABAndroidLogLevel,
19
- ABInviteChannel,
20
- ABSharingChannel,
21
- ABSignUpChannel,
22
- ABProperty,
23
- ABItem
24
- } from '@igaworks/adbrix-react-native-sdk';
25
-
26
- export default function App() {
27
- const [deepLink, setDeepLink] = useState<string | null>(null);
28
-
29
- useEffect(() => {
30
- init();
31
-
32
- // 딥링크 리스너 설정
33
- const handleDeepLink = (url: string) => {
34
- console.log("🔗 [React Native] 딥링크 수신:", url);
35
- if (url.startsWith('abx2jimmy://')) {
36
- setDeepLink(url);
37
- showDeepLinkAlert(url + " (React Native)");
38
- }
39
- };
40
-
41
- // 앱이 실행 중일 때 딥링크 처리
42
- const linkingListener = Linking.addEventListener('url', (event) => {
43
- handleDeepLink(event.url + ' this is linkingListener');
44
- });
45
-
46
- Linking.getInitialURL().then((url) => {
47
- if (url) {
48
- handleDeepLink(url + ' this is iniitial');
49
- }
50
- });
51
-
52
- return () => {
53
- linkingListener.remove();
54
- };
55
- }, []);
56
-
57
- const init = async () => {
58
- sdkInit();
59
- blockDeferredDeepLinkLaunch();
60
- };
61
-
62
- const sdkInit = () => {
63
- const config = {
64
- [ABConfig.IOS_LOG_ENABLE]: true,
65
- [ABConfig.ANDROID_LOG_ENABLE]: true,
66
- [ABConfig.ANDROID_LOG_LEVEL]: ABAndroidLogLevel.VERBOSE,
67
- [ABConfig.ANDROID_COLLECT_GOOGLE_ADVERTISING_ID]: true,
68
- // [ABConfig.IOS_TRACKING_TIMEOUT]: ABiOSTrackingTimeout.TIMEOUT_60
69
- };
70
-
71
- Adbrix.initWithConfig({
72
- applicationKey: "{YOUR_APPLICATION_KEY}",
73
- secretKey: "{YOUR_SECRET_KEY}",
74
- config: config,
75
- });
76
- };
77
-
78
- const blockDeferredDeepLinkLaunch = async () => {
79
- try {
80
- const callback = await Adbrix.blockDeferredDeepLinkLaunch();
81
- if (callback) {
82
- const deepLinkUrl = callback.deepLink;
83
- const deepLinkResult = callback.result;
84
- setDeepLink(deepLinkUrl);
85
- showDeepLinkAlert(deepLinkUrl + " deferred! "+ deepLinkResult);
86
- }
87
- } catch (error) {
88
- console.error("error in blockDeferredDeepLinkLaunch:", error);
89
- }
90
- };
91
-
92
- const showDeepLinkAlert = (deepLinkUrl: string) => {
93
- Alert.alert(
94
- '딥링크 수신',
95
- `수신된 딥링크: ${deepLinkUrl}`,
96
- [{ text: '확인', style: 'default' }]
97
- );
98
- };
99
-
100
- const requestTrackingAuthorization = async () => {
101
- if (Platform.OS === 'ios') {
102
- // React Native에서는 react-native-permissions를 사용하거나
103
- // 직접 ATT 권한을 요청하는 네이티브 모듈을 구현해야 합니다.
104
- // 여기서는 간단히 허용되었다고 가정하고 호출합니다.
105
- Alert.alert(
106
- 'ATT 권한 요청',
107
- 'iOS에서 앱 추적 투명성 권한을 요청합니다.',
108
- [
109
- {
110
- text: '허용',
111
- onPress: () => Adbrix.attAuthorized(true)
112
- },
113
- {
114
- text: '거부',
115
- onPress: () => Adbrix.attAuthorized(false)
116
- }
117
- ]
118
- );
119
- }
120
- };
121
-
122
- // Event Handler Functions
123
- const handleLogin = () => {
124
- Adbrix.logEvent({ eventName: ABEvent.LOGIN });
125
- };
126
-
127
- const handleLogout = () => {
128
- Adbrix.logEvent({ eventName: ABEvent.LOGOUT });
129
- };
130
-
131
- const handleSignUp = () => {
132
- const properties = ABProperty
133
- .signChannel(ABSignUpChannel.KAKAO)
134
- .build();
135
-
136
- Adbrix.logEvent({
137
- eventName: ABEvent.SIGN_UP,
138
- properties: properties
139
- });
140
- };
141
-
142
- const handleAppUpdate = () => {
143
- const properties = ABProperty
144
- .prevVer('1.0.0')
145
- .currVer('1.0.1')
146
- .build();
147
-
148
- Adbrix.logEvent({
149
- eventName: ABEvent.APP_UPDATE,
150
- properties: properties
151
- });
152
- };
153
-
154
- const handleInvite = () => {
155
- const properties = ABProperty
156
- .inviteChannel(ABInviteChannel.KAKAO)
157
- .build();
158
-
159
- Adbrix.logEvent({
160
- eventName: ABEvent.INVITE,
161
- properties: properties
162
- });
163
- };
164
-
165
- const handleUseCredit = () => {
166
- Adbrix.logEvent({ eventName: ABEvent.USE_CREDIT });
167
- };
168
-
169
- const handlePurchase = () => {
170
- // 기존 방식 대신 빌더 패턴 사용
171
- const item = ABItem()
172
- .productId('상품번호')
173
- .productName('상품이름')
174
- .category1('식품')
175
- .category2('과자')
176
- .price(5000.0)
177
- .discount(0.0)
178
- .quantity(1)
179
- .currency(ABCurrency.KRW)
180
- .customString('custom_string', '단건테스트')
181
- .customLong('custom_long', 100)
182
- .customDouble('custom_double', 100.0)
183
- .customBool('custom_bool', true)
184
- .build();
185
-
186
-
187
- const item2 = ABItem()
188
- .productId('상품번호3')
189
- .productName('상품이름3')
190
- .category1('식품')
191
- .category2('간식')
192
- .price(2000.0)
193
- .discount(0.0)
194
- .quantity(3)
195
- .currency(ABCurrency.KRW)
196
- .customString('custom_string', '단건테스트')
197
- .customLong('custom_long', 100)
198
- .customDouble('custom_double', 100.0)
199
- .customBool('custom_bool', true)
200
- .build();
201
-
202
- const item3 = ABItem()
203
- .productId('상품번호3')
204
- .productName('상품이름3')
205
- .category1('식품')
206
- .category2('간식')
207
- .price(2000.0)
208
- .discount(0.0)
209
- .quantity(3)
210
- .currency(ABCurrency.KRW)
211
- .build();
212
-
213
- const properties = ABProperty
214
- .items([item, item2, item3])
215
- .orderId('상품번호')
216
- .paymentMethod(ABPaymentMethod.BANK_TRANSFER)
217
- .orderSales(20000.0)
218
- .deliveryCharge(3000.0)
219
- .build();
220
-
221
- Adbrix.logEvent({ eventName: ABEvent.PURCHASE, properties: properties });
222
- };
223
-
224
-
225
- const handleViewHome = () => {
226
- Adbrix.logEvent({ eventName: ABEvent.VIEW_HOME });
227
- };
228
-
229
-
230
- const handleCategoryView = () => {
231
- const item = ABItem()
232
- .productId('상품번호')
233
- .productName('상품이름')
234
- .category1('식품')
235
- .category2('과자')
236
- .price(5000.0)
237
- .discount(0.0)
238
- .quantity(1)
239
- .currency(ABCurrency.KRW)
240
- .build();
241
-
242
- const properties = ABProperty
243
- .items([item])
244
- .category1('식품')
245
- .category2('과자')
246
- .build();
247
-
248
- Adbrix.logEvent({
249
- eventName: ABEvent.CATEGORY_VIEW,
250
- properties: properties
251
- });
252
- };
253
-
254
- const handleProductView = () => {
255
- const item = ABItem()
256
- .productId('상품번호')
257
- .productName('상품이름')
258
- .category1('식품')
259
- .category2('과자')
260
- .price(5000.0)
261
- .discount(0.0)
262
- .quantity(1)
263
- .currency(ABCurrency.KRW)
264
- .build();
265
-
266
- const properties = ABProperty
267
- .items([item])
268
- .build();
269
-
270
- Adbrix.logEvent({
271
- eventName: ABEvent.PRODUCT_VIEW,
272
- properties: properties
273
- });
274
- };
275
-
276
- const handleAddToCart = () => {
277
- const item = ABItem()
278
- .productId('상품번호')
279
- .productName('상품이름')
280
- .category1('식품')
281
- .category2('과자')
282
- .price(5000.0)
283
- .discount(0.0)
284
- .quantity(1)
285
- .build();
286
-
287
- const properties = ABProperty
288
- .items([item])
289
- .build();
290
-
291
- Adbrix.logEvent({
292
- eventName: ABEvent.ADD_TO_CART,
293
- properties: properties
294
- });
295
- };
296
-
297
- const handleAddToWishlist = () => {
298
- const item = ABItem()
299
- .productId('상품번호')
300
- .productName('상품이름')
301
- .category1('식품')
302
- .category2('과자')
303
- .price(5000.0)
304
- .discount(0.0)
305
- .quantity(1)
306
- .build();
307
-
308
- const properties = ABProperty
309
- .items([item])
310
- .build();
311
-
312
- Adbrix.logEvent({
313
- eventName: ABEvent.ADD_TO_WISHLIST,
314
- properties: properties
315
- });
316
- };
317
-
318
- const handleReviewOrder = () => {
319
- const item = ABItem()
320
- .productId('상품번호')
321
- .productName('상품이름')
322
- .category1('식품')
323
- .category2('과자')
324
- .price(5000.0)
325
- .discount(0.0)
326
- .quantity(1)
327
- .currency(ABCurrency.KRW)
328
- .build();
329
-
330
- const properties = ABProperty
331
- .items([item])
332
- .orderId('상품번호')
333
- .deliveryCharge(3000.0)
334
- .discount(0.0)
335
- .build();
336
-
337
- Adbrix.logEvent({
338
- eventName: ABEvent.REVIEW_ORDER,
339
- properties: properties
340
- });
341
- };
342
-
343
- const handleRefund = () => {
344
- const item = ABItem()
345
- .productId('상품번호')
346
- .productName('상품이름')
347
- .category1('식품')
348
- .category2('과자')
349
- .price(5000.0)
350
- .discount(0.0)
351
- .quantity(1)
352
- .build();
353
-
354
- const properties = ABProperty
355
- .items([item])
356
- .orderId('주문번호')
357
- .penaltyCharge(0.0)
358
- .build();
359
-
360
- Adbrix.logEvent({
361
- eventName: ABEvent.REFUND,
362
- properties: properties
363
- });
364
- };
365
-
366
- const handleSearch = () => {
367
- const item = ABItem()
368
- .productId('상품번호')
369
- .productName('상품이름')
370
- .category1('식품')
371
- .category2('과자')
372
- .price(5000.0)
373
- .discount(0.0)
374
- .quantity(1)
375
- .build();
376
-
377
- const properties = ABProperty
378
- .items([item])
379
- .keyword('삼겹살')
380
- .build();
381
-
382
- Adbrix.logEvent({
383
- eventName: ABEvent.SEARCH,
384
- properties: properties
385
- });
386
- };
387
-
388
- const handleShare = () => {
389
- const item = ABItem()
390
- .productId('상품번호')
391
- .productName('상품이름')
392
- .category1('식품')
393
- .category2('과자')
394
- .price(5000.0)
395
- .discount(0.0)
396
- .quantity(1)
397
- .currency(ABCurrency.KRW)
398
- .build();
399
-
400
- const properties = ABProperty
401
- .items([item])
402
- .sharingChannel(ABSharingChannel.FACEBOOK)
403
- .build();
404
-
405
- Adbrix.logEvent({
406
- eventName: ABEvent.SHARE,
407
- properties: properties
408
- });
409
- };
410
-
411
- const handleListView = () => {
412
- const item = ABItem()
413
- .productId('상품번호')
414
- .productName('상품이름')
415
- .category1('식품')
416
- .category2('과자')
417
- .price(5000.0)
418
- .discount(0.0)
419
- .quantity(1)
420
- .build();
421
-
422
- const properties = ABProperty
423
- .items([item])
424
- .build();
425
-
426
- Adbrix.logEvent({
427
- eventName: ABEvent.LIST_VIEW,
428
- properties: properties
429
- });
430
- };
431
-
432
- const handleCartView = () => {
433
- const item = ABItem()
434
- .productId('상품번호')
435
- .productName('상품이름')
436
- .category1('식품')
437
- .category2('과자')
438
- .price(5000.0)
439
- .discount(0.0)
440
- .quantity(1)
441
- .build();
442
-
443
- const properties = ABProperty
444
- .items([item])
445
- .build();
446
-
447
- Adbrix.logEvent({
448
- eventName: ABEvent.CART_VIEW,
449
- properties: properties
450
- });
451
- };
452
-
453
-
454
- const handlePaymentInfoAdded = () => {
455
- Adbrix.logEvent({ eventName: ABEvent.PAYMENT_INFO_ADDED });
456
- };
457
-
458
- const handleTutorialCompleted = () => {
459
- const properties = ABProperty
460
- .isSkip(true)
461
- .build();
462
-
463
- Adbrix.logEvent({
464
- eventName: ABEvent.TUTORIAL_COMPLETED,
465
- properties: properties
466
- });
467
- };
468
-
469
- const handleCharacterCreated = () => {
470
- Adbrix.logEvent({ eventName: ABEvent.CHARACTER_CREATED });
471
- };
472
-
473
- const handleStageCleared = () => {
474
- const properties = ABProperty
475
- .stage('STAGE_NAME')
476
- .build();
477
-
478
- Adbrix.logEvent({
479
- eventName: ABEvent.STAGE_CLEARED,
480
- properties: properties
481
- });
482
- };
483
-
484
- const handleLevelAchieved = () => {
485
- const properties = ABProperty
486
- .level(100)
487
- .build();
488
-
489
- Adbrix.logEvent({
490
- eventName: ABEvent.LEVEL_ACHIEVED,
491
- properties: properties
492
- });
493
- };
494
-
495
- const handleCustomEvent = () => {
496
- const properties = ABProperty
497
- .customBool('is_logined', true)
498
- .customString('username', 'hello')
499
- .customLong('visit_count', 1000)
500
- .build();
501
-
502
- Adbrix.logEvent({
503
- eventName: 'custom_event_1',
504
- properties: properties
505
- });
506
- };
507
-
508
- const handleEnableSDK = () => {
509
- Adbrix.enableSDK();
510
- };
511
-
512
- const handleDisableSDK = () => {
513
- Adbrix.disableSDK();
514
- };
515
-
516
-
517
- // 단건 아이템 테스트 함수
518
- const handleSingleItemTest = () => {
519
- // 단일 아이템 생성
520
- const singleItem = ABItem()
521
- .productId('single_product')
522
- .productName('단일상품')
523
- .price(50000)
524
- .quantity(1)
525
- .category1('테스트')
526
- .customString('test_field', '단건테스트')
527
- .build();
528
-
529
- // 단건 아이템을 Properties에 전달 (배열이 아님!)
530
- const singleItemProperties = ABProperty
531
- .items(singleItem) // 배열이 아닌 단건 객체 전달
532
- .orderId('SINGLE_ORDER_001')
533
- .orderSales(50000)
534
- .build();
535
-
536
- Adbrix.logEvent({
537
- eventName: ABEvent.PRODUCT_VIEW,
538
- properties: singleItemProperties
539
- });
540
- };
541
-
542
-
543
- return (
544
- <SafeAreaView style={styles.safeArea}>
545
- <ScrollView style={styles.container}>
546
- <View style={styles.header}>
547
- <Text style={styles.title}>Adbrix Demo</Text>
548
- {deepLink && (
549
- <Text style={styles.deepLinkText}>
550
- 마지막 딥링크: {deepLink}
551
- </Text>
552
- )}
553
- </View>
554
-
555
- {/* ATT 섹션 */}
556
- <Text style={styles.sectionTitle}>ATT</Text>
557
- <TouchableOpacity style={styles.button} onPress={requestTrackingAuthorization}>
558
- <Text style={styles.buttonText}>requestTrackingAuthorization</Text>
559
- </TouchableOpacity>
560
-
561
- {/* LogEvent 섹션 */}
562
- <Text style={styles.sectionTitle}>LogEvent</Text>
563
-
564
- {/* UserAnalytics */}
565
- <Text style={styles.subSectionTitle}>UserAnalytics</Text>
566
- <TouchableOpacity style={styles.button} onPress={handleLogin}>
567
- <Text style={styles.buttonText}>Login</Text>
568
- </TouchableOpacity>
569
-
570
- <TouchableOpacity style={styles.button} onPress={handleLogout}>
571
- <Text style={styles.buttonText}>Logout</Text>
572
- </TouchableOpacity>
573
-
574
- {/* Common */}
575
- <Text style={styles.subSectionTitle}>Common</Text>
576
- <TouchableOpacity style={styles.button} onPress={handleSignUp}>
577
- <Text style={styles.buttonText}>Sign Up</Text>
578
- </TouchableOpacity>
579
-
580
- <TouchableOpacity style={styles.button} onPress={handlePurchase}>
581
- <Text style={styles.buttonText}>Purchase</Text>
582
- </TouchableOpacity>
583
-
584
- <TouchableOpacity style={styles.button} onPress={handleSingleItemTest}>
585
- <Text style={styles.buttonText}>Single Item Test</Text>
586
- </TouchableOpacity>
587
-
588
- <TouchableOpacity style={styles.button} onPress={handleInvite}>
589
- <Text style={styles.buttonText}>Invite</Text>
590
- </TouchableOpacity>
591
-
592
- <TouchableOpacity style={styles.button} onPress={handleUseCredit}>
593
- <Text style={styles.buttonText}>UseCredit</Text>
594
- </TouchableOpacity>
595
-
596
- <TouchableOpacity style={styles.button} onPress={handleAppUpdate}>
597
- <Text style={styles.buttonText}>AppUpdate</Text>
598
- </TouchableOpacity>
599
-
600
- {/* Commerce */}
601
- <Text style={styles.subSectionTitle}>Commerce</Text>
602
- <TouchableOpacity style={styles.button} onPress={handleViewHome}>
603
- <Text style={styles.buttonText}>View Home</Text>
604
- </TouchableOpacity>
605
-
606
- <TouchableOpacity style={styles.button} onPress={handleProductView}>
607
- <Text style={styles.buttonText}>Product View</Text>
608
- </TouchableOpacity>
609
-
610
- <TouchableOpacity style={styles.button} onPress={handleAddToCart}>
611
- <Text style={styles.buttonText}>Add To Cart</Text>
612
- </TouchableOpacity>
613
-
614
- <TouchableOpacity style={styles.button} onPress={handleAddToWishlist}>
615
- <Text style={styles.buttonText}>Add To Wishlist</Text>
616
- </TouchableOpacity>
617
-
618
- <TouchableOpacity style={styles.button} onPress={handleRefund}>
619
- <Text style={styles.buttonText}>Refund</Text>
620
- </TouchableOpacity>
621
-
622
- <TouchableOpacity style={styles.button} onPress={handleSearch}>
623
- <Text style={styles.buttonText}>Search</Text>
624
- </TouchableOpacity>
625
-
626
- <TouchableOpacity style={styles.button} onPress={handleListView}>
627
- <Text style={styles.buttonText}>List View</Text>
628
- </TouchableOpacity>
629
-
630
- <TouchableOpacity style={styles.button} onPress={handleCartView}>
631
- <Text style={styles.buttonText}>Cart View</Text>
632
- </TouchableOpacity>
633
-
634
- <TouchableOpacity style={styles.button} onPress={handleReviewOrder}>
635
- <Text style={styles.buttonText}>ReviewOrder</Text>
636
- </TouchableOpacity>
637
-
638
- <TouchableOpacity style={styles.button} onPress={handleShare}>
639
- <Text style={styles.buttonText}>Share</Text>
640
- </TouchableOpacity>
641
-
642
- <TouchableOpacity style={styles.button} onPress={handlePaymentInfoAdded}>
643
- <Text style={styles.buttonText}>Payment Info Added</Text>
644
- </TouchableOpacity>
645
-
646
- <TouchableOpacity style={styles.button} onPress={handleCategoryView}>
647
- <Text style={styles.buttonText}>CategoryView</Text>
648
- </TouchableOpacity>
649
-
650
- {/* Game */}
651
- <Text style={styles.subSectionTitle}>Game</Text>
652
- <TouchableOpacity style={styles.button} onPress={handleLevelAchieved}>
653
- <Text style={styles.buttonText}>LevelArchived</Text>
654
- </TouchableOpacity>
655
-
656
- <TouchableOpacity style={styles.button} onPress={handleTutorialCompleted}>
657
- <Text style={styles.buttonText}>TutorialCompleted</Text>
658
- </TouchableOpacity>
659
-
660
- <TouchableOpacity style={styles.button} onPress={handleCharacterCreated}>
661
- <Text style={styles.buttonText}>CharacterCreated</Text>
662
- </TouchableOpacity>
663
-
664
- <TouchableOpacity style={styles.button} onPress={handleStageCleared}>
665
- <Text style={styles.buttonText}>StageCleared</Text>
666
- </TouchableOpacity>
667
-
668
- {/* CustomEvent */}
669
- <Text style={styles.subSectionTitle}>CustomEvent</Text>
670
- <TouchableOpacity style={styles.button} onPress={handleCustomEvent}>
671
- <Text style={styles.buttonText}>Custom Event</Text>
672
- </TouchableOpacity>
673
-
674
- {/* Dfinery */}
675
- <Text style={styles.subSectionTitle}>Dfinery</Text>
676
- <TouchableOpacity style={styles.button} onPress={handleEnableSDK}>
677
- <Text style={styles.buttonText}>enableSDK</Text>
678
- </TouchableOpacity>
679
-
680
- <TouchableOpacity style={styles.button} onPress={handleDisableSDK}>
681
- <Text style={styles.buttonText}>disableSDK</Text>
682
- </TouchableOpacity>
683
-
684
- <View style={styles.footer} />
685
- </ScrollView>
686
- </SafeAreaView>
687
- );
688
- }
689
-
690
- const styles = StyleSheet.create({
691
- safeArea: {
692
- flex: 1,
693
- backgroundColor: '#2196F3',
694
- },
695
- container: {
696
- flex: 1,
697
- backgroundColor: '#f5f5f5',
698
- },
699
- header: {
700
- backgroundColor: '#2196F3',
701
- padding: 12,
702
- alignItems: 'center',
703
- },
704
- title: {
705
- fontSize: 20,
706
- fontWeight: 'bold',
707
- color: '#ffffff',
708
- marginBottom: 4,
709
- },
710
- deepLinkText: {
711
- fontSize: 10,
712
- color: '#ffffff',
713
- textAlign: 'center',
714
- },
715
- sectionTitle: {
716
- fontSize: 16,
717
- fontWeight: 'bold',
718
- color: '#333',
719
- marginTop: 12,
720
- marginBottom: 6,
721
- marginHorizontal: 12,
722
- },
723
- subSectionTitle: {
724
- fontSize: 14,
725
- fontWeight: '600',
726
- color: '#555',
727
- marginTop: 8,
728
- marginBottom: 4,
729
- marginHorizontal: 12,
730
- },
731
- button: {
732
- backgroundColor: '#2196F3',
733
- margin: 4,
734
- marginHorizontal: 12,
735
- padding: 10,
736
- borderRadius: 6,
737
- elevation: 1,
738
- shadowColor: '#000',
739
- shadowOffset: {
740
- width: 0,
741
- height: 1,
742
- },
743
- shadowOpacity: 0.18,
744
- shadowRadius: 1.0,
745
- },
746
- buttonText: {
747
- color: '#ffffff',
748
- fontSize: 13,
749
- fontWeight: '500',
750
- textAlign: 'center',
751
- },
752
- footer: {
753
- height: 12,
754
- },
755
- });