@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.
- package/README.md +334 -0
- package/lib/commonjs/components/DataRequestModal.js +176 -0
- package/lib/commonjs/components/DataRequestModal.js.map +1 -0
- package/lib/commonjs/components/Notification.js +106 -0
- package/lib/commonjs/components/Notification.js.map +1 -0
- package/lib/commonjs/components/OnairosButton.js +575 -0
- package/lib/commonjs/components/OnairosButton.js.map +1 -0
- package/lib/commonjs/components/Overlay.js +818 -0
- package/lib/commonjs/components/Overlay.js.map +1 -0
- package/lib/commonjs/components/UniversalOnboarding.js +173 -0
- package/lib/commonjs/components/UniversalOnboarding.js.map +1 -0
- package/lib/commonjs/components/onboarding/OAuthWebView.js +137 -0
- package/lib/commonjs/components/onboarding/OAuthWebView.js.map +1 -0
- package/lib/commonjs/components/onboarding/OnboardingHeader.js +74 -0
- package/lib/commonjs/components/onboarding/OnboardingHeader.js.map +1 -0
- package/lib/commonjs/components/onboarding/PinInput.js +283 -0
- package/lib/commonjs/components/onboarding/PinInput.js.map +1 -0
- package/lib/commonjs/components/onboarding/PlatformConnector.js +244 -0
- package/lib/commonjs/components/onboarding/PlatformConnector.js.map +1 -0
- package/lib/commonjs/components/screens/ConnectorScreen.js +145 -0
- package/lib/commonjs/components/screens/ConnectorScreen.js.map +1 -0
- package/lib/commonjs/components/screens/LoadingScreen.js +91 -0
- package/lib/commonjs/components/screens/LoadingScreen.js.map +1 -0
- package/lib/commonjs/components/screens/PinCreationScreen.js +61 -0
- package/lib/commonjs/components/screens/PinCreationScreen.js.map +1 -0
- package/lib/commonjs/constants/index.js +78 -0
- package/lib/commonjs/constants/index.js.map +1 -0
- package/lib/commonjs/hooks/useConnections.js +89 -0
- package/lib/commonjs/hooks/useConnections.js.map +1 -0
- package/lib/commonjs/hooks/useCredentials.js +85 -0
- package/lib/commonjs/hooks/useCredentials.js.map +1 -0
- package/lib/commonjs/index.js +282 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/services/oauthService.js +362 -0
- package/lib/commonjs/services/oauthService.js.map +1 -0
- package/lib/commonjs/types/declarations.d.js +2 -0
- package/lib/commonjs/types/declarations.d.js.map +1 -0
- package/lib/commonjs/types/index.js +2 -0
- package/lib/commonjs/types/index.js.map +1 -0
- package/lib/commonjs/utils/api.js +129 -0
- package/lib/commonjs/utils/api.js.map +1 -0
- package/lib/commonjs/utils/auth.js +111 -0
- package/lib/commonjs/utils/auth.js.map +1 -0
- package/lib/commonjs/utils/crypto.js +62 -0
- package/lib/commonjs/utils/crypto.js.map +1 -0
- package/lib/commonjs/utils/debugHelper.js +64 -0
- package/lib/commonjs/utils/debugHelper.js.map +1 -0
- package/lib/commonjs/utils/onairosApi.js +270 -0
- package/lib/commonjs/utils/onairosApi.js.map +1 -0
- package/lib/commonjs/utils/secureStorage.js +210 -0
- package/lib/commonjs/utils/secureStorage.js.map +1 -0
- package/lib/module/components/DataRequestModal.js +168 -0
- package/lib/module/components/DataRequestModal.js.map +1 -0
- package/lib/module/components/Notification.js +99 -0
- package/lib/module/components/Notification.js.map +1 -0
- package/lib/module/components/OnairosButton.js +550 -0
- package/lib/module/components/OnairosButton.js.map +1 -0
- package/lib/module/components/Overlay.js +825 -0
- package/lib/module/components/Overlay.js.map +1 -0
- package/lib/module/components/UniversalOnboarding.js +164 -0
- package/lib/module/components/UniversalOnboarding.js.map +1 -0
- package/lib/module/components/onboarding/OAuthWebView.js +128 -0
- package/lib/module/components/onboarding/OAuthWebView.js.map +1 -0
- package/lib/module/components/onboarding/OnboardingHeader.js +66 -0
- package/lib/module/components/onboarding/OnboardingHeader.js.map +1 -0
- package/lib/module/components/onboarding/PinInput.js +274 -0
- package/lib/module/components/onboarding/PinInput.js.map +1 -0
- package/lib/module/components/onboarding/PlatformConnector.js +235 -0
- package/lib/module/components/onboarding/PlatformConnector.js.map +1 -0
- package/lib/module/components/screens/ConnectorScreen.js +137 -0
- package/lib/module/components/screens/ConnectorScreen.js.map +1 -0
- package/lib/module/components/screens/LoadingScreen.js +83 -0
- package/lib/module/components/screens/LoadingScreen.js.map +1 -0
- package/lib/module/components/screens/PinCreationScreen.js +53 -0
- package/lib/module/components/screens/PinCreationScreen.js.map +1 -0
- package/lib/module/constants/index.js +72 -0
- package/lib/module/constants/index.js.map +1 -0
- package/lib/module/hooks/useConnections.js +81 -0
- package/lib/module/hooks/useConnections.js.map +1 -0
- package/lib/module/hooks/useCredentials.js +77 -0
- package/lib/module/hooks/useCredentials.js.map +1 -0
- package/lib/module/index.js +34 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/services/oauthService.js +352 -0
- package/lib/module/services/oauthService.js.map +1 -0
- package/lib/module/types/declarations.d.js +2 -0
- package/lib/module/types/declarations.d.js.map +1 -0
- package/lib/module/types/index.js +2 -0
- package/lib/module/types/index.js.map +1 -0
- package/lib/module/utils/api.js +117 -0
- package/lib/module/utils/api.js.map +1 -0
- package/lib/module/utils/auth.js +99 -0
- package/lib/module/utils/auth.js.map +1 -0
- package/lib/module/utils/crypto.js +54 -0
- package/lib/module/utils/crypto.js.map +1 -0
- package/lib/module/utils/debugHelper.js +54 -0
- package/lib/module/utils/debugHelper.js.map +1 -0
- package/lib/module/utils/onairosApi.js +256 -0
- package/lib/module/utils/onairosApi.js.map +1 -0
- package/lib/module/utils/secureStorage.js +196 -0
- package/lib/module/utils/secureStorage.js.map +1 -0
- package/package.json +115 -0
- package/src/components/DataRequestModal.tsx +187 -0
- package/src/components/Notification.js +101 -0
- package/src/components/OnairosButton.js +604 -0
- package/src/components/OnairosButton.tsx +182 -0
- package/src/components/Overlay.js +854 -0
- package/src/components/Overlay.tsx +272 -0
- package/src/components/UniversalOnboarding.tsx +184 -0
- package/src/components/onboarding/OAuthWebView.tsx +134 -0
- package/src/components/onboarding/OnboardingHeader.tsx +70 -0
- package/src/components/onboarding/PinInput.tsx +356 -0
- package/src/components/onboarding/PlatformConnector.tsx +297 -0
- package/src/components/screens/ConnectorScreen.tsx +152 -0
- package/src/components/screens/LoadingScreen.tsx +100 -0
- package/src/components/screens/PinCreationScreen.tsx +67 -0
- package/src/constants/index.ts +78 -0
- package/src/hooks/useConnections.ts +90 -0
- package/src/hooks/useCredentials.ts +83 -0
- package/src/index.js +14 -0
- package/src/index.ts +82 -0
- package/src/services/oauthService.ts +360 -0
- package/src/types/declarations.d.ts +26 -0
- package/src/types/index.ts +82 -0
- package/src/utils/api.js +112 -0
- package/src/utils/auth.js +104 -0
- package/src/utils/crypto.js +60 -0
- package/src/utils/debugHelper.ts +53 -0
- package/src/utils/onairosApi.ts +303 -0
- package/src/utils/secureStorage.ts +230 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.verifyCredentials = exports.updateCredentials = exports.storeCredentials = exports.hasCredentials = exports.getCredentials = exports.generateDeviceUsername = exports.deleteCredentials = void 0;
|
|
7
|
+
var Keychain = _interopRequireWildcard(require("react-native-keychain"));
|
|
8
|
+
var _reactNative = require("react-native");
|
|
9
|
+
var _crypto = require("./crypto");
|
|
10
|
+
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); }
|
|
11
|
+
const CREDENTIALS_KEY = 'onairos_credentials';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Store credentials securely in the device keychain with optional biometric protection
|
|
15
|
+
*/
|
|
16
|
+
const storeCredentials = async (credentials, options = {}) => {
|
|
17
|
+
try {
|
|
18
|
+
const {
|
|
19
|
+
useBiometrics = true,
|
|
20
|
+
biometricPrompt
|
|
21
|
+
} = options;
|
|
22
|
+
|
|
23
|
+
// Create a JSON string of the credentials
|
|
24
|
+
const credentialsString = JSON.stringify(credentials);
|
|
25
|
+
|
|
26
|
+
// Configure security options based on platform
|
|
27
|
+
const securityOptions = {
|
|
28
|
+
service: CREDENTIALS_KEY,
|
|
29
|
+
accessible: Keychain.ACCESSIBLE.WHEN_UNLOCKED_THIS_DEVICE_ONLY
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// Add biometric protection if requested
|
|
33
|
+
if (useBiometrics) {
|
|
34
|
+
// iOS specific options
|
|
35
|
+
if (_reactNative.Platform.OS === 'ios') {
|
|
36
|
+
securityOptions.accessControl = Keychain.ACCESS_CONTROL.BIOMETRY_ANY_OR_DEVICE_PASSCODE;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Android specific options
|
|
40
|
+
if (_reactNative.Platform.OS === 'android') {
|
|
41
|
+
securityOptions.accessControl = Keychain.ACCESS_CONTROL.BIOMETRY_ANY;
|
|
42
|
+
if (biometricPrompt) {
|
|
43
|
+
securityOptions.authenticationType = Keychain.AUTHENTICATION_TYPE.BIOMETRIC;
|
|
44
|
+
securityOptions.authenticationPrompt = {
|
|
45
|
+
title: biometricPrompt.title || 'Biometric Authentication',
|
|
46
|
+
subtitle: biometricPrompt.subtitle,
|
|
47
|
+
description: 'Please authenticate to access your Onairos credentials',
|
|
48
|
+
cancel: 'Cancel'
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Store in the secure keychain
|
|
55
|
+
await Keychain.setGenericPassword(credentials.username, credentialsString, securityOptions);
|
|
56
|
+
return true;
|
|
57
|
+
} catch (error) {
|
|
58
|
+
console.error('Error storing credentials:', error);
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Retrieve credentials from secure storage, potentially requiring biometric authentication
|
|
65
|
+
*/
|
|
66
|
+
exports.storeCredentials = storeCredentials;
|
|
67
|
+
const getCredentials = async (options = {}) => {
|
|
68
|
+
try {
|
|
69
|
+
const {
|
|
70
|
+
useBiometrics = true,
|
|
71
|
+
biometricPrompt
|
|
72
|
+
} = options;
|
|
73
|
+
|
|
74
|
+
// Configure security options
|
|
75
|
+
const securityOptions = {
|
|
76
|
+
service: CREDENTIALS_KEY
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
// Add biometric prompt if required
|
|
80
|
+
if (useBiometrics && biometricPrompt) {
|
|
81
|
+
securityOptions.authenticationPrompt = {
|
|
82
|
+
title: biometricPrompt.title || 'Biometric Authentication',
|
|
83
|
+
subtitle: biometricPrompt.subtitle,
|
|
84
|
+
description: 'Please authenticate to access your Onairos credentials',
|
|
85
|
+
cancel: 'Cancel'
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Retrieve from keychain
|
|
90
|
+
const result = await Keychain.getGenericPassword(securityOptions);
|
|
91
|
+
if (!result) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Parse the stored JSON
|
|
96
|
+
const credentials = JSON.parse(result.password);
|
|
97
|
+
return credentials;
|
|
98
|
+
} catch (error) {
|
|
99
|
+
console.error('Error retrieving credentials:', error);
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Check if the user has stored credentials
|
|
106
|
+
*/
|
|
107
|
+
exports.getCredentials = getCredentials;
|
|
108
|
+
const hasCredentials = async () => {
|
|
109
|
+
try {
|
|
110
|
+
const result = await Keychain.getGenericPassword({
|
|
111
|
+
service: CREDENTIALS_KEY
|
|
112
|
+
});
|
|
113
|
+
return !!result;
|
|
114
|
+
} catch (error) {
|
|
115
|
+
console.error('Error checking for credentials:', error);
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Delete stored credentials
|
|
122
|
+
*/
|
|
123
|
+
exports.hasCredentials = hasCredentials;
|
|
124
|
+
const deleteCredentials = async () => {
|
|
125
|
+
try {
|
|
126
|
+
await Keychain.resetGenericPassword({
|
|
127
|
+
service: CREDENTIALS_KEY
|
|
128
|
+
});
|
|
129
|
+
return true;
|
|
130
|
+
} catch (error) {
|
|
131
|
+
console.error('Error deleting credentials:', error);
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Update specific fields in the stored credentials
|
|
138
|
+
*/
|
|
139
|
+
exports.deleteCredentials = deleteCredentials;
|
|
140
|
+
const updateCredentials = async (updates, options = {}) => {
|
|
141
|
+
try {
|
|
142
|
+
// Get current credentials
|
|
143
|
+
const currentCredentials = await getCredentials(options);
|
|
144
|
+
if (!currentCredentials) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Merge updates with current credentials
|
|
149
|
+
const updatedCredentials = {
|
|
150
|
+
...currentCredentials,
|
|
151
|
+
...updates
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
// Store updated credentials
|
|
155
|
+
return await storeCredentials(updatedCredentials, options);
|
|
156
|
+
} catch (error) {
|
|
157
|
+
console.error('Error updating credentials:', error);
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Generate a device-specific unique username
|
|
164
|
+
*/
|
|
165
|
+
exports.updateCredentials = updateCredentials;
|
|
166
|
+
const generateDeviceUsername = async () => {
|
|
167
|
+
try {
|
|
168
|
+
// Get a device-specific identifier that we can use
|
|
169
|
+
// This is a simplified example - in production you might want to use
|
|
170
|
+
// a more robust device identifier method
|
|
171
|
+
const deviceInfo = `${_reactNative.Platform.OS}-${_reactNative.Platform.Version}-${Date.now()}`;
|
|
172
|
+
|
|
173
|
+
// Hash it to create a unique identifier
|
|
174
|
+
const username = `onairos_${(0, _crypto.sha256)(deviceInfo).substring(0, 10)}`;
|
|
175
|
+
return username;
|
|
176
|
+
} catch (error) {
|
|
177
|
+
console.error('Error generating device username:', error);
|
|
178
|
+
// Fallback to a timestamp-based username if there's an error
|
|
179
|
+
return `onairos_${Date.now().toString(36)}`;
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Verify if credentials are valid (not expired, etc.)
|
|
185
|
+
*/
|
|
186
|
+
exports.generateDeviceUsername = generateDeviceUsername;
|
|
187
|
+
const verifyCredentials = async credentials => {
|
|
188
|
+
try {
|
|
189
|
+
// Basic verification - check if credentials exist and aren't too old
|
|
190
|
+
if (!credentials || !credentials.accessToken || !credentials.username) {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Check for expiration (example: credentials expire after 30 days)
|
|
195
|
+
const thirtyDaysMs = 30 * 24 * 60 * 60 * 1000;
|
|
196
|
+
const isExpired = Date.now() - credentials.createdAt > thirtyDaysMs;
|
|
197
|
+
if (isExpired) {
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Add any additional verification logic here
|
|
202
|
+
|
|
203
|
+
return true;
|
|
204
|
+
} catch (error) {
|
|
205
|
+
console.error('Error verifying credentials:', error);
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
exports.verifyCredentials = verifyCredentials;
|
|
210
|
+
//# sourceMappingURL=secureStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Keychain","_interopRequireWildcard","require","_reactNative","_crypto","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","CREDENTIALS_KEY","storeCredentials","credentials","options","useBiometrics","biometricPrompt","credentialsString","JSON","stringify","securityOptions","service","accessible","ACCESSIBLE","WHEN_UNLOCKED_THIS_DEVICE_ONLY","Platform","OS","accessControl","ACCESS_CONTROL","BIOMETRY_ANY_OR_DEVICE_PASSCODE","BIOMETRY_ANY","authenticationType","AUTHENTICATION_TYPE","BIOMETRIC","authenticationPrompt","title","subtitle","description","cancel","setGenericPassword","username","error","console","exports","getCredentials","result","getGenericPassword","parse","password","hasCredentials","deleteCredentials","resetGenericPassword","updateCredentials","updates","currentCredentials","updatedCredentials","generateDeviceUsername","deviceInfo","Version","Date","now","sha256","substring","toString","verifyCredentials","accessToken","thirtyDaysMs","isExpired","createdAt"],"sourceRoot":"..\\..\\..\\src","sources":["utils/secureStorage.ts"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AAAkC,SAAAD,wBAAAI,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAN,uBAAA,YAAAA,CAAAI,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAwBlC,MAAMkB,eAAe,GAAG,qBAAqB;;AAE7C;AACA;AACA;AACO,MAAMC,gBAAgB,GAAG,MAAAA,CAC9BC,WAA+B,EAC/BC,OAAuB,GAAG,CAAC,CAAC,KACP;EACrB,IAAI;IACF,MAAM;MAAEC,aAAa,GAAG,IAAI;MAAEC;IAAgB,CAAC,GAAGF,OAAO;;IAEzD;IACA,MAAMG,iBAAiB,GAAGC,IAAI,CAACC,SAAS,CAACN,WAAW,CAAC;;IAErD;IACA,MAAMO,eAAiC,GAAG;MACxCC,OAAO,EAAEV,eAAe;MACxBW,UAAU,EAAEnC,QAAQ,CAACoC,UAAU,CAACC;IAClC,CAAC;;IAED;IACA,IAAIT,aAAa,EAAE;MACjB;MACA,IAAIU,qBAAQ,CAACC,EAAE,KAAK,KAAK,EAAE;QACzBN,eAAe,CAACO,aAAa,GAAGxC,QAAQ,CAACyC,cAAc,CAACC,+BAA+B;MACzF;;MAEA;MACA,IAAIJ,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE;QAC7BN,eAAe,CAACO,aAAa,GAAGxC,QAAQ,CAACyC,cAAc,CAACE,YAAY;QACpE,IAAId,eAAe,EAAE;UACnBI,eAAe,CAACW,kBAAkB,GAAG5C,QAAQ,CAAC6C,mBAAmB,CAACC,SAAS;UAC3Eb,eAAe,CAACc,oBAAoB,GAAG;YACrCC,KAAK,EAAEnB,eAAe,CAACmB,KAAK,IAAI,0BAA0B;YAC1DC,QAAQ,EAAEpB,eAAe,CAACoB,QAAQ;YAClCC,WAAW,EAAE,wDAAwD;YACrEC,MAAM,EAAE;UACV,CAAC;QACH;MACF;IACF;;IAEA;IACA,MAAMnD,QAAQ,CAACoD,kBAAkB,CAC/B1B,WAAW,CAAC2B,QAAQ,EACpBvB,iBAAiB,EACjBG,eACF,CAAC;IAED,OAAO,IAAI;EACb,CAAC,CAAC,OAAOqB,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,4BAA4B,EAAEA,KAAK,CAAC;IAClD,OAAO,KAAK;EACd;AACF,CAAC;;AAED;AACA;AACA;AAFAE,OAAA,CAAA/B,gBAAA,GAAAA,gBAAA;AAGO,MAAMgC,cAAc,GAAG,MAAAA,CAC5B9B,OAAuB,GAAG,CAAC,CAAC,KACW;EACvC,IAAI;IACF,MAAM;MAAEC,aAAa,GAAG,IAAI;MAAEC;IAAgB,CAAC,GAAGF,OAAO;;IAEzD;IACA,MAAMM,eAAiC,GAAG;MACxCC,OAAO,EAAEV;IACX,CAAC;;IAED;IACA,IAAII,aAAa,IAAIC,eAAe,EAAE;MACpCI,eAAe,CAACc,oBAAoB,GAAG;QACrCC,KAAK,EAAEnB,eAAe,CAACmB,KAAK,IAAI,0BAA0B;QAC1DC,QAAQ,EAAEpB,eAAe,CAACoB,QAAQ;QAClCC,WAAW,EAAE,wDAAwD;QACrEC,MAAM,EAAE;MACV,CAAC;IACH;;IAEA;IACA,MAAMO,MAAM,GAAG,MAAM1D,QAAQ,CAAC2D,kBAAkB,CAAC1B,eAAe,CAAC;IAEjE,IAAI,CAACyB,MAAM,EAAE;MACX,OAAO,IAAI;IACb;;IAEA;IACA,MAAMhC,WAA+B,GAAGK,IAAI,CAAC6B,KAAK,CAACF,MAAM,CAACG,QAAQ,CAAC;IACnE,OAAOnC,WAAW;EACpB,CAAC,CAAC,OAAO4B,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,+BAA+B,EAAEA,KAAK,CAAC;IACrD,OAAO,IAAI;EACb;AACF,CAAC;;AAED;AACA;AACA;AAFAE,OAAA,CAAAC,cAAA,GAAAA,cAAA;AAGO,MAAMK,cAAc,GAAG,MAAAA,CAAA,KAA8B;EAC1D,IAAI;IACF,MAAMJ,MAAM,GAAG,MAAM1D,QAAQ,CAAC2D,kBAAkB,CAAC;MAC/CzB,OAAO,EAAEV;IACX,CAAC,CAAC;IAEF,OAAO,CAAC,CAACkC,MAAM;EACjB,CAAC,CAAC,OAAOJ,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,iCAAiC,EAAEA,KAAK,CAAC;IACvD,OAAO,KAAK;EACd;AACF,CAAC;;AAED;AACA;AACA;AAFAE,OAAA,CAAAM,cAAA,GAAAA,cAAA;AAGO,MAAMC,iBAAiB,GAAG,MAAAA,CAAA,KAA8B;EAC7D,IAAI;IACF,MAAM/D,QAAQ,CAACgE,oBAAoB,CAAC;MAAE9B,OAAO,EAAEV;IAAgB,CAAC,CAAC;IACjE,OAAO,IAAI;EACb,CAAC,CAAC,OAAO8B,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,6BAA6B,EAAEA,KAAK,CAAC;IACnD,OAAO,KAAK;EACd;AACF,CAAC;;AAED;AACA;AACA;AAFAE,OAAA,CAAAO,iBAAA,GAAAA,iBAAA;AAGO,MAAME,iBAAiB,GAAG,MAAAA,CAC/BC,OAAoC,EACpCvC,OAAuB,GAAG,CAAC,CAAC,KACP;EACrB,IAAI;IACF;IACA,MAAMwC,kBAAkB,GAAG,MAAMV,cAAc,CAAC9B,OAAO,CAAC;IAExD,IAAI,CAACwC,kBAAkB,EAAE;MACvB,OAAO,KAAK;IACd;;IAEA;IACA,MAAMC,kBAAsC,GAAG;MAC7C,GAAGD,kBAAkB;MACrB,GAAGD;IACL,CAAC;;IAED;IACA,OAAO,MAAMzC,gBAAgB,CAAC2C,kBAAkB,EAAEzC,OAAO,CAAC;EAC5D,CAAC,CAAC,OAAO2B,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,6BAA6B,EAAEA,KAAK,CAAC;IACnD,OAAO,KAAK;EACd;AACF,CAAC;;AAED;AACA;AACA;AAFAE,OAAA,CAAAS,iBAAA,GAAAA,iBAAA;AAGO,MAAMI,sBAAsB,GAAG,MAAAA,CAAA,KAA6B;EACjE,IAAI;IACF;IACA;IACA;IACA,MAAMC,UAAU,GAAG,GAAGhC,qBAAQ,CAACC,EAAE,IAAID,qBAAQ,CAACiC,OAAO,IAAIC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE;;IAErE;IACA,MAAMpB,QAAQ,GAAG,WAAW,IAAAqB,cAAM,EAACJ,UAAU,CAAC,CAACK,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;IAEjE,OAAOtB,QAAQ;EACjB,CAAC,CAAC,OAAOC,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,mCAAmC,EAAEA,KAAK,CAAC;IACzD;IACA,OAAO,WAAWkB,IAAI,CAACC,GAAG,CAAC,CAAC,CAACG,QAAQ,CAAC,EAAE,CAAC,EAAE;EAC7C;AACF,CAAC;;AAED;AACA;AACA;AAFApB,OAAA,CAAAa,sBAAA,GAAAA,sBAAA;AAGO,MAAMQ,iBAAiB,GAAG,MAC/BnD,WAA+B,IACV;EACrB,IAAI;IACF;IACA,IAAI,CAACA,WAAW,IAAI,CAACA,WAAW,CAACoD,WAAW,IAAI,CAACpD,WAAW,CAAC2B,QAAQ,EAAE;MACrE,OAAO,KAAK;IACd;;IAEA;IACA,MAAM0B,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;IAC7C,MAAMC,SAAS,GAAGR,IAAI,CAACC,GAAG,CAAC,CAAC,GAAG/C,WAAW,CAACuD,SAAS,GAAGF,YAAY;IAEnE,IAAIC,SAAS,EAAE;MACb,OAAO,KAAK;IACd;;IAEA;;IAEA,OAAO,IAAI;EACb,CAAC,CAAC,OAAO1B,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,8BAA8B,EAAEA,KAAK,CAAC;IACpD,OAAO,KAAK;EACd;AACF,CAAC;AAACE,OAAA,CAAAqB,iBAAA,GAAAA,iBAAA","ignoreList":[]}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { View, Text, StyleSheet, TouchableOpacity, ScrollView, Modal } from 'react-native';
|
|
3
|
+
import Icon from 'react-native-vector-icons/MaterialIcons';
|
|
4
|
+
import { COLORS, PLATFORMS } from '../constants';
|
|
5
|
+
export const DataRequestModal = ({
|
|
6
|
+
visible,
|
|
7
|
+
onClose,
|
|
8
|
+
onAccept,
|
|
9
|
+
requestData,
|
|
10
|
+
AppName
|
|
11
|
+
}) => {
|
|
12
|
+
const renderPermissions = () => {
|
|
13
|
+
return Object.entries(requestData).map(([platform, permissions]) => {
|
|
14
|
+
const platformConfig = PLATFORMS[platform];
|
|
15
|
+
if (!platformConfig) return null;
|
|
16
|
+
return /*#__PURE__*/React.createElement(View, {
|
|
17
|
+
key: platform,
|
|
18
|
+
style: styles.platformContainer
|
|
19
|
+
}, /*#__PURE__*/React.createElement(View, {
|
|
20
|
+
style: styles.platformHeader
|
|
21
|
+
}, /*#__PURE__*/React.createElement(Icon, {
|
|
22
|
+
name: platformConfig.icon,
|
|
23
|
+
size: 24,
|
|
24
|
+
color: platformConfig.color
|
|
25
|
+
}), /*#__PURE__*/React.createElement(Text, {
|
|
26
|
+
style: styles.platformName
|
|
27
|
+
}, platformConfig.name)), /*#__PURE__*/React.createElement(View, {
|
|
28
|
+
style: styles.permissionsContainer
|
|
29
|
+
}, Object.entries(permissions).map(([key, value]) => /*#__PURE__*/React.createElement(Text, {
|
|
30
|
+
key: key,
|
|
31
|
+
style: styles.permissionText
|
|
32
|
+
}, "\u2022 ", key, ": ", value))));
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
return /*#__PURE__*/React.createElement(Modal, {
|
|
36
|
+
visible: visible,
|
|
37
|
+
transparent: true,
|
|
38
|
+
animationType: "slide",
|
|
39
|
+
onRequestClose: onClose
|
|
40
|
+
}, /*#__PURE__*/React.createElement(View, {
|
|
41
|
+
style: styles.modalOverlay
|
|
42
|
+
}, /*#__PURE__*/React.createElement(View, {
|
|
43
|
+
style: styles.modalContent
|
|
44
|
+
}, /*#__PURE__*/React.createElement(View, {
|
|
45
|
+
style: styles.header
|
|
46
|
+
}, /*#__PURE__*/React.createElement(Icon, {
|
|
47
|
+
name: "auto_awesome",
|
|
48
|
+
size: 24,
|
|
49
|
+
color: COLORS.primary
|
|
50
|
+
}), /*#__PURE__*/React.createElement(Text, {
|
|
51
|
+
style: styles.headerTitle
|
|
52
|
+
}, AppName, " Data Request"), /*#__PURE__*/React.createElement(TouchableOpacity, {
|
|
53
|
+
onPress: onClose,
|
|
54
|
+
style: styles.closeButton
|
|
55
|
+
}, /*#__PURE__*/React.createElement(Icon, {
|
|
56
|
+
name: "close",
|
|
57
|
+
size: 24,
|
|
58
|
+
color: "#000"
|
|
59
|
+
}))), /*#__PURE__*/React.createElement(ScrollView, {
|
|
60
|
+
style: styles.scrollContent
|
|
61
|
+
}, /*#__PURE__*/React.createElement(Text, {
|
|
62
|
+
style: styles.description
|
|
63
|
+
}, AppName, " is requesting access to the following data:"), renderPermissions()), /*#__PURE__*/React.createElement(View, {
|
|
64
|
+
style: styles.footer
|
|
65
|
+
}, /*#__PURE__*/React.createElement(TouchableOpacity, {
|
|
66
|
+
style: [styles.button, styles.cancelButton],
|
|
67
|
+
onPress: onClose
|
|
68
|
+
}, /*#__PURE__*/React.createElement(Text, {
|
|
69
|
+
style: styles.cancelButtonText
|
|
70
|
+
}, "Cancel")), /*#__PURE__*/React.createElement(TouchableOpacity, {
|
|
71
|
+
style: [styles.button, styles.acceptButton],
|
|
72
|
+
onPress: onAccept
|
|
73
|
+
}, /*#__PURE__*/React.createElement(Text, {
|
|
74
|
+
style: styles.acceptButtonText
|
|
75
|
+
}, "Accept"))))));
|
|
76
|
+
};
|
|
77
|
+
const styles = StyleSheet.create({
|
|
78
|
+
modalOverlay: {
|
|
79
|
+
flex: 1,
|
|
80
|
+
backgroundColor: 'rgba(0, 0, 0, 0.5)',
|
|
81
|
+
justifyContent: 'center',
|
|
82
|
+
alignItems: 'center'
|
|
83
|
+
},
|
|
84
|
+
modalContent: {
|
|
85
|
+
backgroundColor: '#fff',
|
|
86
|
+
borderRadius: 16,
|
|
87
|
+
width: '90%',
|
|
88
|
+
maxHeight: '80%',
|
|
89
|
+
overflow: 'hidden'
|
|
90
|
+
},
|
|
91
|
+
header: {
|
|
92
|
+
flexDirection: 'row',
|
|
93
|
+
alignItems: 'center',
|
|
94
|
+
padding: 16,
|
|
95
|
+
backgroundColor: COLORS.headerBg
|
|
96
|
+
},
|
|
97
|
+
headerTitle: {
|
|
98
|
+
flex: 1,
|
|
99
|
+
fontSize: 18,
|
|
100
|
+
fontWeight: '600',
|
|
101
|
+
marginLeft: 12,
|
|
102
|
+
color: '#000'
|
|
103
|
+
},
|
|
104
|
+
closeButton: {
|
|
105
|
+
padding: 8
|
|
106
|
+
},
|
|
107
|
+
scrollContent: {
|
|
108
|
+
padding: 16
|
|
109
|
+
},
|
|
110
|
+
description: {
|
|
111
|
+
fontSize: 16,
|
|
112
|
+
color: COLORS.text.secondary,
|
|
113
|
+
marginBottom: 16
|
|
114
|
+
},
|
|
115
|
+
platformContainer: {
|
|
116
|
+
marginBottom: 16,
|
|
117
|
+
borderWidth: 1,
|
|
118
|
+
borderColor: COLORS.border,
|
|
119
|
+
borderRadius: 8,
|
|
120
|
+
padding: 12
|
|
121
|
+
},
|
|
122
|
+
platformHeader: {
|
|
123
|
+
flexDirection: 'row',
|
|
124
|
+
alignItems: 'center',
|
|
125
|
+
marginBottom: 8
|
|
126
|
+
},
|
|
127
|
+
platformName: {
|
|
128
|
+
fontSize: 16,
|
|
129
|
+
fontWeight: '600',
|
|
130
|
+
marginLeft: 8
|
|
131
|
+
},
|
|
132
|
+
permissionsContainer: {
|
|
133
|
+
marginLeft: 32
|
|
134
|
+
},
|
|
135
|
+
permissionText: {
|
|
136
|
+
fontSize: 14,
|
|
137
|
+
color: COLORS.text.secondary,
|
|
138
|
+
marginBottom: 4
|
|
139
|
+
},
|
|
140
|
+
footer: {
|
|
141
|
+
flexDirection: 'row',
|
|
142
|
+
padding: 16,
|
|
143
|
+
borderTopWidth: 1,
|
|
144
|
+
borderTopColor: COLORS.border,
|
|
145
|
+
justifyContent: 'flex-end'
|
|
146
|
+
},
|
|
147
|
+
button: {
|
|
148
|
+
paddingHorizontal: 20,
|
|
149
|
+
paddingVertical: 10,
|
|
150
|
+
borderRadius: 8,
|
|
151
|
+
marginLeft: 12
|
|
152
|
+
},
|
|
153
|
+
cancelButton: {
|
|
154
|
+
backgroundColor: COLORS.border
|
|
155
|
+
},
|
|
156
|
+
acceptButton: {
|
|
157
|
+
backgroundColor: COLORS.primary
|
|
158
|
+
},
|
|
159
|
+
cancelButtonText: {
|
|
160
|
+
color: COLORS.text.secondary,
|
|
161
|
+
fontWeight: '600'
|
|
162
|
+
},
|
|
163
|
+
acceptButtonText: {
|
|
164
|
+
color: '#fff',
|
|
165
|
+
fontWeight: '600'
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
//# sourceMappingURL=DataRequestModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","View","Text","StyleSheet","TouchableOpacity","ScrollView","Modal","Icon","COLORS","PLATFORMS","DataRequestModal","visible","onClose","onAccept","requestData","AppName","renderPermissions","Object","entries","map","platform","permissions","platformConfig","createElement","key","style","styles","platformContainer","platformHeader","name","icon","size","color","platformName","permissionsContainer","value","permissionText","transparent","animationType","onRequestClose","modalOverlay","modalContent","header","primary","headerTitle","onPress","closeButton","scrollContent","description","footer","button","cancelButton","cancelButtonText","acceptButton","acceptButtonText","create","flex","backgroundColor","justifyContent","alignItems","borderRadius","width","maxHeight","overflow","flexDirection","padding","headerBg","fontSize","fontWeight","marginLeft","text","secondary","marginBottom","borderWidth","borderColor","border","borderTopWidth","borderTopColor","paddingHorizontal","paddingVertical"],"sourceRoot":"..\\..\\..\\src","sources":["components/DataRequestModal.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import React, { useEffect, useState } from 'react';
|
|
2
|
+
import { View, Text, StyleSheet, Animated } from 'react-native';
|
|
3
|
+
const Notification = ({
|
|
4
|
+
message,
|
|
5
|
+
color = 'blue',
|
|
6
|
+
duration = 3000,
|
|
7
|
+
onClose
|
|
8
|
+
}) => {
|
|
9
|
+
const [fadeAnim] = useState(new Animated.Value(0));
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
// Fade in
|
|
12
|
+
Animated.timing(fadeAnim, {
|
|
13
|
+
toValue: 1,
|
|
14
|
+
duration: 300,
|
|
15
|
+
useNativeDriver: true
|
|
16
|
+
}).start();
|
|
17
|
+
|
|
18
|
+
// Set timeout to fade out
|
|
19
|
+
const timer = setTimeout(() => {
|
|
20
|
+
Animated.timing(fadeAnim, {
|
|
21
|
+
toValue: 0,
|
|
22
|
+
duration: 300,
|
|
23
|
+
useNativeDriver: true
|
|
24
|
+
}).start(() => {
|
|
25
|
+
if (onClose) onClose();
|
|
26
|
+
});
|
|
27
|
+
}, duration);
|
|
28
|
+
return () => clearTimeout(timer);
|
|
29
|
+
}, []);
|
|
30
|
+
|
|
31
|
+
// Determine background color based on the color prop
|
|
32
|
+
const getBackgroundColor = () => {
|
|
33
|
+
switch (color) {
|
|
34
|
+
case 'red':
|
|
35
|
+
return '#FFEBEE';
|
|
36
|
+
case 'green':
|
|
37
|
+
return '#E8F5E9';
|
|
38
|
+
case 'yellow':
|
|
39
|
+
return '#FFF8E1';
|
|
40
|
+
default:
|
|
41
|
+
return '#E3F2FD';
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// Determine text color based on the color prop
|
|
46
|
+
const getTextColor = () => {
|
|
47
|
+
switch (color) {
|
|
48
|
+
case 'red':
|
|
49
|
+
return '#D32F2F';
|
|
50
|
+
case 'green':
|
|
51
|
+
return '#388E3C';
|
|
52
|
+
case 'yellow':
|
|
53
|
+
return '#F57F17';
|
|
54
|
+
default:
|
|
55
|
+
return '#1976D2';
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
return /*#__PURE__*/React.createElement(Animated.View, {
|
|
59
|
+
style: [styles.container, {
|
|
60
|
+
backgroundColor: getBackgroundColor(),
|
|
61
|
+
opacity: fadeAnim,
|
|
62
|
+
transform: [{
|
|
63
|
+
translateY: fadeAnim.interpolate({
|
|
64
|
+
inputRange: [0, 1],
|
|
65
|
+
outputRange: [-20, 0]
|
|
66
|
+
})
|
|
67
|
+
}]
|
|
68
|
+
}]
|
|
69
|
+
}, /*#__PURE__*/React.createElement(Text, {
|
|
70
|
+
style: [styles.message, {
|
|
71
|
+
color: getTextColor()
|
|
72
|
+
}]
|
|
73
|
+
}, message));
|
|
74
|
+
};
|
|
75
|
+
const styles = StyleSheet.create({
|
|
76
|
+
container: {
|
|
77
|
+
position: 'absolute',
|
|
78
|
+
top: 40,
|
|
79
|
+
left: 20,
|
|
80
|
+
right: 20,
|
|
81
|
+
padding: 16,
|
|
82
|
+
borderRadius: 8,
|
|
83
|
+
shadowColor: '#000',
|
|
84
|
+
shadowOffset: {
|
|
85
|
+
width: 0,
|
|
86
|
+
height: 2
|
|
87
|
+
},
|
|
88
|
+
shadowOpacity: 0.1,
|
|
89
|
+
shadowRadius: 4,
|
|
90
|
+
elevation: 3,
|
|
91
|
+
zIndex: 1000
|
|
92
|
+
},
|
|
93
|
+
message: {
|
|
94
|
+
fontSize: 16,
|
|
95
|
+
fontWeight: '500'
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
export default Notification;
|
|
99
|
+
//# sourceMappingURL=Notification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","useEffect","useState","View","Text","StyleSheet","Animated","Notification","message","color","duration","onClose","fadeAnim","Value","timing","toValue","useNativeDriver","start","timer","setTimeout","clearTimeout","getBackgroundColor","getTextColor","createElement","style","styles","container","backgroundColor","opacity","transform","translateY","interpolate","inputRange","outputRange","create","position","top","left","right","padding","borderRadius","shadowColor","shadowOffset","width","height","shadowOpacity","shadowRadius","elevation","zIndex","fontSize","fontWeight"],"sourceRoot":"..\\..\\..\\src","sources":["components/Notification.js"],"mappings":"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","ignoreList":[]}
|