@onairos/react-native 1.0.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 (130) hide show
  1. package/README.md +334 -0
  2. package/lib/commonjs/components/DataRequestModal.js +176 -0
  3. package/lib/commonjs/components/DataRequestModal.js.map +1 -0
  4. package/lib/commonjs/components/Notification.js +106 -0
  5. package/lib/commonjs/components/Notification.js.map +1 -0
  6. package/lib/commonjs/components/OnairosButton.js +575 -0
  7. package/lib/commonjs/components/OnairosButton.js.map +1 -0
  8. package/lib/commonjs/components/Overlay.js +818 -0
  9. package/lib/commonjs/components/Overlay.js.map +1 -0
  10. package/lib/commonjs/components/UniversalOnboarding.js +173 -0
  11. package/lib/commonjs/components/UniversalOnboarding.js.map +1 -0
  12. package/lib/commonjs/components/onboarding/OAuthWebView.js +137 -0
  13. package/lib/commonjs/components/onboarding/OAuthWebView.js.map +1 -0
  14. package/lib/commonjs/components/onboarding/OnboardingHeader.js +74 -0
  15. package/lib/commonjs/components/onboarding/OnboardingHeader.js.map +1 -0
  16. package/lib/commonjs/components/onboarding/PinInput.js +283 -0
  17. package/lib/commonjs/components/onboarding/PinInput.js.map +1 -0
  18. package/lib/commonjs/components/onboarding/PlatformConnector.js +244 -0
  19. package/lib/commonjs/components/onboarding/PlatformConnector.js.map +1 -0
  20. package/lib/commonjs/components/screens/ConnectorScreen.js +145 -0
  21. package/lib/commonjs/components/screens/ConnectorScreen.js.map +1 -0
  22. package/lib/commonjs/components/screens/LoadingScreen.js +91 -0
  23. package/lib/commonjs/components/screens/LoadingScreen.js.map +1 -0
  24. package/lib/commonjs/components/screens/PinCreationScreen.js +61 -0
  25. package/lib/commonjs/components/screens/PinCreationScreen.js.map +1 -0
  26. package/lib/commonjs/constants/index.js +78 -0
  27. package/lib/commonjs/constants/index.js.map +1 -0
  28. package/lib/commonjs/hooks/useConnections.js +89 -0
  29. package/lib/commonjs/hooks/useConnections.js.map +1 -0
  30. package/lib/commonjs/hooks/useCredentials.js +85 -0
  31. package/lib/commonjs/hooks/useCredentials.js.map +1 -0
  32. package/lib/commonjs/index.js +282 -0
  33. package/lib/commonjs/index.js.map +1 -0
  34. package/lib/commonjs/services/oauthService.js +362 -0
  35. package/lib/commonjs/services/oauthService.js.map +1 -0
  36. package/lib/commonjs/types/declarations.d.js +2 -0
  37. package/lib/commonjs/types/declarations.d.js.map +1 -0
  38. package/lib/commonjs/types/index.js +2 -0
  39. package/lib/commonjs/types/index.js.map +1 -0
  40. package/lib/commonjs/utils/api.js +129 -0
  41. package/lib/commonjs/utils/api.js.map +1 -0
  42. package/lib/commonjs/utils/auth.js +111 -0
  43. package/lib/commonjs/utils/auth.js.map +1 -0
  44. package/lib/commonjs/utils/crypto.js +62 -0
  45. package/lib/commonjs/utils/crypto.js.map +1 -0
  46. package/lib/commonjs/utils/debugHelper.js +64 -0
  47. package/lib/commonjs/utils/debugHelper.js.map +1 -0
  48. package/lib/commonjs/utils/onairosApi.js +270 -0
  49. package/lib/commonjs/utils/onairosApi.js.map +1 -0
  50. package/lib/commonjs/utils/secureStorage.js +210 -0
  51. package/lib/commonjs/utils/secureStorage.js.map +1 -0
  52. package/lib/module/components/DataRequestModal.js +168 -0
  53. package/lib/module/components/DataRequestModal.js.map +1 -0
  54. package/lib/module/components/Notification.js +99 -0
  55. package/lib/module/components/Notification.js.map +1 -0
  56. package/lib/module/components/OnairosButton.js +550 -0
  57. package/lib/module/components/OnairosButton.js.map +1 -0
  58. package/lib/module/components/Overlay.js +825 -0
  59. package/lib/module/components/Overlay.js.map +1 -0
  60. package/lib/module/components/UniversalOnboarding.js +164 -0
  61. package/lib/module/components/UniversalOnboarding.js.map +1 -0
  62. package/lib/module/components/onboarding/OAuthWebView.js +128 -0
  63. package/lib/module/components/onboarding/OAuthWebView.js.map +1 -0
  64. package/lib/module/components/onboarding/OnboardingHeader.js +66 -0
  65. package/lib/module/components/onboarding/OnboardingHeader.js.map +1 -0
  66. package/lib/module/components/onboarding/PinInput.js +274 -0
  67. package/lib/module/components/onboarding/PinInput.js.map +1 -0
  68. package/lib/module/components/onboarding/PlatformConnector.js +235 -0
  69. package/lib/module/components/onboarding/PlatformConnector.js.map +1 -0
  70. package/lib/module/components/screens/ConnectorScreen.js +137 -0
  71. package/lib/module/components/screens/ConnectorScreen.js.map +1 -0
  72. package/lib/module/components/screens/LoadingScreen.js +83 -0
  73. package/lib/module/components/screens/LoadingScreen.js.map +1 -0
  74. package/lib/module/components/screens/PinCreationScreen.js +53 -0
  75. package/lib/module/components/screens/PinCreationScreen.js.map +1 -0
  76. package/lib/module/constants/index.js +72 -0
  77. package/lib/module/constants/index.js.map +1 -0
  78. package/lib/module/hooks/useConnections.js +81 -0
  79. package/lib/module/hooks/useConnections.js.map +1 -0
  80. package/lib/module/hooks/useCredentials.js +77 -0
  81. package/lib/module/hooks/useCredentials.js.map +1 -0
  82. package/lib/module/index.js +34 -0
  83. package/lib/module/index.js.map +1 -0
  84. package/lib/module/services/oauthService.js +352 -0
  85. package/lib/module/services/oauthService.js.map +1 -0
  86. package/lib/module/types/declarations.d.js +2 -0
  87. package/lib/module/types/declarations.d.js.map +1 -0
  88. package/lib/module/types/index.js +2 -0
  89. package/lib/module/types/index.js.map +1 -0
  90. package/lib/module/utils/api.js +117 -0
  91. package/lib/module/utils/api.js.map +1 -0
  92. package/lib/module/utils/auth.js +99 -0
  93. package/lib/module/utils/auth.js.map +1 -0
  94. package/lib/module/utils/crypto.js +54 -0
  95. package/lib/module/utils/crypto.js.map +1 -0
  96. package/lib/module/utils/debugHelper.js +54 -0
  97. package/lib/module/utils/debugHelper.js.map +1 -0
  98. package/lib/module/utils/onairosApi.js +256 -0
  99. package/lib/module/utils/onairosApi.js.map +1 -0
  100. package/lib/module/utils/secureStorage.js +196 -0
  101. package/lib/module/utils/secureStorage.js.map +1 -0
  102. package/package.json +115 -0
  103. package/src/components/DataRequestModal.tsx +187 -0
  104. package/src/components/Notification.js +101 -0
  105. package/src/components/OnairosButton.js +604 -0
  106. package/src/components/OnairosButton.tsx +182 -0
  107. package/src/components/Overlay.js +854 -0
  108. package/src/components/Overlay.tsx +272 -0
  109. package/src/components/UniversalOnboarding.tsx +184 -0
  110. package/src/components/onboarding/OAuthWebView.tsx +134 -0
  111. package/src/components/onboarding/OnboardingHeader.tsx +70 -0
  112. package/src/components/onboarding/PinInput.tsx +356 -0
  113. package/src/components/onboarding/PlatformConnector.tsx +297 -0
  114. package/src/components/screens/ConnectorScreen.tsx +152 -0
  115. package/src/components/screens/LoadingScreen.tsx +100 -0
  116. package/src/components/screens/PinCreationScreen.tsx +67 -0
  117. package/src/constants/index.ts +78 -0
  118. package/src/hooks/useConnections.ts +90 -0
  119. package/src/hooks/useCredentials.ts +83 -0
  120. package/src/index.js +14 -0
  121. package/src/index.ts +82 -0
  122. package/src/services/oauthService.ts +360 -0
  123. package/src/types/declarations.d.ts +26 -0
  124. package/src/types/index.ts +82 -0
  125. package/src/utils/api.js +112 -0
  126. package/src/utils/auth.js +104 -0
  127. package/src/utils/crypto.js +60 -0
  128. package/src/utils/debugHelper.ts +53 -0
  129. package/src/utils/onairosApi.ts +303 -0
  130. package/src/utils/secureStorage.ts +230 -0
