@onairos/react-native 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/lib/commonjs/components/OnairosButton.js +6 -415
  2. package/lib/commonjs/components/OnairosButton.js.map +1 -1
  3. package/lib/commonjs/components/Overlay.js +0 -549
  4. package/lib/commonjs/components/PinInput.js +160 -0
  5. package/lib/commonjs/components/PinInput.js.map +1 -0
  6. package/lib/commonjs/components/PlatformList.js +137 -0
  7. package/lib/commonjs/components/PlatformList.js.map +1 -0
  8. package/lib/commonjs/components/TrainingModal.js +130 -0
  9. package/lib/commonjs/components/TrainingModal.js.map +1 -0
  10. package/lib/commonjs/index.js +12 -276
  11. package/lib/commonjs/index.js.map +1 -1
  12. package/lib/module/components/OnairosButton.js +121 -514
  13. package/lib/module/components/OnairosButton.js.map +1 -1
  14. package/lib/module/components/Overlay.js +0 -565
  15. package/lib/module/components/PinInput.js +151 -0
  16. package/lib/module/components/PinInput.js.map +1 -0
  17. package/lib/module/components/PlatformList.js +129 -0
  18. package/lib/module/components/PlatformList.js.map +1 -0
  19. package/lib/module/components/TrainingModal.js +122 -0
  20. package/lib/module/components/TrainingModal.js.map +1 -0
  21. package/package.json +5 -4
  22. package/src/components/OnairosButton.tsx +5 -5
  23. package/src/components/PinInput.tsx +189 -0
  24. package/src/components/PlatformList.tsx +145 -0
  25. package/src/components/TrainingModal.tsx +132 -0
  26. package/lib/commonjs/components/Notification.js +0 -106
  27. package/lib/commonjs/components/Notification.js.map +0 -1
  28. package/lib/module/components/Notification.js +0 -99
  29. package/lib/module/components/Notification.js.map +0 -1
  30. package/src/components/Notification.js +0 -101
  31. package/src/components/OnairosButton.js +0 -604
  32. package/src/components/Overlay.js +0 -854
@@ -266,553 +266,4 @@ const styles = _reactNative.StyleSheet.create({
266
266
  marginLeft: 4
267
267
  }
268
268
  });
