@oxyhq/services 5.13.21 → 5.13.23
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/core/OxyServices.base.js +34 -21
- package/lib/commonjs/core/OxyServices.base.js.map +1 -1
- package/lib/commonjs/ui/components/ErrorBoundary.js +145 -0
- package/lib/commonjs/ui/components/ErrorBoundary.js.map +1 -0
- package/lib/commonjs/ui/navigation/OxyRouter.js +83 -30
- package/lib/commonjs/ui/navigation/OxyRouter.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountCenterScreen.js +19 -14
- package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/SessionManagementScreen.js +90 -77
- package/lib/commonjs/ui/screens/SessionManagementScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/SignInScreen.js +1 -1
- package/lib/commonjs/ui/screens/SignInScreen.js.map +1 -1
- package/lib/module/core/OxyServices.base.js +34 -21
- package/lib/module/core/OxyServices.base.js.map +1 -1
- package/lib/module/ui/components/ErrorBoundary.js +139 -0
- package/lib/module/ui/components/ErrorBoundary.js.map +1 -0
- package/lib/module/ui/navigation/OxyRouter.js +83 -31
- package/lib/module/ui/navigation/OxyRouter.js.map +1 -1
- package/lib/module/ui/screens/AccountCenterScreen.js +19 -14
- package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/module/ui/screens/SessionManagementScreen.js +91 -78
- package/lib/module/ui/screens/SessionManagementScreen.js.map +1 -1
- package/lib/module/ui/screens/SignInScreen.js +1 -1
- package/lib/module/ui/screens/SignInScreen.js.map +1 -1
- package/lib/typescript/core/OxyServices.base.d.ts +16 -10
- package/lib/typescript/core/OxyServices.base.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.analytics.d.ts +0 -2
- package/lib/typescript/core/mixins/OxyServices.analytics.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.assets.d.ts +0 -2
- package/lib/typescript/core/mixins/OxyServices.assets.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.auth.d.ts +0 -2
- package/lib/typescript/core/mixins/OxyServices.auth.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.developer.d.ts +0 -2
- package/lib/typescript/core/mixins/OxyServices.developer.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.devices.d.ts +0 -2
- package/lib/typescript/core/mixins/OxyServices.devices.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.karma.d.ts +0 -2
- package/lib/typescript/core/mixins/OxyServices.karma.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.language.d.ts +0 -2
- package/lib/typescript/core/mixins/OxyServices.language.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.location.d.ts +0 -2
- package/lib/typescript/core/mixins/OxyServices.location.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.payment.d.ts +0 -2
- package/lib/typescript/core/mixins/OxyServices.payment.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.privacy.d.ts +0 -2
- package/lib/typescript/core/mixins/OxyServices.privacy.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.totp.d.ts +0 -2
- package/lib/typescript/core/mixins/OxyServices.totp.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.user.d.ts +0 -2
- package/lib/typescript/core/mixins/OxyServices.user.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.utility.d.ts +0 -2
- package/lib/typescript/core/mixins/OxyServices.utility.d.ts.map +1 -1
- package/lib/typescript/core/mixins/index.d.ts +0 -26
- package/lib/typescript/core/mixins/index.d.ts.map +1 -1
- package/lib/typescript/ui/components/ErrorBoundary.d.ts +31 -0
- package/lib/typescript/ui/components/ErrorBoundary.d.ts.map +1 -0
- package/lib/typescript/ui/navigation/OxyRouter.d.ts +3 -1
- package/lib/typescript/ui/navigation/OxyRouter.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountCenterScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/SessionManagementScreen.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/core/OxyServices.base.ts +37 -22
- package/src/ui/components/ErrorBoundary.tsx +154 -0
- package/src/ui/navigation/OxyRouter.tsx +90 -29
- package/src/ui/screens/AccountCenterScreen.tsx +17 -14
- package/src/ui/screens/SessionManagementScreen.tsx +81 -69
- package/src/ui/screens/SignInScreen.tsx +1 -1
|
@@ -146,36 +146,49 @@ class OxyServicesBase {
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
/**
|
|
149
|
-
* Wait for authentication to be ready
|
|
150
|
-
*
|
|
149
|
+
* Wait for authentication to be ready
|
|
150
|
+
*
|
|
151
|
+
* Optimized for high-scale usage with immediate synchronous check and adaptive polling.
|
|
152
|
+
* Returns immediately if token is already available (0ms delay), otherwise uses
|
|
153
|
+
* adaptive polling that starts fast (50ms) and gradually increases to reduce CPU usage.
|
|
154
|
+
*
|
|
155
|
+
* @param timeoutMs Maximum time to wait in milliseconds (default: 5000ms)
|
|
156
|
+
* @returns Promise that resolves to true if authentication is ready, false if timeout
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* ```typescript
|
|
160
|
+
* const isReady = await oxyServices.waitForAuth(3000);
|
|
161
|
+
* if (isReady) {
|
|
162
|
+
* // Proceed with authenticated operations
|
|
163
|
+
* }
|
|
164
|
+
* ```
|
|
151
165
|
*/
|
|
152
166
|
async waitForAuth(timeoutMs = 5000) {
|
|
153
|
-
|
|
154
|
-
|
|
167
|
+
// Immediate synchronous check - no delay if token is ready
|
|
168
|
+
if (this.httpClient.hasAccessToken()) {
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
const startTime = performance.now();
|
|
172
|
+
const maxTime = startTime + timeoutMs;
|
|
155
173
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
*/
|
|
159
|
-
async waitForAuthentication(timeoutMs = 5000) {
|
|
160
|
-
const startTime = Date.now();
|
|
161
|
-
const checkInterval = 100; // Check every 100ms
|
|
174
|
+
// Adaptive polling: start fast, then slow down to reduce CPU usage
|
|
175
|
+
let pollInterval = 50; // Start with 50ms
|
|
162
176
|
|
|
163
|
-
while (
|
|
177
|
+
while (performance.now() < maxTime) {
|
|
178
|
+
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
164
179
|
if (this.httpClient.hasAccessToken()) {
|
|
165
180
|
return true;
|
|
166
181
|
}
|
|
167
|
-
|
|
182
|
+
|
|
183
|
+
// Increase interval after first few checks (adaptive polling)
|
|
184
|
+
// This reduces CPU usage for long waits while maintaining responsiveness
|
|
185
|
+
if (pollInterval < 200) {
|
|
186
|
+
pollInterval = Math.min(pollInterval * 1.5, 200);
|
|
187
|
+
}
|
|
168
188
|
}
|
|
169
189
|
return false;
|
|
170
190
|
}
|
|
171
191
|
|
|
172
|
-
/**
|
|
173
|
-
* Check if the client has a valid access token
|
|
174
|
-
*/
|
|
175
|
-
hasAccessToken() {
|
|
176
|
-
return this.httpClient.hasAccessToken();
|
|
177
|
-
}
|
|
178
|
-
|
|
179
192
|
/**
|
|
180
193
|
* Execute a function with automatic authentication retry logic
|
|
181
194
|
* This handles the common case where API calls are made before authentication completes
|
|
@@ -192,7 +205,7 @@ class OxyServicesBase {
|
|
|
192
205
|
if (!this.httpClient.hasAccessToken()) {
|
|
193
206
|
if (attempt === 0) {
|
|
194
207
|
// On first attempt, wait briefly for authentication to complete
|
|
195
|
-
const authReady = await this.
|
|
208
|
+
const authReady = await this.waitForAuth(authTimeoutMs);
|
|
196
209
|
if (!authReady) {
|
|
197
210
|
throw new _OxyServices.OxyAuthenticationTimeoutError(operationName, authTimeoutMs);
|
|
198
211
|
}
|
|
@@ -228,7 +241,7 @@ class OxyServicesBase {
|
|
|
228
241
|
* Validate the current access token with the server
|
|
229
242
|
*/
|
|
230
243
|
async validate() {
|
|
231
|
-
if (!this.
|
|
244
|
+
if (!this.hasValidToken()) {
|
|
232
245
|
return false;
|
|
233
246
|
}
|
|
234
247
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_jwtDecode","require","_errorUtils","_HttpClient","_RequestManager","_OxyServices","OxyServicesBase","constructor","args","config","Error","cloudURL","httpClient","HttpClient","requestManager","RequestManager","__resetTokensForTests","makeRequest","method","url","data","options","request","getBaseURL","getClient","getMetrics","clearCache","clearCacheEntry","key","getCacheStats","getCloudURL","setTokens","accessToken","refreshToken","clearTokens","getCurrentUserId","getAccessToken","decoded","jwtDecode","userId","id","error","hasValidToken","hasAccessToken","waitForAuth","timeoutMs","
|
|
1
|
+
{"version":3,"names":["_jwtDecode","require","_errorUtils","_HttpClient","_RequestManager","_OxyServices","OxyServicesBase","constructor","args","config","Error","cloudURL","httpClient","HttpClient","requestManager","RequestManager","__resetTokensForTests","makeRequest","method","url","data","options","request","getBaseURL","getClient","getMetrics","clearCache","clearCacheEntry","key","getCacheStats","getCloudURL","setTokens","accessToken","refreshToken","clearTokens","getCurrentUserId","getAccessToken","decoded","jwtDecode","userId","id","error","hasValidToken","hasAccessToken","waitForAuth","timeoutMs","startTime","performance","now","maxTime","pollInterval","Promise","resolve","setTimeout","Math","min","withAuthRetry","operation","operationName","maxRetries","retryDelay","authTimeoutMs","attempt","authReady","OxyAuthenticationTimeoutError","OxyAuthenticationError","isLastAttempt","isAuthError","response","status","code","message","includes","handleError","validate","res","undefined","cache","retry","valid","api","handleHttpError","err","details","healthCheck","exports"],"sourceRoot":"../../../src","sources":["core/OxyServices.base.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.ErrorBoundary = void 0;
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _reactNative = require("react-native");
|
|
9
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
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
|
+
/**
|
|
12
|
+
* Error Boundary Component
|
|
13
|
+
*
|
|
14
|
+
* Catches JavaScript errors anywhere in the child component tree,
|
|
15
|
+
* logs those errors, and displays a fallback UI instead of crashing.
|
|
16
|
+
*
|
|
17
|
+
* Usage:
|
|
18
|
+
* <ErrorBoundary>
|
|
19
|
+
* <YourComponent />
|
|
20
|
+
* </ErrorBoundary>
|
|
21
|
+
*/
|
|
22
|
+
class ErrorBoundary extends _react.Component {
|
|
23
|
+
constructor(props) {
|
|
24
|
+
super(props);
|
|
25
|
+
this.state = {
|
|
26
|
+
hasError: false,
|
|
27
|
+
error: null,
|
|
28
|
+
errorInfo: null
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
static getDerivedStateFromError(error) {
|
|
32
|
+
// Update state so the next render will show the fallback UI
|
|
33
|
+
return {
|
|
34
|
+
hasError: true,
|
|
35
|
+
error
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
componentDidCatch(error, errorInfo) {
|
|
39
|
+
// Log error to console in development
|
|
40
|
+
if (__DEV__) {
|
|
41
|
+
console.error('ErrorBoundary caught an error:', error, errorInfo);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Call optional error handler
|
|
45
|
+
if (this.props.onError) {
|
|
46
|
+
this.props.onError(error, errorInfo);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Update state with error info
|
|
50
|
+
this.setState({
|
|
51
|
+
error,
|
|
52
|
+
errorInfo
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
handleReset = () => {
|
|
56
|
+
this.setState({
|
|
57
|
+
hasError: false,
|
|
58
|
+
error: null,
|
|
59
|
+
errorInfo: null
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
render() {
|
|
63
|
+
if (this.state.hasError) {
|
|
64
|
+
// Use custom fallback if provided
|
|
65
|
+
if (this.props.fallback) {
|
|
66
|
+
return this.props.fallback;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Default fallback UI
|
|
70
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
71
|
+
style: styles.container,
|
|
72
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
73
|
+
style: styles.errorContainer,
|
|
74
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
75
|
+
style: styles.errorTitle,
|
|
76
|
+
children: "Something went wrong"
|
|
77
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
78
|
+
style: styles.errorMessage,
|
|
79
|
+
children: this.state.error?.message || 'An unexpected error occurred'
|
|
80
|
+
}), __DEV__ && this.state.errorInfo && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
81
|
+
style: styles.errorDetails,
|
|
82
|
+
children: this.state.errorInfo.componentStack
|
|
83
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
84
|
+
style: styles.resetButton,
|
|
85
|
+
onPress: this.handleReset,
|
|
86
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
87
|
+
style: styles.resetButtonText,
|
|
88
|
+
children: "Try Again"
|
|
89
|
+
})
|
|
90
|
+
})]
|
|
91
|
+
})
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
return this.props.children;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.ErrorBoundary = ErrorBoundary;
|
|
98
|
+
const styles = _reactNative.StyleSheet.create({
|
|
99
|
+
container: {
|
|
100
|
+
flex: 1,
|
|
101
|
+
justifyContent: 'center',
|
|
102
|
+
alignItems: 'center',
|
|
103
|
+
padding: 20,
|
|
104
|
+
backgroundColor: '#fff'
|
|
105
|
+
},
|
|
106
|
+
errorContainer: {
|
|
107
|
+
maxWidth: 400,
|
|
108
|
+
width: '100%',
|
|
109
|
+
padding: 20,
|
|
110
|
+
borderRadius: 8,
|
|
111
|
+
backgroundColor: '#f5f5f5',
|
|
112
|
+
borderWidth: 1,
|
|
113
|
+
borderColor: '#e0e0e0'
|
|
114
|
+
},
|
|
115
|
+
errorTitle: {
|
|
116
|
+
fontSize: 20,
|
|
117
|
+
fontWeight: 'bold',
|
|
118
|
+
marginBottom: 10,
|
|
119
|
+
color: '#d32f2f'
|
|
120
|
+
},
|
|
121
|
+
errorMessage: {
|
|
122
|
+
fontSize: 14,
|
|
123
|
+
marginBottom: 15,
|
|
124
|
+
color: '#666'
|
|
125
|
+
},
|
|
126
|
+
errorDetails: {
|
|
127
|
+
fontSize: 12,
|
|
128
|
+
marginBottom: 15,
|
|
129
|
+
color: '#999',
|
|
130
|
+
fontFamily: 'monospace'
|
|
131
|
+
},
|
|
132
|
+
resetButton: {
|
|
133
|
+
backgroundColor: '#007AFF',
|
|
134
|
+
padding: 12,
|
|
135
|
+
borderRadius: 6,
|
|
136
|
+
alignItems: 'center'
|
|
137
|
+
},
|
|
138
|
+
resetButtonText: {
|
|
139
|
+
color: '#fff',
|
|
140
|
+
fontSize: 16,
|
|
141
|
+
fontWeight: '600'
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
var _default = exports.default = ErrorBoundary;
|
|
145
|
+
//# sourceMappingURL=ErrorBoundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ErrorBoundary","Component","constructor","props","state","hasError","error","errorInfo","getDerivedStateFromError","componentDidCatch","__DEV__","console","onError","setState","handleReset","render","fallback","jsx","View","style","styles","container","children","jsxs","errorContainer","Text","errorTitle","errorMessage","message","errorDetails","componentStack","TouchableOpacity","resetButton","onPress","resetButtonText","exports","StyleSheet","create","flex","justifyContent","alignItems","padding","backgroundColor","maxWidth","width","borderRadius","borderWidth","borderColor","fontSize","fontWeight","marginBottom","color","fontFamily","_default"],"sourceRoot":"../../../../src","sources":["ui/components/ErrorBoundary.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,13 +3,40 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.default = void 0;
|
|
6
|
+
exports.default = exports.OxyRouter = void 0;
|
|
7
7
|
var _react = require("react");
|
|
8
8
|
var _reactNative = require("react-native");
|
|
9
|
+
var _ErrorBoundary = _interopRequireDefault(require("../components/ErrorBoundary"));
|
|
9
10
|
var _routes = require("./routes");
|
|
10
11
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
13
|
// Import types and route registry
|
|
12
14
|
|
|
15
|
+
// Helper function to validate route names at runtime
|
|
16
|
+
const isValidRouteName = screen => {
|
|
17
|
+
return _routes.routeNames.includes(screen);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// Helper function for safe navigation with validation
|
|
21
|
+
const validateAndNavigate = (screen, props, setCurrentScreen, setScreenHistory, setScreenPropsMap) => {
|
|
22
|
+
if (!isValidRouteName(screen)) {
|
|
23
|
+
const errorMsg = `Invalid route name: "${screen}". Valid routes are: ${_routes.routeNames.join(', ')}`;
|
|
24
|
+
console.error('OxyRouter:', errorMsg);
|
|
25
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
26
|
+
console.error('Navigation error:', errorMsg);
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
if (!_routes.routes[screen]) {
|
|
31
|
+
const errorMsg = `Route "${screen}" is registered but component is missing`;
|
|
32
|
+
console.error('OxyRouter:', errorMsg);
|
|
33
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
34
|
+
console.error('Navigation error:', errorMsg);
|
|
35
|
+
}
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
};
|
|
13
40
|
const OxyRouter = ({
|
|
14
41
|
oxyServices,
|
|
15
42
|
initialScreen,
|
|
@@ -34,23 +61,22 @@ const OxyRouter = ({
|
|
|
34
61
|
}
|
|
35
62
|
}, [currentScreen, adjustSnapPoints]);
|
|
36
63
|
|
|
37
|
-
// Memoized navigation methods
|
|
64
|
+
// Memoized navigation methods with validation
|
|
38
65
|
const navigate = (0, _react.useCallback)((screen, props = {}) => {
|
|
39
66
|
if (__DEV__) console.log('OxyRouter: navigate called', screen, props);
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
setScreenPropsMap(prev => ({
|
|
45
|
-
...prev,
|
|
46
|
-
[screen]: props
|
|
47
|
-
}));
|
|
48
|
-
} else {
|
|
49
|
-
console.error(`OxyRouter: Screen "${screen}" not found in routes:`, Object.keys(_routes.routes));
|
|
50
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
51
|
-
console.error(`Screen "${screen}" not found`);
|
|
52
|
-
}
|
|
67
|
+
|
|
68
|
+
// Validate route before navigating
|
|
69
|
+
if (!validateAndNavigate(screen, props, setCurrentScreen, setScreenHistory, setScreenPropsMap)) {
|
|
70
|
+
return; // Early return if validation fails
|
|
53
71
|
}
|
|
72
|
+
|
|
73
|
+
// All validations passed, proceed with navigation
|
|
74
|
+
setCurrentScreen(screen);
|
|
75
|
+
setScreenHistory(prev => [...prev, screen]);
|
|
76
|
+
setScreenPropsMap(prev => ({
|
|
77
|
+
...prev,
|
|
78
|
+
[screen]: props
|
|
79
|
+
}));
|
|
54
80
|
}, []);
|
|
55
81
|
const goBack = (0, _react.useCallback)(() => {
|
|
56
82
|
setScreenHistory(prev => {
|
|
@@ -86,13 +112,23 @@ const OxyRouter = ({
|
|
|
86
112
|
const handleNavigationEvent = event => {
|
|
87
113
|
if (event && event.detail) {
|
|
88
114
|
if (typeof event.detail === 'string') {
|
|
89
|
-
|
|
115
|
+
// Validate string route name before navigating
|
|
116
|
+
if (isValidRouteName(event.detail)) {
|
|
117
|
+
navigate(event.detail);
|
|
118
|
+
} else {
|
|
119
|
+
console.error('OxyRouter: Invalid route name in event:', event.detail);
|
|
120
|
+
}
|
|
90
121
|
} else if (typeof event.detail === 'object' && event.detail.screen) {
|
|
91
122
|
const {
|
|
92
123
|
screen,
|
|
93
124
|
props
|
|
94
125
|
} = event.detail;
|
|
95
|
-
|
|
126
|
+
// Validate route name before navigating
|
|
127
|
+
if (isValidRouteName(screen)) {
|
|
128
|
+
navigate(screen, props || {});
|
|
129
|
+
} else {
|
|
130
|
+
console.error('OxyRouter: Invalid route name in event:', screen);
|
|
131
|
+
}
|
|
96
132
|
}
|
|
97
133
|
}
|
|
98
134
|
};
|
|
@@ -103,8 +139,14 @@ const OxyRouter = ({
|
|
|
103
139
|
intervalId = setInterval(() => {
|
|
104
140
|
const globalNav = globalThis.oxyNavigateEvent;
|
|
105
141
|
if (globalNav && globalNav.screen) {
|
|
106
|
-
|
|
107
|
-
|
|
142
|
+
// Validate route name before navigating
|
|
143
|
+
if (isValidRouteName(globalNav.screen)) {
|
|
144
|
+
navigate(globalNav.screen, globalNav.props || {});
|
|
145
|
+
globalThis.oxyNavigateEvent = null;
|
|
146
|
+
} else {
|
|
147
|
+
console.error('OxyRouter: Invalid route name in global event:', globalNav.screen);
|
|
148
|
+
globalThis.oxyNavigateEvent = null; // Clear invalid event
|
|
149
|
+
}
|
|
108
150
|
}
|
|
109
151
|
}, 100);
|
|
110
152
|
}
|
|
@@ -118,7 +160,7 @@ const OxyRouter = ({
|
|
|
118
160
|
};
|
|
119
161
|
}, [navigate]);
|
|
120
162
|
|
|
121
|
-
// Render the current screen component
|
|
163
|
+
// Render the current screen component with error boundary
|
|
122
164
|
const renderScreen = () => {
|
|
123
165
|
const CurrentScreen = _routes.routes[currentScreen]?.component;
|
|
124
166
|
if (!CurrentScreen) {
|
|
@@ -129,15 +171,20 @@ const OxyRouter = ({
|
|
|
129
171
|
style: styles.errorContainer
|
|
130
172
|
});
|
|
131
173
|
}
|
|
132
|
-
return /*#__PURE__*/(0, _jsxRuntime.jsx)(
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
174
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ErrorBoundary.default, {
|
|
175
|
+
onError: (error, errorInfo) => {
|
|
176
|
+
console.error(`Error in screen "${currentScreen}":`, error, errorInfo);
|
|
177
|
+
},
|
|
178
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(CurrentScreen, {
|
|
179
|
+
oxyServices: oxyServices,
|
|
180
|
+
navigate: navigate,
|
|
181
|
+
goBack: goBack,
|
|
182
|
+
onClose: onClose,
|
|
183
|
+
onAuthenticated: onAuthenticated,
|
|
184
|
+
theme: theme,
|
|
185
|
+
containerWidth: containerWidth,
|
|
186
|
+
...(screenPropsMap[currentScreen] || {})
|
|
187
|
+
})
|
|
141
188
|
});
|
|
142
189
|
};
|
|
143
190
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
@@ -145,6 +192,10 @@ const OxyRouter = ({
|
|
|
145
192
|
children: renderScreen()
|
|
146
193
|
});
|
|
147
194
|
};
|
|
195
|
+
|
|
196
|
+
// Memoize the router component to prevent unnecessary re-renders
|
|
197
|
+
exports.OxyRouter = OxyRouter;
|
|
198
|
+
const MemoizedOxyRouter = /*#__PURE__*/(0, _react.memo)(OxyRouter);
|
|
148
199
|
const styles = _reactNative.StyleSheet.create({
|
|
149
200
|
container: {
|
|
150
201
|
flex: 1
|
|
@@ -156,5 +207,7 @@ const styles = _reactNative.StyleSheet.create({
|
|
|
156
207
|
minHeight: 100
|
|
157
208
|
}
|
|
158
209
|
});
|
|
159
|
-
|
|
210
|
+
|
|
211
|
+
// Export both the memoized version (default) and the original for testing
|
|
212
|
+
var _default = exports.default = MemoizedOxyRouter;
|
|
160
213
|
//# sourceMappingURL=OxyRouter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_reactNative","_routes","_jsxRuntime","
|
|
1
|
+
{"version":3,"names":["_react","require","_reactNative","_ErrorBoundary","_interopRequireDefault","_routes","_jsxRuntime","e","__esModule","default","isValidRouteName","screen","routeNames","includes","validateAndNavigate","props","setCurrentScreen","setScreenHistory","setScreenPropsMap","errorMsg","join","console","error","process","env","NODE_ENV","routes","OxyRouter","oxyServices","initialScreen","onClose","onAuthenticated","theme","adjustSnapPoints","navigationRef","containerWidth","currentScreen","useState","screenHistory","screenPropsMap","useEffect","snapPoints","navigate","useCallback","__DEV__","log","prev","goBack","length","newHistory","pop","previousScreen","current","handleNavigationEvent","event","detail","intervalId","document","addEventListener","setInterval","globalNav","globalThis","oxyNavigateEvent","removeEventListener","clearInterval","renderScreen","CurrentScreen","component","jsx","View","style","styles","errorContainer","onError","errorInfo","children","container","exports","MemoizedOxyRouter","memo","StyleSheet","create","flex","justifyContent","alignItems","minHeight","_default"],"sourceRoot":"../../../../src","sources":["ui/navigation/OxyRouter.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _reactNative = require("react-native");
|
|
8
|
+
var _react = require("react");
|
|
8
9
|
var _OxyContext = require("../context/OxyContext");
|
|
9
10
|
var _version = require("../../constants/version");
|
|
10
11
|
var _sonner = require("../../lib/sonner");
|
|
@@ -40,7 +41,9 @@ const AccountCenterScreen = ({
|
|
|
40
41
|
const borderColor = isDarkTheme ? '#444444' : '#E0E0E0';
|
|
41
42
|
const primaryColor = '#0066CC';
|
|
42
43
|
const dangerColor = '#D32F2F';
|
|
43
|
-
|
|
44
|
+
|
|
45
|
+
// Memoized logout handler - prevents unnecessary re-renders
|
|
46
|
+
const handleLogout = (0, _react.useCallback)(async () => {
|
|
44
47
|
try {
|
|
45
48
|
await logout();
|
|
46
49
|
if (onClose) {
|
|
@@ -50,10 +53,12 @@ const AccountCenterScreen = ({
|
|
|
50
53
|
console.error('Logout failed:', error);
|
|
51
54
|
_sonner.toast.error(t('common.errors.signOutFailed') || 'There was a problem signing you out. Please try again.');
|
|
52
55
|
}
|
|
53
|
-
};
|
|
54
|
-
|
|
56
|
+
}, [logout, onClose, t]);
|
|
57
|
+
|
|
58
|
+
// Memoized confirm logout handler - prevents unnecessary re-renders
|
|
59
|
+
const confirmLogout = (0, _react.useCallback)(() => {
|
|
55
60
|
(0, _confirmAction.confirmAction)(t('common.confirms.signOut') || 'Are you sure you want to sign out?', handleLogout);
|
|
56
|
-
};
|
|
61
|
+
}, [handleLogout, t]);
|
|
57
62
|
if (!isAuthenticated) {
|
|
58
63
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
59
64
|
style: [styles.container, {
|
|
@@ -100,7 +105,7 @@ const AccountCenterScreen = ({
|
|
|
100
105
|
theme: theme,
|
|
101
106
|
isFirst: true,
|
|
102
107
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_QuickActions.default, {
|
|
103
|
-
actions: [{
|
|
108
|
+
actions: (0, _react.useMemo)(() => [{
|
|
104
109
|
id: 'overview',
|
|
105
110
|
icon: 'person-circle',
|
|
106
111
|
iconColor: '#007AFF',
|
|
@@ -136,14 +141,14 @@ const AccountCenterScreen = ({
|
|
|
136
141
|
iconColor: '#FF9500',
|
|
137
142
|
title: t('accountCenter.quickActions.switch') || 'Switch',
|
|
138
143
|
onPress: () => navigate('AccountSwitcher')
|
|
139
|
-
}] : [])],
|
|
144
|
+
}] : [])], [user?.isPremium, sessions, navigate, t]),
|
|
140
145
|
theme: theme
|
|
141
146
|
})
|
|
142
147
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Section.default, {
|
|
143
148
|
title: t('accountCenter.sections.accountManagement') || 'Account Management',
|
|
144
149
|
theme: theme,
|
|
145
150
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_GroupedSection.default, {
|
|
146
|
-
items: [{
|
|
151
|
+
items: (0, _react.useMemo)(() => [{
|
|
147
152
|
id: 'overview',
|
|
148
153
|
icon: 'person-circle',
|
|
149
154
|
iconColor: '#007AFF',
|
|
@@ -185,14 +190,14 @@ const AccountCenterScreen = ({
|
|
|
185
190
|
title: t('accountCenter.items.billing.title') || 'Billing Management',
|
|
186
191
|
subtitle: t('accountCenter.items.billing.subtitle') || 'Payment methods and invoices',
|
|
187
192
|
onPress: () => navigate('PaymentGateway')
|
|
188
|
-
}] : [])],
|
|
193
|
+
}] : [])], [user?.isPremium, navigate, t]),
|
|
189
194
|
theme: theme
|
|
190
195
|
})
|
|
191
196
|
}), sessions && sessions.length > 1 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Section.default, {
|
|
192
197
|
title: t('accountCenter.sections.multiAccount') || 'Multi-Account',
|
|
193
198
|
theme: theme,
|
|
194
199
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_GroupedSection.default, {
|
|
195
|
-
items: [{
|
|
200
|
+
items: (0, _react.useMemo)(() => [{
|
|
196
201
|
id: 'switch',
|
|
197
202
|
icon: 'people',
|
|
198
203
|
iconColor: '#FF9500',
|
|
@@ -208,28 +213,28 @@ const AccountCenterScreen = ({
|
|
|
208
213
|
title: t('accountCenter.items.addAccount.title') || 'Add Another Account',
|
|
209
214
|
subtitle: t('accountCenter.items.addAccount.subtitle') || 'Sign in with a different account',
|
|
210
215
|
onPress: () => navigate('SignIn')
|
|
211
|
-
}],
|
|
216
|
+
}], [sessions.length, navigate, t]),
|
|
212
217
|
theme: theme
|
|
213
218
|
})
|
|
214
219
|
}), (!sessions || sessions.length <= 1) && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Section.default, {
|
|
215
220
|
title: t('accountCenter.sections.addAccount') || 'Add Account',
|
|
216
221
|
theme: theme,
|
|
217
222
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_GroupedSection.default, {
|
|
218
|
-
items: [{
|
|
223
|
+
items: (0, _react.useMemo)(() => [{
|
|
219
224
|
id: 'add',
|
|
220
225
|
icon: 'person-add',
|
|
221
226
|
iconColor: '#30D158',
|
|
222
227
|
title: t('accountCenter.items.addAccount.title') || 'Add Another Account',
|
|
223
228
|
subtitle: t('accountCenter.items.addAccount.subtitle') || 'Sign in with a different account',
|
|
224
229
|
onPress: () => navigate('SignIn')
|
|
225
|
-
}],
|
|
230
|
+
}], [navigate, t]),
|
|
226
231
|
theme: theme
|
|
227
232
|
})
|
|
228
233
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Section.default, {
|
|
229
234
|
title: t('accountCenter.sections.moreOptions') || 'More Options',
|
|
230
235
|
theme: theme,
|
|
231
236
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_GroupedSection.default, {
|
|
232
|
-
items: [...(_reactNative.Platform.OS !== 'web' ? [{
|
|
237
|
+
items: (0, _react.useMemo)(() => [...(_reactNative.Platform.OS !== 'web' ? [{
|
|
233
238
|
id: 'notifications',
|
|
234
239
|
icon: 'notifications',
|
|
235
240
|
iconColor: '#FF9500',
|
|
@@ -257,7 +262,7 @@ const AccountCenterScreen = ({
|
|
|
257
262
|
title: t('accountCenter.items.appInfo.title') || 'App Information',
|
|
258
263
|
subtitle: t('accountCenter.items.appInfo.subtitle') || 'Version and system details',
|
|
259
264
|
onPress: () => navigate('AppInfo')
|
|
260
|
-
}],
|
|
265
|
+
}], [navigate, t]),
|
|
261
266
|
theme: theme
|
|
262
267
|
})
|
|
263
268
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Section.default, {
|