@@ -0,0 +1,818 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Overlay = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _reactNative = require("react-native");
9
+ var _bottomSheet = _interopRequireDefault(require("@gorhom/bottom-sheet"));
10
+ var _MaterialIcons = _interopRequireDefault(require("react-native-vector-icons/MaterialIcons"));
11
+ var _constants = require("../constants");
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
+ 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); }
14
+ const {
15
+ height
16
+ } = _reactNative.Dimensions.get('window');
17
+ const Overlay = ({
18
+ visible,
19
+ onClose,
20
+ onAccept,
21
+ AppName,
22
+ requestData,
23
+ biometricType = _reactNative.Platform.OS === 'ios' ? 'FaceID' : 'BiometricID'
24
+ }) => {
25
+ const bottomSheetRef = (0, _react.useRef)(null);
26
+ const snapPoints = (0, _react.useMemo)(() => ['85%'], []);
27
+
28
+ // Expand or collapse the bottom sheet based on visibility
29
+ (0, _react.useEffect)(() => {
30
+ if (visible) {
31
+ var _bottomSheetRef$curre;
32
+ (_bottomSheetRef$curre = bottomSheetRef.current) === null || _bottomSheetRef$curre === void 0 || _bottomSheetRef$curre.expand();
33
+ } else {
34
+ var _bottomSheetRef$curre2;
35
+ (_bottomSheetRef$curre2 = bottomSheetRef.current) === null || _bottomSheetRef$curre2 === void 0 || _bottomSheetRef$curre2.close();
36
+ }
37
+ }, [visible]);
38
+
39
+ // Get the icon for the biometric type
40
+ const getBiometricIcon = (0, _react.useCallback)(() => {
41
+ switch (biometricType) {
42
+ case 'FaceID':
43
+ return 'face';
44
+ case 'TouchID':
45
+ return 'fingerprint';
46
+ default:
47
+ return 'security';
48
+ }
49
+ }, [biometricType]);
50
+
51
+ // Render the requested data sections
52
+ const renderDataCategories = () => {
53
+ return Object.entries(requestData).map(([category, items]) => /*#__PURE__*/_react.default.createElement(_reactNative.View, {
54
+ key: category,
55
+ style: styles.categoryContainer
56
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
57
+ style: styles.categoryTitle
58
+ }, category), Object.entries(items).map(([item, description]) => /*#__PURE__*/_react.default.createElement(_reactNative.View, {
59
+ key: item,
60
+ style: styles.itemContainer
61
+ }, /*#__PURE__*/_react.default.createElement(_MaterialIcons.default, {
62
+ name: "check-circle",
63
+ size: 20,
64
+ color: _constants.COLORS.primary
65
+ }), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
66
+ style: styles.itemContent
67
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
68
+ style: styles.itemTitle
69
+ }, item), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
70
+ style: styles.itemDescription
71
+ }, description))))));
72
+ };
73
+ return /*#__PURE__*/_react.default.createElement(_bottomSheet.default, {
74
+ ref: bottomSheetRef,
75
+ index: visible ? 0 : -1,
76
+ snapPoints: snapPoints,
77
+ enablePanDownToClose: true,
78
+ onClose: onClose,
79
+ backdropComponent: ({
80
+ animatedIndex
81
+ }) => /*#__PURE__*/_react.default.createElement(_reactNative.View, {
82
+ style: [styles.backdrop, {
83
+ opacity: animatedIndex.interpolate({
84
+ inputRange: [0, 1],
85
+ outputRange: [0.5, 0]
86
+ })
87
+ }]
88
+ })
89
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
90
+ style: styles.container
91
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
92
+ style: styles.header
93
+ }, /*#__PURE__*/_react.default.createElement(_MaterialIcons.default, {
94
+ name: "shield",
95
+ size: 24,
96
+ color: _constants.COLORS.primary
97
+ }), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
98
+ style: styles.headerTitle
99
+ }, "Data Request"), /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
100
+ onPress: onClose,
101
+ style: styles.closeButton
102
+ }, /*#__PURE__*/_react.default.createElement(_MaterialIcons.default, {
103
+ name: "close",
104
+ size: 24,
105
+ color: "#000"
106
+ }))), /*#__PURE__*/_react.default.createElement(_reactNative.ScrollView, {
107
+ style: styles.content
108
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
109
+ style: styles.appInfoContainer
110
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
111
+ style: styles.appName
112
+ }, AppName), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
113
+ style: styles.requestText
114
+ }, "is requesting access to the following data:")), renderDataCategories(), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
115
+ style: styles.securityNotice
116
+ }, /*#__PURE__*/_react.default.createElement(_MaterialIcons.default, {
117
+ name: "security",
118
+ size: 20,
119
+ color: "#666"
120
+ }), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
121
+ style: styles.securityText
122
+ }, "Your data is securely processed and never shared with third parties."))), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
123
+ style: styles.footer
124
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
125
+ style: styles.cancelButton,
126
+ onPress: onClose
127
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
128
+ style: styles.cancelButtonText
129
+ }, "Deny")), /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
130
+ style: styles.acceptButton,
131
+ onPress: onAccept
132
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
133
+ style: styles.acceptButtonText
134
+ }, "Accept"), /*#__PURE__*/_react.default.createElement(_MaterialIcons.default, {
135
+ name: getBiometricIcon(),
136
+ size: 20,
137
+ color: "#fff",
138
+ style: styles.buttonIcon
139
+ })))));
140
+ };
141
+ exports.Overlay = Overlay;
142
+ const styles = _reactNative.StyleSheet.create({
143
+ container: {
144
+ flex: 1,
145
+ backgroundColor: '#fff'
146
+ },
147
+ backdrop: {
148
+ ..._reactNative.StyleSheet.absoluteFillObject,
149
+ backgroundColor: '#000'
150
+ },
151
+ header: {
152
+ flexDirection: 'row',
153
+ alignItems: 'center',
154
+ padding: 16,
155
+ backgroundColor: _constants.COLORS.headerBg,
156
+ borderTopLeftRadius: 16,
157
+ borderTopRightRadius: 16
158
+ },
159
+ headerTitle: {
160
+ flex: 1,
161
+ fontSize: 18,
162
+ fontWeight: '600',
163
+ marginLeft: 12,
164
+ color: '#000'
165
+ },
166
+ closeButton: {
167
+ padding: 8
168
+ },
169
+ content: {
170
+ flex: 1,
171
+ padding: 16
172
+ },
173
+ appInfoContainer: {
174
+ marginBottom: 24
175
+ },
176
+ appName: {
177
+ fontSize: 20,
178
+ fontWeight: 'bold',
179
+ color: '#000',
180
+ marginBottom: 4
181
+ },
182
+ requestText: {
183
+ fontSize: 16,
184
+ color: '#666'
185
+ },
186
+ categoryContainer: {
187
+ marginBottom: 20
188
+ },
189
+ categoryTitle: {
190
+ fontSize: 18,
191
+ fontWeight: '600',
192
+ color: '#000',
193
+ marginBottom: 12
194
+ },
195
+ itemContainer: {
196
+ flexDirection: 'row',
197
+ marginBottom: 12,
198
+ paddingLeft: 8
199
+ },
200
+ itemContent: {
201
+ flex: 1,
202
+ marginLeft: 12
203
+ },
204
+ itemTitle: {
205
+ fontSize: 16,
206
+ fontWeight: '500',
207
+ color: '#000',
208
+ marginBottom: 2
209
+ },
210
+ itemDescription: {
211
+ fontSize: 14,
212
+ color: '#666'
213
+ },
214
+ securityNotice: {
215
+ flexDirection: 'row',
216
+ alignItems: 'flex-start',
217
+ backgroundColor: '#f5f5f5',
218
+ padding: 12,
219
+ borderRadius: 8,
220
+ marginBottom: 24
221
+ },
222
+ securityText: {
223
+ flex: 1,
224
+ fontSize: 14,
225
+ color: '#666',
226
+ marginLeft: 8
227
+ },
228
+ footer: {
229
+ flexDirection: 'row',
230
+ padding: 16,
231
+ borderTopWidth: 1,
232
+ borderTopColor: '#eee'
233
+ },
234
+ cancelButton: {
235
+ flex: 1,
236
+ justifyContent: 'center',
237
+ alignItems: 'center',
238
+ paddingVertical: 12,
239
+ borderWidth: 1,
240
+ borderColor: '#ddd',
241
+ borderRadius: 25,
242
+ marginRight: 8
243
+ },
244
+ cancelButtonText: {
245
+ fontSize: 16,
246
+ fontWeight: '600',
247
+ color: '#666'
248
+ },
249
+ acceptButton: {
250
+ flex: 2,
251
+ flexDirection: 'row',
252
+ justifyContent: 'center',
253
+ alignItems: 'center',
254
+ paddingVertical: 12,
255
+ backgroundColor: _constants.COLORS.primary,
256
+ borderRadius: 25,
257
+ marginLeft: 8
258
+ },
259
+ acceptButtonText: {
260
+ fontSize: 16,
261
+ fontWeight: '600',
262
+ color: '#fff',
263
+ marginRight: 8
264
+ },
265
+ buttonIcon: {
266
+ marginLeft: 4
267
+ }
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
+ //# sourceMappingURL=Overlay.js.map