@onairos/react-native 3.0.9 → 3.0.10

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 (29) hide show
  1. package/lib/commonjs/assets/images/onairos_logo.svg +6 -0
  2. package/lib/commonjs/components/Onairos.js +214 -60
  3. package/lib/commonjs/components/Onairos.js.map +1 -1
  4. package/lib/commonjs/components/OnairosButton.js +105 -42
  5. package/lib/commonjs/components/OnairosButton.js.map +1 -1
  6. package/lib/commonjs/components/UniversalOnboarding.js +98 -26
  7. package/lib/commonjs/components/UniversalOnboarding.js.map +1 -1
  8. package/lib/module/assets/images/onairos_logo.svg +6 -0
  9. package/lib/module/components/Onairos.js +217 -62
  10. package/lib/module/components/Onairos.js.map +1 -1
  11. package/lib/module/components/OnairosButton.js +107 -43
  12. package/lib/module/components/OnairosButton.js.map +1 -1
  13. package/lib/module/components/UniversalOnboarding.js +100 -28
  14. package/lib/module/components/UniversalOnboarding.js.map +1 -1
  15. package/lib/module/index.js +10 -9
  16. package/lib/module/index.js.map +1 -1
  17. package/lib/typescript/components/Onairos.d.ts +26 -24
  18. package/lib/typescript/components/Onairos.d.ts.map +1 -1
  19. package/lib/typescript/components/OnairosButton.d.ts +5 -1
  20. package/lib/typescript/components/OnairosButton.d.ts.map +1 -1
  21. package/lib/typescript/components/UniversalOnboarding.d.ts.map +1 -1
  22. package/lib/typescript/types.d.ts +2 -1
  23. package/lib/typescript/types.d.ts.map +1 -1
  24. package/package.json +5 -3
  25. package/src/assets/images/onairos_logo.svg +6 -0
  26. package/src/components/Onairos.tsx +283 -89
  27. package/src/components/OnairosButton.tsx +110 -46
  28. package/src/components/UniversalOnboarding.tsx +105 -28
  29. package/src/types.ts +2 -1
