@onairos/react-native 3.0.55 โ†’ 3.0.57

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.
@@ -22,6 +22,7 @@ import Icon from 'react-native-vector-icons/MaterialIcons';
22
22
  import { PlatformList } from './PlatformList';
23
23
  import { PinInput } from './PinInput';
24
24
  import { TrainingModal } from './TrainingModal';
25
+ import { DataRequestModal } from './DataRequestModal';
25
26
  import { OAuthWebView } from './onboarding/OAuthWebView';
26
27
  import { useConnections } from '../hooks/useConnections';
27
28
  import { COLORS, DEEP_LINK_CONFIG } from '../constants';
@@ -60,7 +61,7 @@ export const UniversalOnboarding: React.FC<UniversalOnboardingProps> = ({
60
61
  auto = false,
61
62
  partner,
62
63
  }) => {
63
- const [step, setStep] = useState<'email' | 'verify' | 'connect' | 'pin' | 'training' | 'oauth' | 'success'>('email');
64
+ const [step, setStep] = useState<'email' | 'verify' | 'dataRequest' | 'connect' | 'pin' | 'training' | 'oauth' | 'success'>('email');
64
65
  const [connections, setConnections] = useState<ConnectionStatus>({});
65
66
  const [pin, setPin] = useState<string>('');
66
67
  const [selectedTier, setSelectedTier] = useState<'Small' | 'Medium' | 'Large'>('Medium');
@@ -78,6 +79,8 @@ export const UniversalOnboarding: React.FC<UniversalOnboardingProps> = ({
78
79
  const [email, setEmail] = useState<string>('');
79
80
  const [verificationCode, setVerificationCode] = useState<string>('');
80
81
  const [isVerifyingCode, setIsVerifyingCode] = useState<boolean>(false);
82
+ const [showDataRequestModal, setShowDataRequestModal] = useState<boolean>(false);
83
+ const [isExistingUser, setIsExistingUser] = useState<boolean>(false);
81
84
 
82
85
  // Add refs for cleanup
83
86
  const successTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
@@ -495,16 +498,14 @@ export const UniversalOnboarding: React.FC<UniversalOnboardingProps> = ({
495
498
  if (result.success) {
496
499
  console.log('โœ… Email verification successful');
497
500
 
498
- // For now, assume all are new users (existing user detection can be added later)
499
- const isExistingUser = false;
501
+ // For now, always treat as new users for testing (can be updated later)
502
+ // In production, this would check if user exists in database
503
+ const existingUser = false; // TODO: Check backend for existing user
504
+ setIsExistingUser(existingUser);
500
505
 
501
- if (isExistingUser) {
502
- console.log('Existing user detected, skipping onboarding');
503
- onComplete('https://api2.onairos.uk', 'existing-session-token', {
504
- existingAccount: true,
505
- email: email.trim(),
506
- skipOnboarding: true,
507
- });
506
+ if (existingUser) {
507
+ console.log('Existing user detected, showing data request modal');
508
+ setShowDataRequestModal(true);
508
509
  } else {
509
510
  console.log('New user, proceeding to platform connection');
510
511
  setUsername(email.split('@')[0]); // Use email prefix as username
@@ -554,41 +555,62 @@ export const UniversalOnboarding: React.FC<UniversalOnboardingProps> = ({
554
555
  } catch (error) {
555
556
  console.error('Failed to save session data:', error);
556
557
  }
558
+ }, [connections, selectedTier, platformToggles, username, AppName, auto, inferenceData, partner]);
559
+
560
+ const handleTrainingComplete = useCallback(() => {
561
+ console.log('๐ŸŽ‰ Training completed successfully');
557
562
 
558
- // Simulate training progress over 10 seconds
559
- let progress = 0;
560
- const interval = setInterval(() => {
561
- progress += 0.1; // 10% every second for 10 seconds total
562
- setTraining({
563
- progress,
564
- eta: `${Math.round((1 - progress) * 10)} seconds remaining`,
565
- });
566
- if (progress >= 1) {
567
- clearInterval(interval);
568
-
569
- // Prepare completion data
570
- const completionData = {
571
- pin: userPin,
572
- connections,
573
- platformToggles,
574
- selectedTier,
575
- tierData: requestData?.[selectedTier],
576
- sessionSaved: true,
577
- // Add inference data if auto mode is enabled
578
- ...(auto && inferenceData && { inferenceData }),
579
- // Add partner info for special partners
580
- ...(partner && { partner: partner === 'couplebible' ? 'CoupleBible' : partner }),
581
- };
582
-
583
- console.log('Completion data prepared:', completionData);
584
-
585
- // Close overlay and call the original onComplete callback
586
- onComplete('https://api2.onairos.uk', 'dummy-token', completionData);
587
- }
588
- }, 1000); // Update every 1 second
589
- }, [connections, onComplete, selectedTier, requestData, platformToggles, username, AppName, auto, inferenceData, partner]);
563
+ // Prepare completion data
564
+ const completionData = {
565
+ pin,
566
+ connections,
567
+ platformToggles,
568
+ selectedTier,
569
+ tierData: requestData?.[selectedTier],
570
+ sessionSaved: true,
571
+ // Add inference data if auto mode is enabled
572
+ ...(auto && inferenceData && { inferenceData }),
573
+ // Add partner info for special partners
574
+ ...(partner && { partner: partner === 'couplebible' ? 'CoupleBible' : partner }),
575
+ };
576
+
577
+ console.log('Completion data prepared:', completionData);
578
+
579
+ // Close the modal first
580
+ handleClose();
581
+
582
+ // Then call the completion callback
583
+ setTimeout(() => {
584
+ onComplete('https://api2.onairos.uk', 'dummy-token', completionData);
585
+ }, 100);
586
+ }, [pin, connections, platformToggles, selectedTier, requestData, auto, inferenceData, partner, handleClose, onComplete]);
587
+
588
+ const handleDataRequestAccept = useCallback(() => {
589
+ console.log('Data request accepted for existing user');
590
+ setShowDataRequestModal(false);
591
+
592
+ // Complete onboarding for existing user
593
+ onComplete('https://api2.onairos.uk', 'existing-session-token', {
594
+ existingAccount: true,
595
+ email: email.trim(),
596
+ dataRequestAccepted: true,
597
+ requestData,
598
+ });
599
+ }, [email, onComplete, requestData]);
600
+
601
+ const handleDataRequestDecline = useCallback(() => {
602
+ console.log('Data request declined');
603
+ setShowDataRequestModal(false);
604
+ handleClose();
605
+ }, [handleClose]);
590
606
 
591
607
  const canProceedToPin = useCallback(() => {
608
+ // For testing, allow proceeding without any platforms connected
609
+ if (debug || test) {
610
+ console.log('๐Ÿงช Testing mode: Allowing proceed without platform connections');
611
+ return true;
612
+ }
613
+
592
614
  // Check if at least one platform is toggled on
593
615
  const hasPlatformConnected = Object.values(platformToggles).some(value => value === true);
594
616
 
@@ -599,7 +621,7 @@ export const UniversalOnboarding: React.FC<UniversalOnboardingProps> = ({
599
621
  }
600
622
 
601
623
  return hasPlatformConnected;
602
- }, [platformToggles, auto, partner, inferenceData]);
624
+ }, [platformToggles, auto, partner, inferenceData, debug, test]);
603
625
 
604
626
  const handleProceed = () => {
605
627
  console.log('Proceeding to next step');
@@ -904,15 +926,7 @@ export const UniversalOnboarding: React.FC<UniversalOnboardingProps> = ({
904
926
  progress={training.progress}
905
927
  eta={training.eta}
906
928
  onCancel={handleClose}
907
- onComplete={() => {
908
- onComplete('https://api2.onairos.uk', 'dummy-token', {
909
- pin,
910
- connections,
911
- platformToggles,
912
- selectedTier,
913
- tierData: requestData?.[selectedTier],
914
- });
915
- }}
929
+ onComplete={handleTrainingComplete}
916
930
  modelKey="onairosTrainingModel"
917
931
  username={username}
918
932
  />
@@ -938,6 +952,31 @@ export const UniversalOnboarding: React.FC<UniversalOnboardingProps> = ({
938
952
  </TouchableWithoutFeedback>
939
953
  </View>
940
954
  </TouchableWithoutFeedback>
955
+
956
+ {/* Data Request Modal for existing users */}
957
+ {showDataRequestModal && requestData && (
958
+ <DataRequestModal
959
+ visible={showDataRequestModal}
960
+ onClose={handleDataRequestDecline}
961
+ onAccept={handleDataRequestAccept}
962
+ requestData={{
963
+ // Convert DataTier format to expected format
964
+ Small: {
965
+ description: requestData.Small?.descriptions || 'Basic data access',
966
+ type: requestData.Small?.type || 'basic'
967
+ },
968
+ Medium: {
969
+ description: requestData.Medium?.descriptions || 'Standard data access',
970
+ type: requestData.Medium?.type || 'standard'
971
+ },
972
+ Large: {
973
+ description: requestData.Large?.descriptions || 'Full data access',
974
+ type: requestData.Large?.type || 'full'
975
+ }
976
+ }}
977
+ AppName={AppName}
978
+ />
979
+ )}
941
980
  </Modal>
942
981
  );
943
982
  };
@@ -952,7 +991,7 @@ const styles = StyleSheet.create({
952
991
  bottomSheet: {
953
992
  backgroundColor: '#fff',
954
993
  width: width,
955
- height: height * 0.6,
994
+ height: height * 0.8,
956
995
  borderTopLeftRadius: 24,
957
996
  borderTopRightRadius: 24,
958
997
  overflow: 'hidden',
@@ -1180,9 +1219,10 @@ const styles = StyleSheet.create({
1180
1219
  // Email input styles
1181
1220
  emailInputContainer: {
1182
1221
  flex: 1,
1183
- justifyContent: 'center',
1222
+ justifyContent: 'flex-start',
1184
1223
  alignItems: 'center',
1185
1224
  padding: 24,
1225
+ paddingTop: 60,
1186
1226
  },
1187
1227
  emailHeader: {
1188
1228
  alignItems: 'center',