269
- //# sourceMappingURL=Overlay.js.map setLoginError('Please enter both username and password');
270
- return;
271
- }
272
- setIsLoading(true);
273
- setLoginError('');
274
- try {
275
- const response = await _axios.default.post(`${API_URL}/login`, {
276
- username,
277
- password
278
- });
279
- if (response.status === 200) {
280
- // Store the token
281
- await _asyncStorage.default.setItem('onairosToken', response.data.token);
282
- await _asyncStorage.default.setItem('username', username);
283
-
284
- // Update authentication state
285
- await onLoginSuccess(username, false);
286
- } else {
287
- setLoginError('Invalid username or password');
288
- }
289
- } catch (error) {
290
- console.error('Login failed:', error);
291
- setLoginError('Login failed. Please check your credentials.');
292
- } finally {
293
- setIsLoading(false);
294
- }
295
- };
296
-
297
- // Render login form
298
- const renderLoginForm = () => /*#__PURE__*/_react.default.createElement(_reactNative.View, {
299
- style: styles.loginContainer
300
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
301
- style: styles.loginTitle
302
- }, "Sign in to Onairos"), loginError ? /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
303
- style: styles.errorText
304
- }, loginError) : null, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
305
- style: styles.inputContainer
306
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
307
- style: styles.inputLabel
308
- }, "Username"), /*#__PURE__*/_react.default.createElement(_reactNative.TextInput, {
309
- style: styles.input,
310
- value: username,
311
- onChangeText: setUsername,
312
- placeholder: "Enter your username",
313
- autoCapitalize: "none"
314
- })), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
315
- style: styles.inputContainer
316
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
317
- style: styles.inputLabel
318
- }, "Password"), /*#__PURE__*/_react.default.createElement(_reactNative.TextInput, {
319
- style: styles.input,
320
- value: password,
321
- onChangeText: setPassword,
322
- placeholder: "Enter your password",
323
- secureTextEntry: true
324
- })), /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
325
- style: styles.loginButton,
326
- onPress: handleUsernameLogin,
327
- disabled: isLoading
328
- }, isLoading ? /*#__PURE__*/_react.default.createElement(_reactNative.ActivityIndicator, {
329
- color: "#fff",
330
- size: "small"
331
- }) : /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
332
- style: styles.loginButtonText
333
- }, "Sign In")), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
334
- style: styles.divider
335
- }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
336
- style: styles.dividerLine
337
- }), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
338
- style: styles.dividerText
339
- }, "OR"), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
340
- style: styles.dividerLine
341
- })), /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
342
- style: styles.othentButton,
343
- onPress: handleOthentLogin,
344
- disabled: isLoading
345
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Image, {
346
- source: {
347
- uri: 'https://onairos.sirv.com/Images/othent-logo.png'
348
- },
349
- style: styles.othentLogo
350
- }), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
351
- style: styles.othentButtonText
352
- }, "Continue with Othent")));
353
-
354
- // Render onboarding step
355
- const renderOnboarding = () => /*#__PURE__*/_react.default.createElement(_reactNative.View, {
356
- style: styles.onboardingContainer
357
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
358
- style: styles.onboardingTitle
359
- }, "Connect Your Accounts"), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
360
- style: styles.onboardingSubtitle
361
- }, "Select the social media accounts you want to connect to Onairos"), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
362
- style: styles.socialAccountsContainer
363
- }, socialPlatforms.map(platform => /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
364
- key: platform.id,
365
- style: [styles.socialAccount, selectedSocialAccounts.includes(platform.id) && styles.selectedSocialAccount],
366
- onPress: () => toggleSocialAccount(platform.id)
367
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Image, {
368
- source: {
369
- uri: platform.icon
370
- },
371
- style: styles.socialIcon
372
- }), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
373
- style: styles.socialName
374
- }, platform.name), selectedSocialAccounts.includes(platform.id) && /*#__PURE__*/_react.default.createElement(_MaterialIcons.default, {
375
- name: "check-circle",
376
- size: 24,
377
- color: "#4CAF50",
378
- style: styles.checkIcon
379
- })))), /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
380
- style: [styles.nextButton, selectedSocialAccounts.length === 0 && styles.disabledButton],
381
- onPress: startTraining,
382
- disabled: selectedSocialAccounts.length === 0 || isTraining
383
- }, isTraining ? /*#__PURE__*/_react.default.createElement(_reactNative.ActivityIndicator, {
384
- color: "#fff",
385
- size: "small"
386
- }) : /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
387
- style: styles.nextButtonText
388
- }, "Continue")));
389
-
390
- // Render training progress
391
- const renderTraining = () => /*#__PURE__*/_react.default.createElement(_reactNative.View, {
392
- style: styles.trainingContainer
393
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
394
- style: styles.trainingTitle
395
- }, "Training Your Model"), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
396
- style: styles.trainingSubtitle
397
- }, "Please wait while we train your personalized AI model"), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
398
- style: styles.progressBarContainer
399
- }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
400
- style: [styles.progressBar, {
401
- width: `${trainingProgress}%`
402
- }]
403
- })), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
404
- style: styles.progressText
405
- }, trainingProgress, "% Complete"));
406
-
407
- // Render PIN creation step
408
- const renderCreatePin = () => /*#__PURE__*/_react.default.createElement(_reactNative.View, {
409
- style: styles.pinContainer
410
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
411
- style: styles.pinTitle
412
- }, "Create Your PIN"), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
413
- style: styles.pinSubtitle
414
- }, "This PIN will be used to secure your data"), pinError ? /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
415
- style: styles.errorText
416
- }, pinError) : null, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
417
- style: styles.inputContainer
418
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
419
- style: styles.inputLabel
420
- }, "PIN"), /*#__PURE__*/_react.default.createElement(_reactNative.TextInput, {
421
- style: styles.input,
422
- value: pin,
423
- onChangeText: setPin,
424
- placeholder: "Enter a 4-digit PIN",
425
- keyboardType: "numeric",
426
- secureTextEntry: true,
427
- maxLength: 4
428
- })), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
429
- style: styles.inputContainer
430
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
431
- style: styles.inputLabel
432
- }, "Confirm PIN"), /*#__PURE__*/_react.default.createElement(_reactNative.TextInput, {
433
- style: styles.input,
434
- value: confirmPin,
435
- onChangeText: setConfirmPin,
436
- placeholder: "Confirm your PIN",
437
- keyboardType: "numeric",
438
- secureTextEntry: true,
439
- maxLength: 4
440
- })), /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
441
- style: styles.nextButton,
442
- onPress: handleCreatePin,
443
- disabled: isLoading
444
- }, isLoading ? /*#__PURE__*/_react.default.createElement(_reactNative.ActivityIndicator, {
445
- color: "#fff",
446
- size: "small"
447
- }) : /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
448
- style: styles.nextButtonText
449
- }, "Complete Setup")));
450
-
451
- // Render data request step
452
- const renderDataRequest = () => /*#__PURE__*/_react.default.createElement(_reactNative.View, {
453
- style: styles.dataRequestContainer
454
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
455
- style: styles.dataRequestTitle
456
- }, dataRequester, " is requesting access to your data"), /*#__PURE__*/_react.default.createElement(_reactNative.ScrollView, {
457
- style: styles.requestsScrollView
458
- }, Object.keys(requestData).map(key => /*#__PURE__*/_react.default.createElement(_reactNative.View, {
459
- key: key,
460
- style: styles.requestSection
461
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
462
- style: styles.requestSectionTitle
463
- }, key, " Data Request"), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
464
- style: styles.requestDescription
465
- }, requestData[key].descriptions), /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
466
- style: [styles.requestToggle, selectedConnections.some(conn => conn.key === key && conn.dataRequester === dataRequester) && styles.requestToggleSelected],
467
- onPress: () => toggleDataRequest(dataRequester, key, 0, requestData[key].type, requestData[key].reward)
468
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
469
- style: styles.requestToggleText
470
- }, selectedConnections.some(conn => conn.key === key && conn.dataRequester === dataRequester) ? 'Selected' : 'Select'))))), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
471
- style: styles.actionButtonsContainer
472
- }, /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
473
- style: styles.rejectButton,
474
- onPress: rejectDataRequest
475
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
476
- style: styles.rejectButtonText
477
- }, "Reject")), /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
478
- style: [styles.approveButton, !allowSubmit && styles.disabledButton],
479
- onPress: sendDataRequest,
480
- disabled: !allowSubmit || isLoading
481
- }, isLoading ? /*#__PURE__*/_react.default.createElement(_reactNative.ActivityIndicator, {
482
- color: "#fff",
483
- size: "small"
484
- }) : /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
485
- style: styles.approveButtonText
486
- }, "Approve"))));
487
-
488
- // Render content based on current step
489
- const renderContent = () => {
490
- if (!isAuthenticated && currentStep !== 'onboarding') {
491
- return renderLoginForm();
492
- }
493
- switch (currentStep) {
494
- case 'onboarding':
495
- return renderOnboarding();
496
- case 'training':
497
- return renderTraining();
498
- case 'createPin':
499
- return renderCreatePin();
500
- case 'dataRequest':
501
- return renderDataRequest();
502
- default:
503
- return renderDataRequest();
504
- }
505
- };
506
- return /*#__PURE__*/_react.default.createElement(_reactNativeModal.default, {
507
- isVisible: true,
508
- onBackdropPress: onClose,
509
- onBackButtonPress: onClose,
510
- style: styles.modal,
511
- swipeDirection: "down",
512
- onSwipeComplete: onClose,
513
- propagateSwipe: true,
514
- avoidKeyboard: true
515
- }, /*#__PURE__*/_react.default.createElement(_reactNative.KeyboardAvoidingView, {
516
- behavior: _reactNative.Platform.OS === 'ios' ? 'padding' : 'height',
517
- style: styles.keyboardAvoidingView
518
- }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
519
- style: styles.modalContent
520
- }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
521
- style: styles.modalHeader
522
- }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
523
- style: styles.dragIndicator
524
- }), /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
525
- style: styles.closeButton,
526
- onPress: onClose
527
- }, /*#__PURE__*/_react.default.createElement(_MaterialIcons.default, {
528
- name: "close",
529
- size: 24,
530
- color: "#333"
531
- }))), renderContent())));
532
- };
533
- const styles = _reactNative.StyleSheet.create({
534
- modal: {
535
- justifyContent: 'flex-end',
536
- margin: 0
537
- },
538
- keyboardAvoidingView: {
539
- width: '100%'
540
- },
541
- modalContent: {
542
- backgroundColor: 'white',
543
- borderTopLeftRadius: 20,
544
- borderTopRightRadius: 20,
545
- paddingHorizontal: 20,
546
- paddingBottom: 20,
547
- maxHeight: height * 0.8
548
- },
549
- modalHeader: {
550
- flexDirection: 'row',
551
- justifyContent: 'center',
552
- alignItems: 'center',
553
- paddingVertical: 10,
554
- position: 'relative'
555
- },
556
- dragIndicator: {
557
- width: 40,
558
- height: 5,
559
- backgroundColor: '#ccc',
560
- borderRadius: 3
561
- },
562
- closeButton: {
563
- position: 'absolute',
564
- right: 0,
565
- top: 10
566
- },
567
- // Login styles
568
- loginContainer: {
569
- padding: 16
570
- },
571
- loginTitle: {
572
- fontSize: 24,
573
- fontWeight: 'bold',
574
- marginBottom: 20,
575
- textAlign: 'center'
576
- },
577
- inputContainer: {
578
- marginBottom: 16
579
- },
580
- inputLabel: {
581
- fontSize: 16,
582
- marginBottom: 8,
583
- color: '#333'
584
- },
585
- input: {
586
- borderWidth: 1,
587
- borderColor: '#ccc',
588
- borderRadius: 8,
589
- padding: 12,
590
- fontSize: 16
591
- },
592
- loginButton: {
593
- backgroundColor: '#2196F3',
594
- borderRadius: 8,
595
- padding: 16,
596
- alignItems: 'center',
597
- marginTop: 8
598
- },
599
- loginButtonText: {
600
- color: 'white',
601
- fontSize: 16,
602
- fontWeight: 'bold'
603
- },
604
- divider: {
605
- flexDirection: 'row',
606
- alignItems: 'center',
607
- marginVertical: 20
608
- },
609
- dividerLine: {
610
- flex: 1,
611
- height: 1,
612
- backgroundColor: '#ccc'
613
- },
614
- dividerText: {
615
- marginHorizontal: 10,
616
- color: '#666'
617
- },
618
- othentButton: {
619
- flexDirection: 'row',
620
- alignItems: 'center',
621
- justifyContent: 'center',
622
- backgroundColor: '#f5f5f5',
623
- borderRadius: 8,
624
- padding: 16,
625
- borderWidth: 1,
626
- borderColor: '#ddd'
627
- },
628
- othentLogo: {
629
- width: 24,
630
- height: 24,
631
- marginRight: 10
632
- },
633
- othentButtonText: {
634
- fontSize: 16,
635
- color: '#333'
636
- },
637
- // Onboarding styles
638
- onboardingContainer: {
639
- padding: 16
640
- },
641
- onboardingTitle: {
642
- fontSize: 24,
643
- fontWeight: 'bold',
644
- marginBottom: 8
645
- },
646
- onboardingSubtitle: {
647
- fontSize: 16,
648
- color: '#666',
649
- marginBottom: 20
650
- },
651
- socialAccountsContainer: {
652
- marginBottom: 20
653
- },
654
- socialAccount: {
655
- flexDirection: 'row',
656
- alignItems: 'center',
657
- padding: 16,
658
- borderWidth: 1,
659
- borderColor: '#ddd',
660
- borderRadius: 8,
661
- marginBottom: 10
662
- },
663
- selectedSocialAccount: {
664
- borderColor: '#4CAF50',
665
- backgroundColor: 'rgba(76, 175, 80, 0.1)'
666
- },
667
- socialIcon: {
668
- width: 24,
669
- height: 24,
670
- marginRight: 16
671
- },
672
- socialName: {
673
- fontSize: 16,
674
- flex: 1
675
- },
676
- checkIcon: {
677
- marginLeft: 8
678
- },
679
- nextButton: {
680
- backgroundColor: '#4CAF50',
681
- borderRadius: 8,
682
- padding: 16,
683
- alignItems: 'center'
684
- },
685
- nextButtonText: {
686
- color: 'white',
687
- fontSize: 16,
688
- fontWeight: 'bold'
689
- },
690
- disabledButton: {
691
- backgroundColor: '#ccc'
692
- },
693
- // Training styles
694
- trainingContainer: {
695
- padding: 16,
696
- alignItems: 'center'
697
- },
698
- trainingTitle: {
699
- fontSize: 24,
700
- fontWeight: 'bold',
701
- marginBottom: 8
702
- },
703
- trainingSubtitle: {
704
- fontSize: 16,
705
- color: '#666',
706
- marginBottom: 30,
707
- textAlign: 'center'
708
- },
709
- progressBarContainer: {
710
- width: '100%',
711
- height: 12,
712
- backgroundColor: '#e0e0e0',
713
- borderRadius: 6,
714
- overflow: 'hidden',
715
- marginBottom: 16
716
- },
717
- progressBar: {
718
- height: '100%',
719
- backgroundColor: '#4CAF50'
720
- },
721
- progressText: {
722
- fontSize: 16,
723
- fontWeight: 'bold',
724
- color: '#4CAF50'
725
- },
726
- // PIN styles
727
- pinContainer: {
728
- padding: 16
729
- },
730
- pinTitle: {
731
- fontSize: 24,
732
- fontWeight: 'bold',
733
- marginBottom: 8
734
- },
735
- pinSubtitle: {
736
- fontSize: 16,
737
- color: '#666',
738
- marginBottom: 20
739
- },
740
- errorText: {
741
- color: 'red',
742
- marginBottom: 16
743
- },
744
- // Data request styles
745
- dataRequestContainer: {
746
- padding: 16
747
- },
748
- dataRequestTitle: {
749
- fontSize: 20,
750
- fontWeight: 'bold',
751
- marginBottom: 16
752
- },
753
- requestsScrollView: {
754
- maxHeight: 300
755
- },
756
- requestSection: {
757
- marginBottom: 20,
758
- padding: 16,
759
- borderWidth: 1,
760
- borderColor: '#ddd',
761
- borderRadius: 8
762
- },
763
- requestSectionTitle: {
764
- fontSize: 18,
765
- fontWeight: 'bold',
766
- marginBottom: 8
767
- },
768
- requestDescription: {
769
- fontSize: 14,
770
- color: '#666',
771
- marginBottom: 16
772
- },
773
- requestToggle: {
774
- backgroundColor: '#f5f5f5',
775
- padding: 12,
776
- borderRadius: 8,
777
- alignItems: 'center'
778
- },
779
- requestToggleSelected: {
780
- backgroundColor: '#4CAF50'
781
- },
782
- requestToggleText: {
783
- fontWeight: 'bold'
784
- },
785
- actionButtonsContainer: {
786
- flexDirection: 'row',
787
- justifyContent: 'space-between',
788
- marginTop: 20
789
- },
790
- rejectButton: {
791
- flex: 1,
792
- backgroundColor: '#f5f5f5',
793
- borderRadius: 8,
794
- padding: 16,
795
- alignItems: 'center',
796
- marginRight: 8
797
- },
798
- rejectButtonText: {
799
- color: '#333',
800
- fontSize: 16,
801
- fontWeight: 'bold'
802
- },
803
- approveButton: {
804
- flex: 1,
805
- backgroundColor: '#4CAF50',
806
- borderRadius: 8,
807
- padding: 16,
808
- alignItems: 'center',
809
- marginLeft: 8
810
- },
811
- approveButtonText: {
812
- color: 'white',
813
- fontSize: 16,
814
- fontWeight: 'bold'
815
- }
816
- });
817
- var _default = exports.default = Overlay;
818
269
  //# sourceMappingURL=Overlay.js.map
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.PinInput = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _reactNative = require("react-native");
9
+ var _MaterialIcons = _interopRequireDefault(require("react-native-vector-icons/MaterialIcons"));
10
+ var _constants = require("../constants");
11
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
13
+ const PinInput = ({
14
+ onSubmit,
15
+ minLength = 8,
16
+ requireSpecialChar = true,
17
+ requireNumber = true
18
+ }) => {
19
+ const [pin, setPin] = (0, _react.useState)('');
20
+ const [error, setError] = (0, _react.useState)(null);
21
+ const [showPin, setShowPin] = (0, _react.useState)(false);
22
+ const validatePin = (0, _react.useCallback)(value => {
23
+ if (value.length < minLength) {
24
+ return `PIN must be at least ${minLength} characters`;
25
+ }
26
+ if (requireSpecialChar && !/[!@#$%^&*(),.?":{}|<>]/.test(value)) {
27
+ return 'PIN must include a special character';
28
+ }
29
+ if (requireNumber && !/\d/.test(value)) {
30
+ return 'PIN must include a number';
31
+ }
32
+ return null;
33
+ }, [minLength, requireSpecialChar, requireNumber]);
34
+ const handleSubmit = (0, _react.useCallback)(() => {
35
+ const validationError = validatePin(pin);
36
+ if (validationError) {
37
+ setError(validationError);
38
+ return;
39
+ }
40
+ onSubmit(pin);
41
+ }, [pin, validatePin, onSubmit]);
42
+ const handlePinChange = (0, _react.useCallback)(value => {
43
+ setPin(value);
44
+ setError(null);
45
+ }, []);
46
+ return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
47
+ style: styles.container
48
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
49
+ style: styles.title
50
+ }, "Create your PIN"), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
51
+ style: styles.subtitle
52
+ }, "This PIN will be used to secure your account"), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
53
+ style: styles.inputContainer
54
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.TextInput, {
55
+ style: styles.input,
56
+ value: pin,
57
+ onChangeText: handlePinChange,
58
+ secureTextEntry: !showPin,
59
+ placeholder: "Enter PIN",
60
+ keyboardType: "numeric",
61
+ maxLength: 20,
62
+ autoCapitalize: "none",
63
+ autoCorrect: false
64
+ }), /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
65
+ style: styles.visibilityButton,
66
+ onPress: () => setShowPin(!showPin)
67
+ }, /*#__PURE__*/_react.default.createElement(_MaterialIcons.default, {
68
+ name: showPin ? 'visibility-off' : 'visibility',
69
+ size: 24,
70
+ color: _constants.COLORS.text.secondary
71
+ }))), error && /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
72
+ style: styles.error
73
+ }, error), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
74
+ style: styles.requirements
75
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
76
+ style: styles.requirementTitle
77
+ }, "PIN Requirements:"), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
78
+ style: [styles.requirement, pin.length >= minLength && styles.requirementMet]
79
+ }, "\u2022 At least ", minLength, " characters"), requireSpecialChar && /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
80
+ style: [styles.requirement, /[!@#$%^&*(),.?":{}|<>]/.test(pin) && styles.requirementMet]
81
+ }, "\u2022 Include a special character"), requireNumber && /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
82
+ style: [styles.requirement, /\d/.test(pin) && styles.requirementMet]
83
+ }, "\u2022 Include a number")), /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
84
+ style: [styles.submitButton, !pin && styles.submitButtonDisabled],
85
+ onPress: handleSubmit,
86
+ disabled: !pin
87
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
88
+ style: styles.submitButtonText
89
+ }, "Continue")));
90
+ };
91
+ exports.PinInput = PinInput;
92
+ const styles = _reactNative.StyleSheet.create({
93
+ container: {
94
+ flex: 1,
95
+ padding: 16
96
+ },
97
+ title: {
98
+ fontSize: 20,
99
+ fontWeight: '600',
100
+ marginBottom: 8,
101
+ color: _constants.COLORS.text.primary
102
+ },
103
+ subtitle: {
104
+ fontSize: 14,
105
+ color: _constants.COLORS.text.secondary,
106
+ marginBottom: 24
107
+ },
108
+ inputContainer: {
109
+ flexDirection: 'row',
110
+ alignItems: 'center',
111
+ borderWidth: 1,
112
+ borderColor: _constants.COLORS.border,
113
+ borderRadius: 8,
114
+ marginBottom: 16
115
+ },
116
+ input: {
117
+ flex: 1,
118
+ padding: 12,
119
+ fontSize: 16
120
+ },
121
+ visibilityButton: {
122
+ padding: 12
123
+ },
124
+ error: {
125
+ color: _constants.COLORS.error,
126
+ marginBottom: 16
127
+ },
128
+ requirements: {
129
+ marginBottom: 24
130
+ },
131
+ requirementTitle: {
132
+ fontSize: 14,
133
+ fontWeight: '600',
134
+ marginBottom: 8,
135
+ color: _constants.COLORS.text.primary
136
+ },
137
+ requirement: {
138
+ fontSize: 14,
139
+ color: _constants.COLORS.text.secondary,
140
+ marginBottom: 4
141
+ },
142
+ requirementMet: {
143
+ color: _constants.COLORS.success
144
+ },
145
+ submitButton: {
146
+ backgroundColor: _constants.COLORS.primary,
147
+ paddingVertical: 16,
148
+ borderRadius: 12,
149
+ alignItems: 'center'
150
+ },
151
+ submitButtonDisabled: {
152
+ opacity: 0.5
153
+ },
154
+ submitButtonText: {
155
+ color: '#fff',
156
+ fontSize: 16,
157
+ fontWeight: '600'
158
+ }
159
+ });
160
+ //# sourceMappingURL=PinInput.js.map