@@ -1 +1 @@
1
- {"version":3,"names":["OnairosButton","AuthUtils","CryptoUtils","ApiUtils"],"sourceRoot":"..\\..\\src","sources":["index.js"],"mappings":"AAAA,OAAOA,aAAa,MAAM,4BAA4B;AACtD,OAAO,KAAKC,SAAS,MAAM,cAAc;AACzC,OAAO,KAAKC,WAAW,MAAM,gBAAgB;AAC7C,OAAO,KAAKC,QAAQ,MAAM,aAAa;;AAEvC;AACA,eAAeH,aAAa;;AAE5B;AACA,SACEC,SAAS,EACTC,WAAW,EACXC,QAAQ","ignoreList":[]}
1
+ {"version":3,"names":["Onairos","OnairosButton","Overlay","UniversalOnboarding","OnairosOverlay","Portal","PortalHost","ConnectorScreen","PinCreationScreen","LoadingScreen","OAuthWebView","PlatformConnector","OnboardingHeader","PinInput","useCredentials","useConnections","storeCredentials","getCredentials","hasCredentials","deleteCredentials","updateCredentials","generateDeviceUsername","verifyCredentials","validateCredentials","createAccount","authenticate","refreshToken","getPlatformData","getUserProfile","updatePlatformConnections","rsaEncrypt","sha256","base64ToBuffer","logDebug","logError","isDebugMode","connectPlatform","disconnectPlatform","initializeOAuthService","cleanupOAuthService","storePlatformConnection","COLORS","PLATFORMS","API_ENDPOINTS","STORAGE_KEYS","PIN_REQUIREMENTS","DEEP_LINK_CONFIG","onairosApi","OAuthService","components"],"sourceRoot":"..\\..\\src","sources":["index.ts"],"mappings":"AAAA;AACA;AACA;AACA;;AAEA;AACA,SAASA,OAAO,QAAQ,sBAAsB;AAC9C,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,OAAO,QAAQ,sBAAsB;AAC9C,SAASC,mBAAmB,QAAQ,kCAAkC;;AAEtE;AACA,SAASH,OAAO,QAAQ,sBAAsB;AAC9C,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,OAAO,IAAIE,cAAc,QAAQ,sBAAsB;AAChE,SAASD,mBAAmB,QAAQ,kCAAkC;;AAEtE;AACA,SAASE,MAAM,EAAEC,UAAU,QAAQ,gBAAgB;;AAEnD;AACA,SAASC,eAAe,QAAQ,sCAAsC;AACtE,SAASC,iBAAiB,QAAQ,wCAAwC;AAC1E,SAASC,aAAa,QAAQ,oCAAoC;;AAElE;AACA,SAASC,YAAY,QAAQ,sCAAsC;AACnE,SAASC,iBAAiB,QAAQ,2CAA2C;AAC7E,SAASC,gBAAgB,QAAQ,0CAA0C;AAC3E,SAASC,QAAQ,QAAQ,kCAAkC;;AAE3D;AACA,SAASC,cAAc,QAAQ,wBAAwB;AACvD,SAASC,cAAc,QAAQ,wBAAwB;;AAEvD;AACA,SACEC,gBAAgB,EAChBC,cAAc,EACdC,cAAc,EACdC,iBAAiB,EACjBC,iBAAiB,EACjBC,sBAAsB,EACtBC,iBAAiB,QACZ,uBAAuB;AAE9B,SACEC,mBAAmB,EACnBC,aAAa,EACbC,YAAY,EACZC,YAAY,EACZC,eAAe,EACfC,cAAc,EACdC,yBAAyB,QACpB,oBAAoB;AAE3B,SACEC,UAAU,EACVC,MAAM,EACNC,cAAc,QACT,gBAAgB;AAEvB,SACEC,QAAQ,EACRC,QAAQ,EACRC,WAAW,QACN,qBAAqB;;AAE5B;AACA,SACEC,eAAe,EACfC,kBAAkB,EAClBC,sBAAsB,EACtBC,mBAAmB,EACnBC,uBAAuB,QAClB,yBAAyB;;AAEhC;;AAsBA;AACA,SAASC,MAAM,EAAEC,SAAS,EAAEC,aAAa,EAAEC,YAAY,EAAEC,gBAAgB,EAAEC,gBAAgB,QAAQ,aAAa;;AAEhH;AACA,SAASC,UAAU,QAAQ,OAAO;AAClC,SAASC,YAAY,QAAQ,yBAAyB;AACtD,cAAc,uBAAuB;AACrC,cAAc,oBAAoB;;AAElC;;AAGA,SAAS1C,UAAU,QAAQ,gBAAgB;AAK3C;AACA,MAAM2C,UAAU,GAAG;EACjBjD,OAAO,EAAEA,OAA2B;EACpCC,aAAa,EAAEA,aAAwD;EACvEG,cAAc,EAAEF,OAA2B;EAC3CC,mBAAmB,EAAEA,mBAAoE;EACzFG,UAAU,EAAEA;AACd,CAAC;;AAED;AACA,eAAe2C,UAAU","ignoreList":[]}
@@ -1,29 +1,31 @@
1
1
  import React from 'react';
