@onairos/react-native 1.0.2 → 1.0.3
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/lib/commonjs/components/OnairosButton.js +29 -121
- package/lib/commonjs/components/OnairosButton.js.map +1 -1
- package/lib/commonjs/components/UniversalOnboarding.js +8 -5
- package/lib/commonjs/components/UniversalOnboarding.js.map +1 -1
- package/lib/commonjs/index.js +12 -276
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/types.js +2 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/module/components/OnairosButton.js +31 -122
- package/lib/module/components/OnairosButton.js.map +1 -1
- package/lib/module/components/UniversalOnboarding.js +8 -5
- package/lib/module/components/UniversalOnboarding.js.map +1 -1
- package/lib/module/index.js +8 -31
- package/lib/module/index.js.map +1 -1
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/package.json +1 -1
- package/src/components/OnairosButton.tsx +33 -134
- package/src/components/UniversalOnboarding.tsx +7 -4
- package/src/types/index.ts +24 -12
- package/src/types.ts +29 -0
|
@@ -1,155 +1,64 @@
|
|
|
1
|
-
import React, {
|
|
2
|
-
import { TouchableOpacity,
|
|
3
|
-
import Icon from 'react-native-vector-icons/MaterialIcons';
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { TouchableOpacity, Text, StyleSheet, View } from 'react-native';
|
|
4
3
|
import { UniversalOnboarding } from './UniversalOnboarding';
|
|
5
|
-
import {
|
|
6
|
-
import { useCredentials } from '../hooks/useCredentials';
|
|
7
|
-
// import { validateCredentials } from '../utils/auth';
|
|
8
|
-
// import { COLORS } from '../constants';
|
|
9
|
-
|
|
4
|
+
import { COLORS } from '../constants';
|
|
10
5
|
export const OnairosButton = ({
|
|
6
|
+
title,
|
|
7
|
+
onPress,
|
|
8
|
+
style,
|
|
9
|
+
buttonType = 'default',
|
|
10
|
+
buttonForm = 'signup',
|
|
11
11
|
AppName,
|
|
12
12
|
requestData,
|
|
13
13
|
returnLink,
|
|
14
|
+
onComplete,
|
|
14
15
|
embedd = false,
|
|
15
|
-
color = '#00BFA5',
|
|
16
|
-
icon = 'auto_awesome',
|
|
17
|
-
onResolved,
|
|
18
|
-
login = false,
|
|
19
|
-
buttonType = 'circle',
|
|
20
16
|
debug = false,
|
|
21
17
|
test = false
|
|
22
18
|
}) => {
|
|
23
19
|
const [showOnboarding, setShowOnboarding] = useState(false);
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
hasCredentials,
|
|
27
|
-
getCredentials,
|
|
28
|
-
validateCredentials
|
|
29
|
-
} = useCredentials();
|
|
30
|
-
const [loading, setLoading] = useState(false);
|
|
31
|
-
const handlePress = useCallback(async () => {
|
|
32
|
-
setLoading(true);
|
|
33
|
-
try {
|
|
34
|
-
const hasExisting = await hasCredentials();
|
|
35
|
-
if (!hasExisting) {
|
|
36
|
-
setShowOnboarding(true);
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
const credentials = await getCredentials();
|
|
40
|
-
if (!credentials) {
|
|
41
|
-
setShowOnboarding(true);
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
const validationResult = await validateCredentials(credentials.username);
|
|
45
|
-
if (!validationResult.isValid) {
|
|
46
|
-
setShowOnboarding(true);
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// If we have valid credentials, show data request modal
|
|
51
|
-
setShowDataRequest(true);
|
|
52
|
-
} catch (error) {
|
|
53
|
-
console.error('Error in button press:', error);
|
|
20
|
+
const handlePress = () => {
|
|
21
|
+
if (buttonForm === 'signup') {
|
|
54
22
|
setShowOnboarding(true);
|
|
55
|
-
}
|
|
56
|
-
|
|
23
|
+
} else {
|
|
24
|
+
onPress();
|
|
57
25
|
}
|
|
58
|
-
}
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
console.error('Error handling data request accept:', error);
|
|
68
|
-
}
|
|
69
|
-
}, [getCredentials, onResolved]);
|
|
70
|
-
useEffect(() => {
|
|
71
|
-
// Setup deep linking
|
|
72
|
-
const handleDeepLink = ({
|
|
73
|
-
url
|
|
74
|
-
}) => {
|
|
75
|
-
if (url.includes('onairosreact://authenticate')) {
|
|
76
|
-
// Handle authentication callback
|
|
77
|
-
const params = new URL(url).searchParams;
|
|
78
|
-
const nonce = params.get('nonce');
|
|
79
|
-
const callback = params.get('callback');
|
|
80
|
-
if (nonce && callback) {
|
|
81
|
-
// Process authentication
|
|
82
|
-
setShowOnboarding(false);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
Linking.addEventListener('url', handleDeepLink);
|
|
87
|
-
return () => {
|
|
88
|
-
// Cleanup deep linking
|
|
89
|
-
// Note: Remove event listener based on RN version
|
|
90
|
-
// if (Platform.OS === 'android') {
|
|
91
|
-
// Linking.removeEventListener('url', handleDeepLink);
|
|
92
|
-
// }
|
|
93
|
-
};
|
|
94
|
-
}, []);
|
|
95
|
-
const buttonStyles = [styles.button, buttonType === 'pill' ? styles.pillButton : styles.circleButton, {
|
|
96
|
-
backgroundColor: color
|
|
97
|
-
}];
|
|
98
|
-
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(TouchableOpacity, {
|
|
99
|
-
style: buttonStyles,
|
|
100
|
-
onPress: handlePress,
|
|
101
|
-
disabled: loading
|
|
102
|
-
}, /*#__PURE__*/React.createElement(Icon, {
|
|
103
|
-
name: icon,
|
|
104
|
-
size: 24,
|
|
105
|
-
color: "white"
|
|
106
|
-
}), buttonType === 'pill' && /*#__PURE__*/React.createElement(Text, {
|
|
26
|
+
};
|
|
27
|
+
const handleOnboardingComplete = (apiUrl, token, data) => {
|
|
28
|
+
setShowOnboarding(false);
|
|
29
|
+
onComplete(apiUrl, token, data);
|
|
30
|
+
};
|
|
31
|
+
return /*#__PURE__*/React.createElement(View, null, /*#__PURE__*/React.createElement(TouchableOpacity, {
|
|
32
|
+
style: [styles.button, buttonType === 'pill' && styles.pillButton, style],
|
|
33
|
+
onPress: handlePress
|
|
34
|
+
}, /*#__PURE__*/React.createElement(Text, {
|
|
107
35
|
style: styles.buttonText
|
|
108
|
-
},
|
|
36
|
+
}, title)), /*#__PURE__*/React.createElement(UniversalOnboarding, {
|
|
109
37
|
visible: showOnboarding,
|
|
110
38
|
onClose: () => setShowOnboarding(false),
|
|
111
39
|
AppName: AppName,
|
|
112
40
|
requestData: requestData,
|
|
113
41
|
returnLink: returnLink,
|
|
114
|
-
onComplete:
|
|
42
|
+
onComplete: handleOnboardingComplete,
|
|
115
43
|
embedd: embedd,
|
|
116
44
|
debug: debug,
|
|
117
45
|
test: test
|
|
118
|
-
}), /*#__PURE__*/React.createElement(DataRequestModal, {
|
|
119
|
-
visible: showDataRequest,
|
|
120
|
-
onClose: () => setShowDataRequest(false),
|
|
121
|
-
onAccept: handleDataRequestAccept,
|
|
122
|
-
requestData: requestData,
|
|
123
|
-
AppName: AppName
|
|
124
46
|
}));
|
|
125
47
|
};
|
|
126
48
|
const styles = StyleSheet.create({
|
|
127
49
|
button: {
|
|
50
|
+
backgroundColor: COLORS.primary,
|
|
51
|
+
paddingVertical: 12,
|
|
52
|
+
paddingHorizontal: 24,
|
|
53
|
+
borderRadius: 8,
|
|
128
54
|
alignItems: 'center',
|
|
129
|
-
justifyContent: 'center'
|
|
130
|
-
elevation: 3,
|
|
131
|
-
shadowColor: '#000',
|
|
132
|
-
shadowOffset: {
|
|
133
|
-
width: 0,
|
|
134
|
-
height: 2
|
|
135
|
-
},
|
|
136
|
-
shadowOpacity: 0.25,
|
|
137
|
-
shadowRadius: 3.84
|
|
138
|
-
},
|
|
139
|
-
circleButton: {
|
|
140
|
-
width: 60,
|
|
141
|
-
height: 60,
|
|
142
|
-
borderRadius: 30
|
|
55
|
+
justifyContent: 'center'
|
|
143
56
|
},
|
|
144
57
|
pillButton: {
|
|
145
|
-
|
|
146
|
-
paddingHorizontal: 16,
|
|
147
|
-
paddingVertical: 12,
|
|
148
|
-
borderRadius: 25
|
|
58
|
+
borderRadius: 20
|
|
149
59
|
},
|
|
150
60
|
buttonText: {
|
|
151
|
-
color: '
|
|
152
|
-
marginLeft: 8,
|
|
61
|
+
color: '#fff',
|
|
153
62
|
fontSize: 16,
|
|
154
63
|
fontWeight: '600'
|
|
155
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","
|
|
1
|
+
{"version":3,"names":["React","useState","TouchableOpacity","Text","StyleSheet","View","UniversalOnboarding","COLORS","OnairosButton","title","onPress","style","buttonType","buttonForm","AppName","requestData","returnLink","onComplete","embedd","debug","test","showOnboarding","setShowOnboarding","handlePress","handleOnboardingComplete","apiUrl","token","data","createElement","styles","button","pillButton","buttonText","visible","onClose","create","backgroundColor","primary","paddingVertical","paddingHorizontal","borderRadius","alignItems","justifyContent","color","fontSize","fontWeight"],"sourceRoot":"..\\..\\..\\src","sources":["components/OnairosButton.tsx"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,QAAQ,QAAQ,OAAO;AACvC,SAASC,gBAAgB,EAAEC,IAAI,EAAEC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AACvE,SAASC,mBAAmB,QAAQ,uBAAuB;AAC3D,SAASC,MAAM,QAAQ,cAAc;AAGrC,OAAO,MAAMC,aAA2C,GAAGA,CAAC;EAC1DC,KAAK;EACLC,OAAO;EACPC,KAAK;EACLC,UAAU,GAAG,SAAS;EACtBC,UAAU,GAAG,QAAQ;EACrBC,OAAO;EACPC,WAAW;EACXC,UAAU;EACVC,UAAU;EACVC,MAAM,GAAG,KAAK;EACdC,KAAK,GAAG,KAAK;EACbC,IAAI,GAAG;AACT,CAAC,KAAK;EACJ,MAAM,CAACC,cAAc,EAAEC,iBAAiB,CAAC,GAAGrB,QAAQ,CAAC,KAAK,CAAC;EAE3D,MAAMsB,WAAW,GAAGA,CAAA,KAAM;IACxB,IAAIV,UAAU,KAAK,QAAQ,EAAE;MAC3BS,iBAAiB,CAAC,IAAI,CAAC;IACzB,CAAC,MAAM;MACLZ,OAAO,CAAC,CAAC;IACX;EACF,CAAC;EAED,MAAMc,wBAAwB,GAAGA,CAACC,MAAc,EAAEC,KAAa,EAAEC,IAAS,KAAK;IAC7EL,iBAAiB,CAAC,KAAK,CAAC;IACxBL,UAAU,CAACQ,MAAM,EAAEC,KAAK,EAAEC,IAAI,CAAC;EACjC,CAAC;EAED,oBACE3B,KAAA,CAAA4B,aAAA,CAACvB,IAAI,qBACHL,KAAA,CAAA4B,aAAA,CAAC1B,gBAAgB;IACfS,KAAK,EAAE,CACLkB,MAAM,CAACC,MAAM,EACblB,UAAU,KAAK,MAAM,IAAIiB,MAAM,CAACE,UAAU,EAC1CpB,KAAK,CACL;IACFD,OAAO,EAAEa;EAAY,gBAErBvB,KAAA,CAAA4B,aAAA,CAACzB,IAAI;IAACQ,KAAK,EAAEkB,MAAM,CAACG;EAAW,GAAEvB,KAAY,CAC7B,CAAC,eAEnBT,KAAA,CAAA4B,aAAA,CAACtB,mBAAmB;IAClB2B,OAAO,EAAEZ,cAAe;IACxBa,OAAO,EAAEA,CAAA,KAAMZ,iBAAiB,CAAC,KAAK,CAAE;IACxCR,OAAO,EAAEA,OAAQ;IACjBC,WAAW,EAAEA,WAAY;IACzBC,UAAU,EAAEA,UAAW;IACvBC,UAAU,EAAEO,wBAAyB;IACrCN,MAAM,EAAEA,MAAO;IACfC,KAAK,EAAEA,KAAM;IACbC,IAAI,EAAEA;EAAK,CACZ,CACG,CAAC;AAEX,CAAC;AAED,MAAMS,MAAM,GAAGzB,UAAU,CAAC+B,MAAM,CAAC;EAC/BL,MAAM,EAAE;IACNM,eAAe,EAAE7B,MAAM,CAAC8B,OAAO;IAC/BC,eAAe,EAAE,EAAE;IACnBC,iBAAiB,EAAE,EAAE;IACrBC,YAAY,EAAE,CAAC;IACfC,UAAU,EAAE,QAAQ;IACpBC,cAAc,EAAE;EAClB,CAAC;EACDX,UAAU,EAAE;IACVS,YAAY,EAAE;EAChB,CAAC;EACDR,UAAU,EAAE;IACVW,KAAK,EAAE,MAAM;IACbC,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAE;EACd;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -17,14 +17,15 @@ export const UniversalOnboarding = ({
|
|
|
17
17
|
requestData,
|
|
18
18
|
returnLink,
|
|
19
19
|
onComplete,
|
|
20
|
-
embedd,
|
|
21
|
-
debug,
|
|
22
|
-
test
|
|
20
|
+
embedd = false,
|
|
21
|
+
debug = false,
|
|
22
|
+
test = false
|
|
23
23
|
}) => {
|
|
24
24
|
const bottomSheetRef = useRef(null);
|
|
25
25
|
const [step, setStep] = useState('connect');
|
|
26
26
|
const [connections, setConnections] = useState({});
|
|
27
27
|
const [pin, setPin] = useState('');
|
|
28
|
+
const [selectedTier, setSelectedTier] = useState('Medium');
|
|
28
29
|
const [training, setTraining] = useState({
|
|
29
30
|
progress: 0,
|
|
30
31
|
eta: ''
|
|
@@ -77,11 +78,13 @@ export const UniversalOnboarding = ({
|
|
|
77
78
|
clearInterval(interval);
|
|
78
79
|
onComplete('https://api2.onairos.uk', 'dummy-token', {
|
|
79
80
|
pin: userPin,
|
|
80
|
-
connections
|
|
81
|
+
connections,
|
|
82
|
+
selectedTier,
|
|
83
|
+
tierData: requestData[selectedTier]
|
|
81
84
|
});
|
|
82
85
|
}
|
|
83
86
|
}, 1000);
|
|
84
|
-
}, [connections, onComplete]);
|
|
87
|
+
}, [connections, onComplete, selectedTier, requestData]);
|
|
85
88
|
const canProceedToPin = useMemo(() => {
|
|
86
89
|
const connectedPlatforms = Object.values(connections).filter(Boolean).length;
|
|
87
90
|
return connectedPlatforms >= 2;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useCallback","useEffect","useMemo","useRef","useState","View","Text","StyleSheet","TouchableOpacity","Dimensions","BottomSheet","Icon","PlatformList","PinInput","TrainingModal","useConnections","COLORS","height","get","UniversalOnboarding","visible","onClose","AppName","requestData","returnLink","onComplete","embedd","debug","test","bottomSheetRef","step","setStep","connections","setConnections","pin","setPin","training","setTraining","progress","eta","connectPlatform","disconnectPlatform","getConnectionStatus","isConnecting","snapPoints","_bottomSheetRef$curre","current","expand","loadInitialStatus","_bottomSheetRef$curre2","close","status","handlePlatformToggle","platform","connect","error","console","handlePinSubmit","userPin","interval","setInterval","Math","round","clearInterval","canProceedToPin","connectedPlatforms","Object","values","filter","Boolean","length","renderHeader","createElement","style","styles","header","name","size","color","primary","headerTitle","onPress","closeButton","renderContent","onToggle","isLoading","canProceed","onProceed","onSubmit","minLength","requireSpecialChar","requireNumber","onCancel","ref","enablePanDownToClose","index","container","create","flex","backgroundColor","flexDirection","alignItems","padding","headerBg","borderTopLeftRadius","borderTopRightRadius","fontSize","fontWeight","marginLeft"],"sourceRoot":"..\\..\\..\\src","sources":["components/UniversalOnboarding.tsx"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AAChF,SACEC,IAAI,EACJC,IAAI,EACJC,UAAU,EACVC,gBAAgB,EAEhBC,UAAU,QACL,cAAc;AACrB,OAAOC,WAAW,MAAM,sBAAsB;AAC9C,OAAOC,IAAI,MAAM,yCAAyC;AAC1D,SAASC,YAAY,QAAQ,gBAAgB;AAC7C,SAASC,QAAQ,QAAQ,YAAY;AACrC,SAASC,aAAa,QAAQ,iBAAiB;AAC/C,SAASC,cAAc,QAAQ,yBAAyB;AACxD,SAASC,MAAM,QAAQ,cAAc;AAGrC,MAAM;EAAEC;AAAO,CAAC,GAAGR,UAAU,CAACS,GAAG,CAAC,QAAQ,CAAC;AAE3C,OAAO,MAAMC,mBAAuD,GAAGA,CAAC;EACtEC,OAAO;EACPC,OAAO;EACPC,OAAO;EACPC,WAAW;EACXC,UAAU;EACVC,UAAU;EACVC,MAAM;
|
|
1
|
+
{"version":3,"names":["React","useCallback","useEffect","useMemo","useRef","useState","View","Text","StyleSheet","TouchableOpacity","Dimensions","BottomSheet","Icon","PlatformList","PinInput","TrainingModal","useConnections","COLORS","height","get","UniversalOnboarding","visible","onClose","AppName","requestData","returnLink","onComplete","embedd","debug","test","bottomSheetRef","step","setStep","connections","setConnections","pin","setPin","selectedTier","setSelectedTier","training","setTraining","progress","eta","connectPlatform","disconnectPlatform","getConnectionStatus","isConnecting","snapPoints","_bottomSheetRef$curre","current","expand","loadInitialStatus","_bottomSheetRef$curre2","close","status","handlePlatformToggle","platform","connect","error","console","handlePinSubmit","userPin","interval","setInterval","Math","round","clearInterval","tierData","canProceedToPin","connectedPlatforms","Object","values","filter","Boolean","length","renderHeader","createElement","style","styles","header","name","size","color","primary","headerTitle","onPress","closeButton","renderContent","onToggle","isLoading","canProceed","onProceed","onSubmit","minLength","requireSpecialChar","requireNumber","onCancel","ref","enablePanDownToClose","index","container","create","flex","backgroundColor","flexDirection","alignItems","padding","headerBg","borderTopLeftRadius","borderTopRightRadius","fontSize","fontWeight","marginLeft"],"sourceRoot":"..\\..\\..\\src","sources":["components/UniversalOnboarding.tsx"],"mappings":"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","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -1,34 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import OnairosButton from './components/OnairosButton';
|
|
2
|
+
import * as AuthUtils from './utils/auth';
|
|
3
|
+
import * as CryptoUtils from './utils/crypto';
|
|
4
|
+
import * as ApiUtils from './utils/api';
|
|
5
5
|
|
|
6
|
-
//
|
|
7
|
-
export
|
|
8
|
-
export { PinCreationScreen } from './components/screens/PinCreationScreen';
|
|
9
|
-
export { LoadingScreen } from './components/screens/LoadingScreen';
|
|
6
|
+
// Export the main component
|
|
7
|
+
export default OnairosButton;
|
|
10
8
|
|
|
11
|
-
//
|
|
12
|
-
export {
|
|
13
|
-
export { PlatformConnector } from './components/onboarding/PlatformConnector';
|
|
14
|
-
export { OnboardingHeader } from './components/onboarding/OnboardingHeader';
|
|
15
|
-
export { PinInput } from './components/onboarding/PinInput';
|
|
16
|
-
|
|
17
|
-
// Hooks
|
|
18
|
-
export { useConnections } from './hooks/useConnections';
|
|
19
|
-
export { useCredentials } from './hooks/useCredentials';
|
|
20
|
-
|
|
21
|
-
// Utilities
|
|
22
|
-
export { storeCredentials, getCredentials, hasCredentials, deleteCredentials, updateCredentials, generateDeviceUsername, verifyCredentials } from './utils/secureStorage';
|
|
23
|
-
export { validateCredentials, createAccount, authenticate, refreshToken, getPlatformData, getUserProfile, updatePlatformConnections } from './utils/onairosApi';
|
|
24
|
-
export { rsaEncrypt, sha256, base64ToBuffer } from './utils/crypto';
|
|
25
|
-
export { logDebug, logError, isDebugMode } from './utils/debugHelper';
|
|
26
|
-
|
|
27
|
-
// Services
|
|
28
|
-
export { connectPlatform, disconnectPlatform, initializeOAuthService, cleanupOAuthService, storePlatformConnection } from './services/oauthService';
|
|
29
|
-
|
|
30
|
-
// Types
|
|
31
|
-
|
|
32
|
-
// Constants
|
|
33
|
-
export { COLORS, PLATFORMS, API_ENDPOINTS, STORAGE_KEYS, PIN_REQUIREMENTS, DEEP_LINK_CONFIG } from './constants';
|
|
9
|
+
// Export utilities for advanced usage
|
|
10
|
+
export { AuthUtils, CryptoUtils, ApiUtils };
|
|
34
11
|
//# sourceMappingURL=index.js.map
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["OnairosButton","
|
|
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":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"..\\..\\src","sources":["types.ts"],"mappings":"","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,132 +1,49 @@
|
|
|
1
|
-
import React, {
|
|
2
|
-
import {
|
|
3
|
-
TouchableOpacity,
|
|
4
|
-
StyleSheet,
|
|
5
|
-
View,
|
|
6
|
-
Text,
|
|
7
|
-
Platform,
|
|
8
|
-
Linking,
|
|
9
|
-
Modal,
|
|
10
|
-
} from 'react-native';
|
|
11
|
-
import Icon from 'react-native-vector-icons/MaterialIcons';
|
|
12
|
-
import * as Keychain from 'react-native-keychain';
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { TouchableOpacity, Text, StyleSheet, View } from 'react-native';
|
|
13
3
|
import { UniversalOnboarding } from './UniversalOnboarding';
|
|
14
|
-
import {
|
|
15
|
-
import { useCredentials } from '../hooks/useCredentials';
|
|
16
|
-
// import { validateCredentials } from '../utils/auth';
|
|
17
|
-
// import { COLORS } from '../constants';
|
|
4
|
+
import { COLORS } from '../constants';
|
|
18
5
|
import type { OnairosButtonProps } from '../types';
|
|
19
6
|
|
|
20
7
|
export const OnairosButton: React.FC<OnairosButtonProps> = ({
|
|
8
|
+
title,
|
|
9
|
+
onPress,
|
|
10
|
+
style,
|
|
11
|
+
buttonType = 'default',
|
|
12
|
+
buttonForm = 'signup',
|
|
21
13
|
AppName,
|
|
22
14
|
requestData,
|
|
23
15
|
returnLink,
|
|
16
|
+
onComplete,
|
|
24
17
|
embedd = false,
|
|
25
|
-
color = '#00BFA5',
|
|
26
|
-
icon = 'auto_awesome',
|
|
27
|
-
onResolved,
|
|
28
|
-
login = false,
|
|
29
|
-
buttonType = 'circle',
|
|
30
18
|
debug = false,
|
|
31
19
|
test = false,
|
|
32
20
|
}) => {
|
|
33
21
|
const [showOnboarding, setShowOnboarding] = useState(false);
|
|
34
|
-
const [showDataRequest, setShowDataRequest] = useState(false);
|
|
35
|
-
const { hasCredentials, getCredentials, validateCredentials } = useCredentials();
|
|
36
|
-
const [loading, setLoading] = useState(false);
|
|
37
22
|
|
|
38
|
-
const handlePress =
|
|
39
|
-
|
|
40
|
-
try {
|
|
41
|
-
const hasExisting = await hasCredentials();
|
|
42
|
-
|
|
43
|
-
if (!hasExisting) {
|
|
44
|
-
setShowOnboarding(true);
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const credentials = await getCredentials();
|
|
49
|
-
if (!credentials) {
|
|
50
|
-
setShowOnboarding(true);
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const validationResult = await validateCredentials(credentials.username);
|
|
55
|
-
if (!validationResult.isValid) {
|
|
56
|
-
setShowOnboarding(true);
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// If we have valid credentials, show data request modal
|
|
61
|
-
setShowDataRequest(true);
|
|
62
|
-
} catch (error) {
|
|
63
|
-
console.error('Error in button press:', error);
|
|
23
|
+
const handlePress = () => {
|
|
24
|
+
if (buttonForm === 'signup') {
|
|
64
25
|
setShowOnboarding(true);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
}, [hasCredentials, getCredentials, validateCredentials]);
|
|
69
|
-
|
|
70
|
-
const handleDataRequestAccept = useCallback(async () => {
|
|
71
|
-
try {
|
|
72
|
-
const credentials = await getCredentials();
|
|
73
|
-
if (credentials) {
|
|
74
|
-
onResolved(
|
|
75
|
-
'https://api2.onairos.uk',
|
|
76
|
-
credentials.accessToken,
|
|
77
|
-
credentials
|
|
78
|
-
);
|
|
79
|
-
}
|
|
80
|
-
setShowDataRequest(false);
|
|
81
|
-
} catch (error) {
|
|
82
|
-
console.error('Error handling data request accept:', error);
|
|
26
|
+
} else {
|
|
27
|
+
onPress();
|
|
83
28
|
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
useEffect(() => {
|
|
87
|
-
// Setup deep linking
|
|
88
|
-
const handleDeepLink = ({ url }: { url: string }) => {
|
|
89
|
-
if (url.includes('onairosreact://authenticate')) {
|
|
90
|
-
// Handle authentication callback
|
|
91
|
-
const params = new URL(url).searchParams;
|
|
92
|
-
const nonce = params.get('nonce');
|
|
93
|
-
const callback = params.get('callback');
|
|
94
|
-
|
|
95
|
-
if (nonce && callback) {
|
|
96
|
-
// Process authentication
|
|
97
|
-
setShowOnboarding(false);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
Linking.addEventListener('url', handleDeepLink);
|
|
103
|
-
|
|
104
|
-
return () => {
|
|
105
|
-
// Cleanup deep linking
|
|
106
|
-
// Note: Remove event listener based on RN version
|
|
107
|
-
// if (Platform.OS === 'android') {
|
|
108
|
-
// Linking.removeEventListener('url', handleDeepLink);
|
|
109
|
-
// }
|
|
110
|
-
};
|
|
111
|
-
}, []);
|
|
29
|
+
};
|
|
112
30
|
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
];
|
|
31
|
+
const handleOnboardingComplete = (apiUrl: string, token: string, data: any) => {
|
|
32
|
+
setShowOnboarding(false);
|
|
33
|
+
onComplete(apiUrl, token, data);
|
|
34
|
+
};
|
|
118
35
|
|
|
119
36
|
return (
|
|
120
|
-
|
|
37
|
+
<View>
|
|
121
38
|
<TouchableOpacity
|
|
122
|
-
style={
|
|
39
|
+
style={[
|
|
40
|
+
styles.button,
|
|
41
|
+
buttonType === 'pill' && styles.pillButton,
|
|
42
|
+
style,
|
|
43
|
+
]}
|
|
123
44
|
onPress={handlePress}
|
|
124
|
-
disabled={loading}
|
|
125
45
|
>
|
|
126
|
-
<
|
|
127
|
-
{buttonType === 'pill' && (
|
|
128
|
-
<Text style={styles.buttonText}>Connect with Onairos</Text>
|
|
129
|
-
)}
|
|
46
|
+
<Text style={styles.buttonText}>{title}</Text>
|
|
130
47
|
</TouchableOpacity>
|
|
131
48
|
|
|
132
49
|
<UniversalOnboarding
|
|
@@ -135,47 +52,29 @@ export const OnairosButton: React.FC<OnairosButtonProps> = ({
|
|
|
135
52
|
AppName={AppName}
|
|
136
53
|
requestData={requestData}
|
|
137
54
|
returnLink={returnLink}
|
|
138
|
-
onComplete={
|
|
55
|
+
onComplete={handleOnboardingComplete}
|
|
139
56
|
embedd={embedd}
|
|
140
57
|
debug={debug}
|
|
141
58
|
test={test}
|
|
142
59
|
/>
|
|
143
|
-
|
|
144
|
-
<DataRequestModal
|
|
145
|
-
visible={showDataRequest}
|
|
146
|
-
onClose={() => setShowDataRequest(false)}
|
|
147
|
-
onAccept={handleDataRequestAccept}
|
|
148
|
-
requestData={requestData}
|
|
149
|
-
AppName={AppName}
|
|
150
|
-
/>
|
|
151
|
-
</>
|
|
60
|
+
</View>
|
|
152
61
|
);
|
|
153
62
|
};
|
|
154
63
|
|
|
155
64
|
const styles = StyleSheet.create({
|
|
156
65
|
button: {
|
|
66
|
+
backgroundColor: COLORS.primary,
|
|
67
|
+
paddingVertical: 12,
|
|
68
|
+
paddingHorizontal: 24,
|
|
69
|
+
borderRadius: 8,
|
|
157
70
|
alignItems: 'center',
|
|
158
71
|
justifyContent: 'center',
|
|
159
|
-
elevation: 3,
|
|
160
|
-
shadowColor: '#000',
|
|
161
|
-
shadowOffset: { width: 0, height: 2 },
|
|
162
|
-
shadowOpacity: 0.25,
|
|
163
|
-
shadowRadius: 3.84,
|
|
164
|
-
},
|
|
165
|
-
circleButton: {
|
|
166
|
-
width: 60,
|
|
167
|
-
height: 60,
|
|
168
|
-
borderRadius: 30,
|
|
169
72
|
},
|
|
170
73
|
pillButton: {
|
|
171
|
-
|
|
172
|
-
paddingHorizontal: 16,
|
|
173
|
-
paddingVertical: 12,
|
|
174
|
-
borderRadius: 25,
|
|
74
|
+
borderRadius: 20,
|
|
175
75
|
},
|
|
176
76
|
buttonText: {
|
|
177
|
-
color: '
|
|
178
|
-
marginLeft: 8,
|
|
77
|
+
color: '#fff',
|
|
179
78
|
fontSize: 16,
|
|
180
79
|
fontWeight: '600',
|
|
181
80
|
},
|
|
@@ -25,14 +25,15 @@ export const UniversalOnboarding: React.FC<UniversalOnboardingProps> = ({
|
|
|
25
25
|
requestData,
|
|
26
26
|
returnLink,
|
|
27
27
|
onComplete,
|
|
28
|
-
embedd,
|
|
29
|
-
debug,
|
|
30
|
-
test,
|
|
28
|
+
embedd = false,
|
|
29
|
+
debug = false,
|
|
30
|
+
test = false,
|
|
31
31
|
}) => {
|
|
32
32
|
const bottomSheetRef = useRef<BottomSheet>(null);
|
|
33
33
|
const [step, setStep] = useState<'connect' | 'pin' | 'training'>('connect');
|
|
34
34
|
const [connections, setConnections] = useState<ConnectionStatus>({});
|
|
35
35
|
const [pin, setPin] = useState<string>('');
|
|
36
|
+
const [selectedTier, setSelectedTier] = useState<keyof typeof requestData>('Medium');
|
|
36
37
|
const [training, setTraining] = useState<{
|
|
37
38
|
progress: number;
|
|
38
39
|
eta: string;
|
|
@@ -90,10 +91,12 @@ export const UniversalOnboarding: React.FC<UniversalOnboardingProps> = ({
|
|
|
90
91
|
onComplete('https://api2.onairos.uk', 'dummy-token', {
|
|
91
92
|
pin: userPin,
|
|
92
93
|
connections,
|
|
94
|
+
selectedTier,
|
|
95
|
+
tierData: requestData[selectedTier],
|
|
93
96
|
});
|
|
94
97
|
}
|
|
95
98
|
}, 1000);
|
|
96
|
-
}, [connections, onComplete]);
|
|
99
|
+
}, [connections, onComplete, selectedTier, requestData]);
|
|
97
100
|
|
|
98
101
|
const canProceedToPin = useMemo(() => {
|
|
99
102
|
const connectedPlatforms = Object.values(connections).filter(Boolean).length;
|