2
- import type { OnairosButtonProps } from '../types';
3
- export interface OnairosProps extends Omit<OnairosButtonProps, 'onResolved' | 'onRejection'> {
4
- /**
5
- * Callback function called when the Onairos flow completes successfully
6
- * @param apiUrl The API URL for accessing the data
7
- * @param token The authentication token
8
- * @param userData The user data returned by the server
9
- */
10
- onResolved?: (apiUrl: string, token: string, userData: any) => void;
11
- /**
12
- * Callback function called when the Onairos flow is rejected or fails
13
- * @param error Optional error message
14
- */
2
+ import { DataTier } from '../types';
3
+ interface OnairosProps {
4
+ returnLink?: string;
5
+ prefillUrl?: string;
6
+ AppName: string;
7
+ buttonType?: 'normal' | 'pill';
8
+ requestData?: {
9
+ [key: string]: DataTier;
10
+ };
11
+ buttonWidth?: number;
12
+ buttonHeight?: number;
13
+ hasStroke?: boolean;
14
+ enabled?: boolean;
15
+ buttonForm?: 'default' | 'connect';
15
16
  onRejection?: (error?: string) => void;
16
- /**
17
- * Optional test mode flag - simplifies flows for testing
18
- */
17
+ onResolved?: (apiUrl: string, token: string, userData: any) => void;
18
+ preCheck?: () => Promise<boolean>;
19
+ color?: string;
20
+ debug?: boolean;
21
+ darkMode?: boolean;
22
+ preferredPlatform?: string;
19
23
  testMode?: boolean;
20
- /**
21
- * Optional style for the container
22
- */
23
- containerStyle?: any;
24
24
  }
25
- /**
26
- * Main Onairos component - wraps OnairosButton with additional state management and logic
27
- */
28
- export declare const Onairos: React.FC<OnairosProps>;
25
+ export interface OnairosRef {
26
+ trigger: () => Promise<void>;
27
+ reset: () => Promise<void>;
28
+ }
29
+ export declare const Onairos: React.ForwardRefExoticComponent<OnairosProps & React.RefAttributes<OnairosRef>>;
30
+ export {};
29
31
  //# sourceMappingURL=Onairos.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Onairos.d.ts","sourceRoot":"","sources":["../../../src/components/Onairos.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAGhE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAGnD,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,kBAAkB,EAAE,YAAY,GAAG,aAAa,CAAC;IAC1F;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,IAAI,CAAC;IAEpE;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAEvC;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,cAAc,CAAC,EAAE,GAAG,CAAC;CACtB;AAED;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAiF1C,CAAC"}
1
+ {"version":3,"file":"Onairos.d.ts","sourceRoot":"","sources":["../../../src/components/Onairos.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiE,MAAM,OAAO,CAAC;AAiBtF,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAUpC,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC/B,WAAW,CAAC,EAAE;QACZ,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAC;KACzB,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IACnC,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,IAAI,CAAC;IACpE,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,eAAO,MAAM,OAAO,iFAmOlB,CAAC"}
@@ -1,7 +1,11 @@
1
1
  import React from 'react';
2
2
  import type { OnairosButtonProps } from '../types';
3
+ export interface OnairosButtonRef {
4
+ trigger: () => Promise<void>;
5
+ reset: () => Promise<void>;
6
+ }
3
7
  /**
4
8
  * OnairosButton Component - A sign-in button similar to Google/Apple sign-in
5
9
  */
6
- export declare const OnairosButton: React.FC<OnairosButtonProps>;
10
+ export declare const OnairosButton: React.ForwardRefExoticComponent<OnairosButtonProps & React.RefAttributes<OnairosButtonRef>>;
7
11
  //# sourceMappingURL=OnairosButton.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"OnairosButton.d.ts","sourceRoot":"","sources":["../../../src/components/OnairosButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAerD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAKnD;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAmLtD,CAAC"}
1
+ {"version":3,"file":"OnairosButton.d.ts","sourceRoot":"","sources":["../../../src/components/OnairosButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiE,MAAM,OAAO,CAAC;AActF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAanD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,6FA4OxB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"UniversalOnboarding.d.ts","sourceRoot":"","sources":["../../../src/components/UniversalOnboarding.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAiBjF,OAAO,KAAK,EAAE,wBAAwB,EAAoB,MAAM,UAAU,CAAC;AAI3E,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAqKlE,CAAC"}
1
+ {"version":3,"file":"UniversalOnboarding.d.ts","sourceRoot":"","sources":["../../../src/components/UniversalOnboarding.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAoBhE,OAAO,KAAK,EAAE,wBAAwB,EAAoB,MAAM,UAAU,CAAC;AAI3E,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAuNlE,CAAC"}
@@ -41,13 +41,14 @@ export interface OnairosButtonProps {
41
41
  buttonHeight?: number;
42
42
  hasStroke?: boolean;
43
43
  enabled?: boolean;
44
- buttonForm?: 'default' | 'login' | 'signup';
44
+ buttonForm?: 'default' | 'login' | 'signup' | 'connect';
45
45
  onRejection?: (error?: string) => void;
46
46
  onResolved?: (apiUrl: string, token: string, userData: any) => void;
47
47
  preCheck?: () => Promise<boolean>;
48
48
  color?: string;
49
49
  swerv?: boolean;
50
50
  debug?: boolean;
51
+ darkMode?: boolean;
51
52
  preferredPlatform?: string;
52
53
  testMode?: boolean;
53
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onairos/react-native",
3
- "version": "3.0.9",
3
+ "version": "3.0.10",
4
4
  "description": "Onairos React Native SDK for social media authentication and AI model training",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -63,7 +63,6 @@
63
63
  "registry": "https://registry.npmjs.org/"
64
64
  },
65
65
  "dependencies": {
66
- "@gorhom/bottom-sheet": "^4",
67
66
  "@react-native-community/netinfo": "^9.0.0",
68
67
  "axios": "^1.6.2",
69
68
  "react-native-crypto-js": "^1.0.0",
@@ -73,6 +72,7 @@
73
72
  "react-native-reanimated": "^2.0.0",
74
73
  "react-native-rsa-native": "^2.0.0",
75
74
  "react-native-safe-area-context": "^4.0.0",
75
+ "react-native-svg": "^15.12.0",
76
76
  "react-native-vector-icons": "^9.0.0",
77
77
  "react-native-webview": "^11.0.0"
78
78
  },
@@ -122,7 +122,9 @@
122
122
  "typescript",
123
123
  {
124
124
  "project": "tsconfig.build.json",
125
- "tscFlags": ["--skipLibCheck"]
125
+ "tscFlags": [
126
+ "--skipLibCheck"
127
+ ]
126
128
  }
127
129
  ]
128
130
  ]
@@ -0,0 +1,6 @@
1
+ <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="40" height="40" rx="8" fill="currentColor"/>
3
+ <path d="M20 10C14.48 10 10 14.48 10 20C10 25.52 14.48 30 20 30C25.52 30 30 25.52 30 20C30 14.48 25.52 10 20 10ZM20 28C15.59 28 12 24.41 12 20C12 15.59 15.59 12 20 12C24.41 12 28 15.59 28 20C28 24.41 24.41 28 20 28Z" fill="white"/>
4
+ <path d="M20 15C18.9 15 18 15.9 18 17V19C18 20.1 18.9 21 20 21C21.1 21 22 20.1 22 19V17C22 15.9 21.1 15 20 15Z" fill="white"/>
5
+ <path d="M20 24C19.448 24 19 24.448 19 25C19 25.552 19.448 26 20 26C20.552 26 21 25.552 21 25C21 24.448 20.552 24 20 24Z" fill="white"/>
6
+ </svg>
@@ -1,117 +1,311 @@
1
- import React, { useState, useCallback, useEffect } from 'react';
2
- import { Platform, View } from 'react-native';
3
- import { OnairosButton } from './OnairosButton';
4
- import type { OnairosButtonProps } from '../types';
5
- import { hasCredentials, getCredentials } from '../utils/secureStorage';
6
-
7
- export interface OnairosProps extends Omit<OnairosButtonProps, 'onResolved' | 'onRejection'> {
8
- /**
9
- * Callback function called when the Onairos flow completes successfully
10
- * @param apiUrl The API URL for accessing the data
11
- * @param token The authentication token
12
- * @param userData The user data returned by the server
13
- */
14
- onResolved?: (apiUrl: string, token: string, userData: any) => void;
15
-
16
- /**
17
- * Callback function called when the Onairos flow is rejected or fails
18
- * @param error Optional error message
19
- */
1
+ import React, { forwardRef, useImperativeHandle, useState, useCallback } from 'react';
2
+ import {
3
+ StyleSheet,
4
+ View,
5
+ TouchableOpacity,
6
+ Text,
7
+ ViewStyle,
8
+ TextStyle,
9
+ Platform,
10
+ } from 'react-native';
11
+ import { SvgXml } from 'react-native-svg';
12
+ import { UniversalOnboarding } from './UniversalOnboarding';
13
+ import { Overlay } from './Overlay';
14
+ import { COLORS } from '../constants';
15
+ import { hasCredentials, getCredentials, deleteCredentials } from '../utils/secureStorage';
16
+ import { onairosApi } from '../api';
17
+ import { Portal } from '../utils/Portal';
18
+ import { DataTier } from '../types';
19
+
20
+ // Import the Onairos logo SVG
21
+ const onairosLogoSvg = `<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
22
+ <rect width="40" height="40" rx="8" fill="currentColor"/>
23
+ <path d="M20 10C14.48 10 10 14.48 10 20C10 25.52 14.48 30 20 30C25.52 30 30 25.52 30 20C30 14.48 25.52 10 20 10ZM20 28C15.59 28 12 24.41 12 20C12 15.59 15.59 12 20 12C24.41 12 28 15.59 28 20C28 24.41 24.41 28 20 28Z" fill="white"/>
24
+ <path d="M20 15C18.9 15 18 15.9 18 17V19C18 20.1 18.9 21 20 21C21.1 21 22 20.1 22 19V17C22 15.9 21.1 15 20 15Z" fill="white"/>
25
+ <path d="M20 24C19.448 24 19 24.448 19 25C19 25.552 19.448 26 20 26C20.552 26 21 25.552 21 25C21 24.448 20.552 24 20 24Z" fill="white"/>
26
+ </svg>`;
27
+
28
+ interface OnairosProps {
29
+ returnLink?: string;
30
+ prefillUrl?: string;
31
+ AppName: string;
32
+ buttonType?: 'normal' | 'pill';
33
+ requestData?: {
34
+ [key: string]: DataTier;
35
+ };
36
+ buttonWidth?: number;
37
+ buttonHeight?: number;
38
+ hasStroke?: boolean;
39
+ enabled?: boolean;
40
+ buttonForm?: 'default' | 'connect';
20
41
  onRejection?: (error?: string) => void;
21
-
22
- /**
23
- * Optional test mode flag - simplifies flows for testing
24
- */
42
+ onResolved?: (apiUrl: string, token: string, userData: any) => void;
43
+ preCheck?: () => Promise<boolean>;
44
+ color?: string;
45
+ debug?: boolean;
46
+ darkMode?: boolean;
47
+ preferredPlatform?: string;
25
48
  testMode?: boolean;
26
-
27
- /**
28
- * Optional style for the container
29
- */
30
- containerStyle?: any;
31
49
  }
32
50
 
33
- /**
34
- * Main Onairos component - wraps OnairosButton with additional state management and logic
35
- */
36
- export const Onairos: React.FC<OnairosProps> = ({
37
- AppName,
51
+ export interface OnairosRef {
52
+ trigger: () => Promise<void>;
53
+ reset: () => Promise<void>;
54
+ }
55
+
56
+ export const Onairos = forwardRef<OnairosRef, OnairosProps>(({
38
57
  returnLink,
39
- requestData,
58
+ prefillUrl,
59
+ AppName,
40
60
  buttonType = 'normal',
41
- buttonForm = 'default',
42
- buttonWidth,
61
+ requestData,
62
+ buttonWidth = 180,
43
63
  buttonHeight,
64
+ hasStroke = false,
65
+ enabled = true,
66
+ buttonForm = 'default',
67
+ onRejection,
68
+ onResolved,
69
+ preCheck,
44
70
  color,
45
- hasStroke,
71
+ debug = false,
72
+ darkMode = false,
46
73
  preferredPlatform,
47
- onResolved,
48
- onRejection,
49
74
  testMode = false,
50
- containerStyle,
51
- }) => {
52
- const [isInitialized, setIsInitialized] = useState(false);
53
- const [hasExistingCredentials, setHasExistingCredentials] = useState(false);
75
+ }, ref) => {
76
+ const [showOnboarding, setShowOnboarding] = useState(false);
77
+ const [showOverlay, setShowOverlay] = useState(false);
78
+ const [storedCredentials, setStoredCredentials] = useState<any>(null);
79
+ const [isLoading, setIsLoading] = useState(false);
80
+ const [isPressed, setIsPressed] = useState(false);
54
81
 
55
- const initialize = useCallback(async () => {
82
+ // Expose methods for external control
83
+ useImperativeHandle(ref, () => ({
84
+ trigger: async () => {
85
+ await handlePress();
86
+ },
87
+ reset: async () => {
88
+ await deleteCredentials();
89
+ }
90
+ }));
91
+
92
+ // Compute button text based on buttonForm
93
+ const getButtonText = () => {
94
+ if (buttonForm === 'connect') {
95
+ return 'Connect with Onairos';
96
+ } else {
97
+ return 'Sign in with Onairos';
98
+ }
99
+ };
100
+
101
+ // Calculate background color based on props and state
102
+ const getBackgroundColor = (): string => {
103
+ if (!enabled) {
104
+ return darkMode ? '#3A3A3A' : '#e0e0e0';
105
+ }
106
+
107
+ if (isPressed) {
108
+ return color ?
109
+ (typeof color === 'string' ? `${color}80` : color) :
110
+ (darkMode ? '#32323280' : '#f5f5f580');
111
+ }
112
+
113
+ return color || (darkMode ? '#2A2A2A' : '#ffffff');
114
+ };
115
+
116
+ // Calculate text color based on background luminance
117
+ const getTextColor = (): string => {
118
+ if (!enabled) {
119
+ return darkMode ? '#777777' : '#AAAAAA';
120
+ }
121
+
122
+ if (darkMode) {
123
+ return '#FFFFFF';
124
+ }
125
+
126
+ const bgColor = getBackgroundColor();
127
+ // Simple luminance check - in a real app, this would use a proper algorithm
128
+ return bgColor === '#ffffff' || bgColor === '#f5f5f580' || bgColor.includes('#f') ? '#000000' : '#FFFFFF';
129
+ };
130
+
131
+ const handlePress = async () => {
132
+ if (!enabled || isLoading) return;
133
+
134
+ setIsLoading(true);
135
+
56
136
  try {
57
- // Check for existing credentials
58
- const credentialsExist = await hasCredentials();
59
- setHasExistingCredentials(credentialsExist);
137
+ if (preCheck) {
138
+ const shouldProceed = await preCheck();
139
+ if (!shouldProceed) {
140
+ onRejection?.('Precheck validation failed');
141
+ setIsLoading(false);
142
+ return;
143
+ }
144
+ }
145
+
146
+ // Check if credentials exist
147
+ const hasStoredCreds = await hasCredentials();
60
148
 
61
- if (credentialsExist) {
62
- // Load credentials to verify they are valid
149
+ if (hasStoredCreds) {
150
+ // If credentials exist, fetch them and verify
63
151
  const credentials = await getCredentials();
64
- if (!credentials || !credentials.username || !credentials.userPin) {
65
- setHasExistingCredentials(false);
152
+
153
+ if (!credentials || !credentials.username) {
154
+ // Invalid credentials, clear and start fresh
155
+ await deleteCredentials();
156
+ setShowOnboarding(true);
157
+ setIsLoading(false);
158
+ return;
159
+ }
160
+
161
+ try {
162
+ // Validate credentials with server
163
+ const isValid = await onairosApi.validateCredentials(credentials.username);
164
+
165
+ if (!isValid) {
166
+ // Clear invalid credentials
167
+ await deleteCredentials();
168
+ setShowOnboarding(true);
169
+ setIsLoading(false);
170
+ return;
171
+ }
172
+
173
+ // Store and display overlay with valid credentials
174
+ setStoredCredentials(credentials);
175
+ setShowOverlay(true);
176
+ } catch (validationError) {
177
+ console.warn('Validation error, proceeding to onboarding:', validationError);
178
+ setShowOnboarding(true);
66
179
  }
180
+ } else {
181
+ // If no credentials, show onboarding
182
+ setShowOnboarding(true);
67
183
  }
68
184
  } catch (error) {
69
- console.error('Error initializing Onairos:', error);
185
+ console.error('Error during button press flow:', error);
186
+ // Fall back to onboarding on error
187
+ setShowOnboarding(true);
188
+ onRejection?.(error instanceof Error ? error.message : 'Unknown error');
70
189
  } finally {
71
- setIsInitialized(true);
190
+ setIsLoading(false);
72
191
  }
73
- }, []);
192
+ };
74
193
 
75
- useEffect(() => {
76
- initialize();
77
- }, [initialize]);
78
-
79
- const handleResolved = useCallback((apiUrl: string, token: string, userData: any) => {
194
+ const handleOnboardingComplete = useCallback((apiUrl: string, token: string, data: any) => {
195
+ setShowOnboarding(false);
80
196
  if (onResolved) {
81
- onResolved(apiUrl, token, userData);
197
+ onResolved(apiUrl, token, data);
82
198
  }
83
199
  }, [onResolved]);
84
-
85
- const handleRejection = useCallback((error?: string) => {
86
- if (onRejection) {
87
- onRejection(error);
200
+
201
+ const handleOverlayResolved = useCallback((apiUrl: string, token: string, data: any) => {
202
+ setShowOverlay(false);
203
+ if (onResolved) {
204
+ onResolved(apiUrl, token, data);
88
205
  }
89
- }, [onRejection]);
206
+ }, [onResolved]);
90
207
 
91
- if (!isInitialized) {
92
- // Could render a loading state here if needed
93
- return null;
94
- }
208
+ // Apply custom styling based on props
209
+ const buttonStyle: ViewStyle[] = [
210
+ styles.button,
211
+ {
212
+ width: buttonWidth,
213
+ height: buttonHeight || 48,
214
+ backgroundColor: getBackgroundColor(),
215
+ borderWidth: hasStroke ? 1 : 0,
216
+ borderColor: darkMode ? '#555555' : '#000000',
217
+ borderRadius: buttonType === 'pill' ? 24 : 8,
218
+ },
219
+ ];
220
+
221
+ const textStyle: TextStyle = {
222
+ ...styles.buttonText,
223
+ color: getTextColor(),
224
+ opacity: enabled ? 1 : 0.7,
225
+ };
226
+
227
+ const logoColor = getTextColor();
95
228
 
96
229
  return (
97
- <View style={containerStyle}>
98
- <OnairosButton
99
- AppName={AppName}
100
- returnLink={returnLink}
101
- requestData={requestData}
102
- buttonType={buttonType}
103
- buttonForm={buttonForm}
104
- buttonWidth={buttonWidth}
105
- buttonHeight={buttonHeight}
106
- color={color}
107
- hasStroke={hasStroke}
108
- enabled={true}
109
- preferredPlatform={preferredPlatform}
110
- onResolved={handleResolved}
111
- onRejection={handleRejection}
112
- preCheck={async () => true}
113
- testMode={testMode}
114
- />
115
- </View>
230
+ <>
231
+ <TouchableOpacity
232
+ style={buttonStyle}
233
+ onPress={handlePress}
234
+ disabled={!enabled || isLoading}
235
+ accessibilityLabel="Sign in with Onairos"
236
+ onPressIn={() => setIsPressed(true)}
237
+ onPressOut={() => setIsPressed(false)}
238
+ >
239
+ <View style={styles.buttonContent}>
240
+ <SvgXml
241
+ xml={onairosLogoSvg.replace('currentColor', logoColor)}
242
+ width={24}
243
+ height={24}
244
+ style={styles.logo}
245
+ />
246
+ <Text style={textStyle}>{getButtonText()}</Text>
247
+ </View>
248
+ </TouchableOpacity>
249
+
250
+ {/* Overlay and Onboarding components rendered outside the button */}
251
+ {showOnboarding && (
252
+ <UniversalOnboarding
253
+ visible={showOnboarding}
254
+ onClose={() => {
255
+ setShowOnboarding(false);
256
+ onRejection?.('User closed onboarding');
257
+ }}
258
+ AppName={AppName}
259
+ requestData={requestData as any}
260
+ returnLink={returnLink || ''}
261
+ onComplete={handleOnboardingComplete}
262
+ debug={debug}
263
+ test={testMode}
264
+ preferredPlatform={preferredPlatform}
265
+ />
266
+ )}
267
+
268
+ {/* Overlay rendered through Portal to ensure it appears at root level */}
269
+ {showOverlay && storedCredentials && (
270
+ <Portal>
271
+ <Overlay
272
+ data={requestData || {}}
273
+ username={storedCredentials.username}
274
+ modelKey={storedCredentials.userPin || ''}
275
+ onResolved={handleOverlayResolved}
276
+ appName={AppName}
277
+ darkMode={darkMode}
278
+ />
279
+ </Portal>
280
+ )}
281
+ </>
116
282
  );
117
- };
283
+ });
284
+
285
+ const styles = StyleSheet.create({
286
+ button: {
287
+ flexDirection: 'row',
288
+ alignItems: 'center',
289
+ justifyContent: 'center',
290
+ paddingVertical: 12,
291
+ paddingHorizontal: 16,
292
+ shadowColor: '#000',
293
+ shadowOffset: { width: 0, height: 2 },
294
+ shadowOpacity: 0.1,
295
+ shadowRadius: 4,
296
+ elevation: 2,
297
+ },
298
+ buttonContent: {
299
+ flexDirection: 'row',
300
+ alignItems: 'center',
301
+ justifyContent: 'center',
302
+ },
303
+ logo: {
304
+ marginRight: 8,
305
+ },
306
+ buttonText: {
307
+ fontSize: 16,
308
+ fontWeight: '600',
309
+ textAlign: 'center',
310
+ },
311
+ });