catalyst-core 0.2.0-beta.2 → 0.3.0-beta.1
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/babel.native.config.cjs +8 -0
- package/bin/catalyst.js +49 -105
- package/changelog.md +8 -0
- package/dist/caching.js +1 -1
- package/dist/index.jsx +8 -0
- package/dist/logger.js +74 -3
- package/dist/native/androidProject/app/build.gradle.kts +1 -0
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/CustomWebview.kt +143 -4
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/MainActivity.kt +26 -6
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/MetricsMonitor.kt +143 -17
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/NativeBridge.kt +6 -0
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/WebCacheManager.kt +26 -0
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/utils/BridgeUtils.kt +56 -1
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/utils/KeyboardUtil.kt +48 -8
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/utils/PerfDeliveryState.kt +36 -0
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/utils/PerfEventBuffer.kt +289 -0
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/utils/ProfilerNavigationState.kt +13 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/ProfilerLifecycleTest.kt +51 -0
- package/dist/native/androidSetup.js +300 -8
- package/dist/native/bridge/WebBridge.js +481 -59
- package/dist/native/bridge/constants/NativeInterfaces.js +290 -44
- package/dist/native/bridge/errors.js +250 -26
- package/dist/native/bridge/hooks/index.js +125 -1
- package/dist/native/bridge/hooks/useCamera.js +347 -9
- package/dist/native/bridge/hooks/useDataProtection.js +200 -2
- package/dist/native/bridge/hooks/useDeviceInfo.js +71 -2
- package/dist/native/bridge/hooks/useFilePicker.js +429 -2
- package/dist/native/bridge/hooks/useGoogleSignIn.js +81 -1
- package/dist/native/bridge/hooks/useHapticFeedback.js +196 -1
- package/dist/native/bridge/hooks/useIntent.js +95 -1
- package/dist/native/bridge/hooks/useNativeTransition.js +202 -27
- package/dist/native/bridge/hooks/useNetworkStatus.js +84 -3
- package/dist/native/bridge/hooks/useNotification.js +318 -2
- package/dist/native/bridge/hooks/useSafeArea.js +84 -2
- package/dist/native/bridge/hooks/useVideoStream.js +434 -6
- package/dist/native/bridge/hooks/utils.js +27 -1
- package/dist/native/bridge/hooks.js +16 -1
- package/dist/native/bridge/perf/collectors/ApiCollector.js +85 -0
- package/dist/native/bridge/perf/collectors/CacheCollector.js +215 -0
- package/dist/native/bridge/perf/collectors/HookCollector.js +165 -0
- package/dist/native/bridge/perf/collectors/InsightsCollector.js +505 -0
- package/dist/native/bridge/perf/collectors/InteractionCollector.js +273 -0
- package/dist/native/bridge/perf/collectors/KeyboardCollector.js +124 -0
- package/dist/native/bridge/perf/collectors/NavigationCollector.js +294 -0
- package/dist/native/bridge/perf/collectors/NetworkTimingCollector.js +183 -0
- package/dist/native/bridge/perf/collectors/RenderCollector.js +284 -0
- package/dist/native/bridge/perf/collectors/ScrollCollector.js +111 -0
- package/dist/native/bridge/perf/collectors/ThreadCollector.js +111 -0
- package/dist/native/bridge/perf/core/constants.js +126 -0
- package/dist/native/bridge/perf/core/measure.js +189 -0
- package/dist/native/bridge/perf/core/session.js +100 -0
- package/dist/native/bridge/perf/core/store.js +554 -0
- package/dist/native/bridge/perf/core/summary.js +174 -0
- package/dist/native/bridge/perf/core/traceExport.js +240 -0
- package/dist/native/bridge/perf/core/waterfalls.js +146 -0
- package/dist/native/bridge/perf/index.js +402 -0
- package/dist/native/bridge/safeArea.js +53 -5
- package/dist/native/bridge/standardizedHooks.js +595 -82
- package/dist/native/bridge/useBaseHook.js +274 -38
- package/dist/native/bridge/utils/CameraUtils.js +201 -56
- package/dist/native/bridge/utils/FileObjectConverter.js +129 -18
- package/dist/native/bridge/utils/NativeBridge.js +425 -141
- package/dist/native/buildAndroid/assets.js +510 -13
- package/dist/native/buildAndroid/build.js +296 -19
- package/dist/native/buildAndroid/config.js +87 -1
- package/dist/native/buildAndroid/index.js +374 -1
- package/dist/native/buildAppAndroid.js +34 -2
- package/dist/native/buildAppIos.js +62 -2
- package/dist/native/buildIos/assets.js +609 -8
- package/dist/native/buildIos/build.js +639 -20
- package/dist/native/buildIos/config.js +294 -12
- package/dist/native/buildIos/index.js +343 -6
- package/dist/native/buildIos/plugins.js +343 -16
- package/dist/native/internal-plugins/device-info-plugin/android/DeviceInfoPlugin.kt +43 -0
- package/dist/native/internal-plugins/device-info-plugin/ios/DeviceInfoPlugin.swift +28 -0
- package/dist/native/internal-plugins/device-info-plugin/manifest.json +19 -0
- package/dist/native/internalPluginUtils.js +232 -7
- package/dist/native/iosnativeWebView/Sources/Core/Constants/CatalystConstants.swift +19 -0
- package/dist/native/iosnativeWebView/Sources/Core/Constants/ConfigConstants.swift +4 -0
- package/dist/native/iosnativeWebView/Sources/Core/Utils/BootTimingUtility.swift +5 -1
- package/dist/native/iosnativeWebView/Sources/Core/Utils/CacheManager.swift +10 -0
- package/dist/native/iosnativeWebView/Sources/Core/Utils/DisplayLinkPerfMonitor.swift +89 -0
- package/dist/native/iosnativeWebView/Sources/Core/Utils/PerfEventBuffer.swift +373 -0
- package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeFileHandler.swift +35 -1
- package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeMessageValidator.swift +24 -11
- package/dist/native/iosnativeWebView/Sources/Core/WebView/NativeBridge.swift +9 -0
- package/dist/native/iosnativeWebView/Sources/Core/WebView/WebView.swift +126 -0
- package/dist/native/iosnativeWebView/Sources/Core/WebView/WebViewNavigationDelegate.swift +75 -1
- package/dist/native/iosnativeWebView/iosnativeWebViewTests/BridgeMessageValidatorTests.swift +13 -0
- package/dist/native/package.json +3 -0
- package/dist/native/plugin-bridge/PluginBridge.js +227 -1
- package/dist/native/pluginComposerAndroid.js +407 -23
- package/dist/native/pluginComposerIos.js +435 -11
- package/dist/native/renameAndroidProject.js +1094 -88
- package/dist/native/setupEmulatorIos.js +289 -22
- package/dist/native/setupServer.js +160 -19
- package/dist/native/terminalProgress.js +199 -11
- package/dist/native/utils.js +193 -15
- package/dist/offline/catalyst-sw.js +145 -1
- package/dist/offline/registerServiceWorker.js +33 -1
- package/dist/otel.js +375 -46
- package/dist/router/ClientRouter.js +14 -2
- package/dist/router/ServerRouter.js +9 -1
- package/dist/router.js +1 -1
- package/dist/scripts/build.js +112 -3
- package/dist/scripts/checkVersion.js +3 -1
- package/dist/scripts/cleanCache.js +30 -1
- package/dist/scripts/generateOfflineManifest.js +116 -1
- package/dist/scripts/loadEnvironmentVariables.js +32 -6
- package/dist/scripts/plugins.js +309 -1
- package/dist/scripts/preServerInit.js +13 -0
- package/dist/scripts/scriptUtils.js +54 -3
- package/dist/scripts/serve.js +51 -4
- package/dist/scripts/start.js +47 -10
- package/dist/scripts/validator.js +149 -1
- package/dist/sentry.cjs +127 -0
- package/dist/sentry.js +125 -5
- package/dist/server/expressServer.js +250 -5
- package/dist/server/manifestCache.js +36 -0
- package/dist/server/renderer/ChunkExtractor.js +144 -0
- package/dist/server/renderer/document/Body.jsx +59 -0
- package/dist/server/renderer/document/FastRefresh.jsx +20 -0
- package/dist/server/renderer/document/Head.jsx +60 -0
- package/dist/server/renderer/document/index.jsx +2 -0
- package/dist/server/renderer/extract.js +149 -31
- package/dist/server/renderer/handler.jsx +433 -0
- package/dist/server/renderer/index.js +8 -1
- package/dist/server/renderer/render.js +47 -0
- package/dist/server/utils/botDetectionMiddleware.js +29 -0
- package/dist/server/utils/cjsRequire.js +10 -0
- package/dist/server/utils/userAgentUtil.js +87 -9
- package/dist/server/utils/validator.js +164 -1
- package/dist/vite/FastRefresh.jsx +20 -0
- package/dist/vite/inject-cache-key-plugin.js +276 -0
- package/dist/vite/loadCustomViteConfig.js +22 -0
- package/dist/vite/manifest-categorization-plugin.js +455 -0
- package/dist/vite/node-loader.mjs +458 -0
- package/dist/vite/scssParams.js +21 -0
- package/dist/vite/vite.config.client.js +130 -0
- package/dist/vite/vite.config.js +422 -0
- package/dist/vite/vite.config.server.js +84 -0
- package/dist/web-router/components/MetaTag.jsx +34 -0
- package/dist/web-router/components/RouterDataProvider.jsx +332 -0
- package/dist/web-router/components/Split.jsx +200 -0
- package/dist/web-router/components/SplitInview.jsx +106 -0
- package/dist/web-router/components/SsrRequestContext.jsx +14 -0
- package/dist/web-router/context.jsx +12 -0
- package/dist/web-router/hooks.jsx +72 -0
- package/dist/web-router/types/components/MetaTag.d.ts +2 -0
- package/dist/web-router/types/components/RouterDataProvider.d.ts +95 -0
- package/dist/web-router/types/context.d.ts +14 -0
- package/dist/web-router/types/hooks.d.ts +1 -0
- package/dist/web-router/types/index.d.ts +3 -0
- package/dist/web-router/types/utils/metaDataUtils.d.ts +24 -0
- package/dist/web-router/utils/metaDataUtils.jsx +119 -0
- package/mcp_v2/conversion-tasks.json +35 -17
- package/mcp_v2/knowledge-base.json +124 -13
- package/mcp_v2/lib/helpers.js +10 -0
- package/mcp_v2/mcp.js +4 -4
- package/mcp_v2/package.json +1 -0
- package/mcp_v2/tools/build.js +116 -20
- package/mcp_v2/tools/conversion.js +106 -5
- package/mcp_v2/tools/tasks.js +18 -14
- package/package.json +35 -68
- package/babel.config.js +0 -32
- package/dist/index.js +0 -1
- package/dist/scripts/devBuild.js +0 -3
- package/dist/scripts/devServe.js +0 -3
- package/dist/scripts/loadScriptsBeforeServerStarts.js +0 -4
- package/dist/scripts/registerAliases.js +0 -6
- package/dist/server/renderer/document/Body.js +0 -11
- package/dist/server/renderer/document/Head.js +0 -9
- package/dist/server/renderer/document/index.js +0 -1
- package/dist/server/renderer/handler.js +0 -47
- package/dist/server/startServer.js +0 -57
- package/dist/webpack/babel-plugins/remove-client.plugin.js +0 -5
- package/dist/webpack/babel-plugins/remove-ssr.plugin.js +0 -5
- package/dist/webpack/babel.config.client.js +0 -1
- package/dist/webpack/babel.config.ssr.js +0 -1
- package/dist/webpack/base.babel.js +0 -7
- package/dist/webpack/development.client.babel.js +0 -10
- package/dist/webpack/production.client.babel.js +0 -4
- package/dist/webpack/production.ssr.babel.js +0 -8
- package/dist/webpack/scssParams.js +0 -9
|
@@ -1,47 +1,283 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useEnvironmentInfo = exports.useBaseHook = exports.PROGRESS_STATES = void 0;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _NativeBridge = _interopRequireDefault(require("./utils/NativeBridge.js"));
|
|
9
|
+
var _errors = require("./errors");
|
|
10
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
/**
|
|
2
12
|
* Base hook utility that provides standardized interface for all Catalyst hooks
|
|
3
13
|
* Handles environment detection, error standardization, and common state management
|
|
4
14
|
*
|
|
5
15
|
* @param {string} hookName - Name of the hook for debugging purposes
|
|
6
16
|
* @returns {Object} Base hook interface with common functionality
|
|
7
|
-
*/
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
17
|
+
*/
|
|
18
|
+
const useBaseHook = (hookName, {
|
|
19
|
+
hasWebFallback = false,
|
|
20
|
+
webFallback
|
|
21
|
+
} = {}) => {
|
|
22
|
+
// Environment detection — live check at call time, never stale from SSR
|
|
23
|
+
const isNative = (0, _react.useCallback)(() => {
|
|
24
|
+
if (typeof window === "undefined") return false;
|
|
25
|
+
return !!(window.WebBridge && _NativeBridge.default.isAvailable());
|
|
26
|
+
}, []);
|
|
27
|
+
const isWeb = (0, _react.useCallback)(() => {
|
|
28
|
+
return !isNative();
|
|
29
|
+
}, [isNative]);
|
|
30
|
+
|
|
31
|
+
// Web fallback state — only meaningful when isWeb() and hook declared hasWebFallback:true
|
|
32
|
+
// State tracks imperative setWebFallback() calls. The prop is the synchronous source of truth
|
|
33
|
+
// when provided — prop wins so there is no async gap between prop change and disabled state.
|
|
34
|
+
const [webFallbackState, setWebFallback] = (0, _react.useState)(true);
|
|
35
|
+
|
|
36
|
+
// When prop is explicitly provided, use it directly (synchronous). When undefined, fall back to state.
|
|
37
|
+
const webFallbackResolved = webFallback !== undefined ? !!webFallback : webFallbackState;
|
|
38
|
+
const webFallbackActive = isWeb() && hasWebFallback && webFallbackResolved;
|
|
39
|
+
const webFallbackDisabled = isWeb() && hasWebFallback && !webFallbackResolved;
|
|
40
|
+
|
|
41
|
+
// Common state management
|
|
42
|
+
const [data, setData] = (0, _react.useState)(null);
|
|
43
|
+
const [loading, setLoading] = (0, _react.useState)(false);
|
|
44
|
+
const [error, setError] = (0, _react.useState)(null);
|
|
45
|
+
const [progress, setProgress] = (0, _react.useState)({
|
|
46
|
+
state: "idle",
|
|
47
|
+
// 'idle' | 'opening' | 'processing' | 'routing' | 'complete' | 'error'
|
|
48
|
+
percentage: null,
|
|
49
|
+
// 0-100 or null
|
|
50
|
+
message: null,
|
|
51
|
+
// Human readable message or null
|
|
52
|
+
phase: null,
|
|
53
|
+
// Operation specific phase or null
|
|
54
|
+
transport: null,
|
|
55
|
+
// Transport method being used
|
|
56
|
+
bytesLoaded: null,
|
|
57
|
+
// Bytes processed
|
|
58
|
+
bytesTotal: null // Total bytes
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// Progress management utilities
|
|
62
|
+
const updateProgress = (0, _react.useCallback)(updates => {
|
|
63
|
+
setProgress(prev => ({
|
|
64
|
+
...prev,
|
|
65
|
+
...updates
|
|
66
|
+
}));
|
|
67
|
+
}, []);
|
|
68
|
+
const resetProgress = (0, _react.useCallback)(() => {
|
|
69
|
+
setProgress({
|
|
70
|
+
state: "idle",
|
|
71
|
+
percentage: null,
|
|
72
|
+
message: null,
|
|
73
|
+
phase: null,
|
|
74
|
+
transport: null,
|
|
75
|
+
bytesLoaded: null,
|
|
76
|
+
bytesTotal: null
|
|
77
|
+
});
|
|
78
|
+
}, []);
|
|
79
|
+
const startProgress = (0, _react.useCallback)((phase = null, message = null) => {
|
|
80
|
+
updateProgress({
|
|
81
|
+
state: "active",
|
|
82
|
+
phase,
|
|
83
|
+
message,
|
|
84
|
+
percentage: null
|
|
85
|
+
});
|
|
86
|
+
}, [updateProgress]);
|
|
87
|
+
const completeProgress = (0, _react.useCallback)(() => {
|
|
88
|
+
updateProgress({
|
|
89
|
+
state: "complete",
|
|
90
|
+
percentage: 100
|
|
91
|
+
});
|
|
92
|
+
}, [updateProgress]);
|
|
93
|
+
const errorProgress = (0, _react.useCallback)(() => {
|
|
94
|
+
updateProgress({
|
|
95
|
+
state: "error"
|
|
96
|
+
});
|
|
97
|
+
}, [updateProgress]);
|
|
98
|
+
|
|
99
|
+
// Error handling utilities
|
|
100
|
+
const handleNativeError = (0, _react.useCallback)(nativeError => {
|
|
101
|
+
const standardError = (0, _errors.translateError)(nativeError);
|
|
102
|
+
setError(standardError);
|
|
103
|
+
setLoading(false);
|
|
104
|
+
errorProgress();
|
|
105
|
+
|
|
106
|
+
// Development logging
|
|
107
|
+
if ((0, _errors.isDevelopment)()) {
|
|
108
|
+
console.group(`🚨 ${hookName} Error`);
|
|
109
|
+
console.log("Standard Error:", standardError);
|
|
110
|
+
console.log("Native Error:", nativeError);
|
|
111
|
+
console.groupEnd();
|
|
112
|
+
}
|
|
113
|
+
return standardError;
|
|
114
|
+
}, [hookName, errorProgress]);
|
|
115
|
+
const clearError = (0, _react.useCallback)(() => {
|
|
116
|
+
setError(null);
|
|
117
|
+
if (progress.state === "error") {
|
|
118
|
+
resetProgress();
|
|
119
|
+
}
|
|
120
|
+
}, [progress.state, resetProgress]);
|
|
121
|
+
|
|
122
|
+
// Data management utilities
|
|
123
|
+
const setDataAndComplete = (0, _react.useCallback)(newData => {
|
|
124
|
+
setData(newData);
|
|
125
|
+
setLoading(false);
|
|
126
|
+
completeProgress();
|
|
127
|
+
setError(null);
|
|
128
|
+
if ((0, _errors.isDevelopment)()) {
|
|
129
|
+
console.log("✅ Native hook success:", hookName, newData);
|
|
130
|
+
}
|
|
131
|
+
}, [hookName, completeProgress]);
|
|
132
|
+
const clear = (0, _react.useCallback)(() => {
|
|
133
|
+
setData(null);
|
|
134
|
+
setError(null);
|
|
135
|
+
resetProgress();
|
|
136
|
+
if ((0, _errors.isDevelopment)()) {
|
|
137
|
+
console.log(`🗑️ ${hookName} Cleared`);
|
|
138
|
+
}
|
|
139
|
+
}, [hookName, resetProgress]);
|
|
140
|
+
|
|
141
|
+
// Fire-and-forget native call — no-ops silently on web, routes errors through handleNativeError on native
|
|
142
|
+
const callNative = (0, _react.useCallback)(fn => {
|
|
143
|
+
if (!isNative()) {
|
|
144
|
+
if ((0, _errors.isDevelopment)()) {
|
|
145
|
+
console.warn(`${hookName} callNative skipped — not in native environment`);
|
|
146
|
+
}
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
fn();
|
|
151
|
+
} catch (err) {
|
|
152
|
+
if ((0, _errors.isDevelopment)()) {
|
|
153
|
+
console.warn("Native hook call failed silently:", hookName, err);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}, [hookName, isNative]);
|
|
157
|
+
|
|
158
|
+
// Operation wrapper that handles common patterns
|
|
159
|
+
const executeOperation = (0, _react.useCallback)((operationCallback, operationName = "operation") => {
|
|
160
|
+
try {
|
|
161
|
+
if (isWeb()) {
|
|
162
|
+
console.warn(`${hookName} requires web fallback implementation (isWeb: true)`);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (!isNative()) {
|
|
166
|
+
console.error(`${hookName} executeOperation: Native bridge not available`);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
setLoading(true);
|
|
170
|
+
setError(null);
|
|
171
|
+
startProgress("starting", `Starting ${operationName}...`);
|
|
172
|
+
if ((0, _errors.isDevelopment)()) {
|
|
173
|
+
console.log(`🚀 ${hookName} ${operationName} started`);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Execute the actual operation
|
|
177
|
+
operationCallback();
|
|
178
|
+
} catch (err) {
|
|
179
|
+
handleNativeError(err);
|
|
180
|
+
console.error("❌ Native hook operation failed:", hookName, operationName, err);
|
|
181
|
+
}
|
|
182
|
+
}, [hookName, isWeb, isNative, startProgress, handleNativeError]);
|
|
183
|
+
|
|
184
|
+
// Environment flags (computed values, not functions)
|
|
185
|
+
const environmentFlags = {
|
|
186
|
+
isWeb: isWeb(),
|
|
187
|
+
isNative: isNative()
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
// Return standardized interface
|
|
191
|
+
return {
|
|
192
|
+
// Data state
|
|
193
|
+
data,
|
|
194
|
+
// Loading states
|
|
195
|
+
loading,
|
|
196
|
+
progress,
|
|
197
|
+
// Error handling
|
|
198
|
+
error,
|
|
199
|
+
// Environment detection
|
|
200
|
+
...environmentFlags,
|
|
201
|
+
// Web fallback control
|
|
202
|
+
webFallbackActive,
|
|
203
|
+
webFallbackDisabled,
|
|
204
|
+
setWebFallback,
|
|
205
|
+
// Actions
|
|
206
|
+
clear,
|
|
207
|
+
clearError,
|
|
208
|
+
// Internal utilities for specific hooks
|
|
209
|
+
setData,
|
|
210
|
+
setLoading,
|
|
211
|
+
setError,
|
|
212
|
+
setProgress,
|
|
213
|
+
updateProgress,
|
|
214
|
+
resetProgress,
|
|
215
|
+
startProgress,
|
|
216
|
+
completeProgress,
|
|
217
|
+
errorProgress,
|
|
218
|
+
setDataAndComplete,
|
|
219
|
+
handleNativeError,
|
|
220
|
+
callNative,
|
|
221
|
+
executeOperation
|
|
222
|
+
};
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
/**
|
|
37
226
|
* Hook for development debugging and testing
|
|
38
227
|
* @param {string} hookName
|
|
39
228
|
* @returns {Object} Environment information and utilities
|
|
40
|
-
*/
|
|
229
|
+
*/
|
|
230
|
+
exports.useBaseHook = useBaseHook;
|
|
231
|
+
const useEnvironmentInfo = hookName => {
|
|
232
|
+
const isNativeAvailable = () => {
|
|
233
|
+
if (typeof window === "undefined") return false;
|
|
234
|
+
return !!(window.WebBridge && _NativeBridge.default.isAvailable());
|
|
235
|
+
};
|
|
236
|
+
const getEnvironmentDetails = () => {
|
|
237
|
+
const details = {
|
|
238
|
+
hasWindow: typeof window !== "undefined",
|
|
239
|
+
hasWebBridge: typeof window !== "undefined" && !!window.WebBridge,
|
|
240
|
+
nativeBridgeAvailable: false,
|
|
241
|
+
userAgent: typeof navigator !== "undefined" ? navigator.userAgent : "SSR",
|
|
242
|
+
timestamp: new Date().toISOString()
|
|
243
|
+
};
|
|
244
|
+
if (details.hasWebBridge) {
|
|
245
|
+
details.nativeBridgeAvailable = _NativeBridge.default.isAvailable();
|
|
246
|
+
}
|
|
247
|
+
return details;
|
|
248
|
+
};
|
|
249
|
+
if ((0, _errors.isDevelopment)()) {
|
|
250
|
+
console.log("🔍 Native hook environment:", hookName, getEnvironmentDetails());
|
|
251
|
+
}
|
|
252
|
+
return {
|
|
253
|
+
isNative: isNativeAvailable(),
|
|
254
|
+
isWeb: !isNativeAvailable(),
|
|
255
|
+
environmentDetails: getEnvironmentDetails()
|
|
256
|
+
};
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
/**
|
|
41
260
|
* Progress state constants for consistency across hooks
|
|
42
|
-
*/
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
261
|
+
*/
|
|
262
|
+
exports.useEnvironmentInfo = useEnvironmentInfo;
|
|
263
|
+
const PROGRESS_STATES = exports.PROGRESS_STATES = {
|
|
264
|
+
// Common states
|
|
265
|
+
IDLE: "idle",
|
|
266
|
+
STARTING: "starting",
|
|
267
|
+
COMPLETE: "complete",
|
|
268
|
+
ERROR: "error",
|
|
269
|
+
// File Picker states
|
|
270
|
+
OPENING: "opening",
|
|
271
|
+
PROCESSING: "processing",
|
|
272
|
+
ROUTING: "routing",
|
|
273
|
+
// Camera states
|
|
274
|
+
REQUESTING: "requesting",
|
|
275
|
+
CAPTURING: "capturing",
|
|
276
|
+
// Intent states
|
|
277
|
+
DOWNLOADING: "downloading",
|
|
278
|
+
OPENING_FILE: "opening_file",
|
|
279
|
+
// Server states
|
|
280
|
+
CONNECTING: "connecting",
|
|
281
|
+
UPLOADING: "uploading",
|
|
282
|
+
SERVING: "serving"
|
|
283
|
+
};
|
|
@@ -1,58 +1,203 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _NativeInterfaces = require("../constants/NativeInterfaces.js");
|
|
8
|
+
var _NativeBridge = _interopRequireDefault(require("./NativeBridge.js"));
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
/**
|
|
2
11
|
* Camera Utility Module
|
|
3
12
|
* Provides Promise-based camera operations with proper option validation
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
if(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
13
|
+
*/
|
|
14
|
+
class CameraUtils {
|
|
15
|
+
/**
|
|
16
|
+
* Open camera and capture image
|
|
17
|
+
* @param {Object} options - Camera options
|
|
18
|
+
* @param {string} options.quality - Image quality: 'high', 'medium', 'low'
|
|
19
|
+
* @param {string} options.format - Image format: 'jpeg', 'png'
|
|
20
|
+
* @param {string} options.cameraDevice - Camera device: 'front', 'rear'
|
|
21
|
+
* @param {string} options.flashMode - Flash mode: 'auto', 'on', 'off'
|
|
22
|
+
* @param {boolean} options.allowEditing - Allow image editing after capture
|
|
23
|
+
* @param {Function} registerCallback - Callback registration function
|
|
24
|
+
* @param {Function} unregisterCallback - Callback unregistration function
|
|
25
|
+
* @returns {Promise<Object>} - Promise that resolves with camera result or rejects with error
|
|
26
|
+
*/
|
|
27
|
+
static openCamera(options = {}, registerCallback, unregisterCallback) {
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
const cleanup = () => {
|
|
30
|
+
unregisterCallback(_NativeInterfaces.NATIVE_CALLBACKS.ON_CAMERA_CAPTURE);
|
|
31
|
+
unregisterCallback(_NativeInterfaces.NATIVE_CALLBACKS.ON_CAMERA_ERROR);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// Validate and set defaults for options
|
|
35
|
+
const cameraOptions = CameraUtils.validateCameraOptions(options);
|
|
36
|
+
registerCallback(_NativeInterfaces.NATIVE_CALLBACKS.ON_CAMERA_CAPTURE, data => {
|
|
37
|
+
cleanup();
|
|
38
|
+
try {
|
|
39
|
+
const result = typeof data === "string" ? JSON.parse(data) : data;
|
|
40
|
+
if (result.error) {
|
|
41
|
+
reject(new Error(result.error));
|
|
42
|
+
} else {
|
|
43
|
+
resolve(result);
|
|
44
|
+
}
|
|
45
|
+
} catch (error) {
|
|
46
|
+
reject(error);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
registerCallback(_NativeInterfaces.NATIVE_CALLBACKS.ON_CAMERA_ERROR, error => {
|
|
50
|
+
cleanup();
|
|
51
|
+
const errorMessage = typeof error === "string" ? error : error.error || error.message || "Unknown camera error";
|
|
52
|
+
reject(new Error(errorMessage));
|
|
53
|
+
});
|
|
54
|
+
try {
|
|
55
|
+
_NativeBridge.default.camera.open(JSON.stringify(cameraOptions));
|
|
56
|
+
} catch (error) {
|
|
57
|
+
cleanup();
|
|
58
|
+
reject(error);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Request camera permission
|
|
65
|
+
* @param {Object} config - Permission configuration
|
|
66
|
+
* @param {boolean} config.includeDetails - Include detailed permission info in response
|
|
67
|
+
* @param {Function} registerCallback - Callback registration function
|
|
68
|
+
* @param {Function} unregisterCallback - Callback unregistration function
|
|
69
|
+
* @returns {Promise<Object>} - Promise that resolves with permission status or rejects with error
|
|
70
|
+
*/
|
|
71
|
+
static requestCameraPermission(config = {}, registerCallback, unregisterCallback) {
|
|
72
|
+
return new Promise((resolve, reject) => {
|
|
73
|
+
const cleanup = () => {
|
|
74
|
+
unregisterCallback(_NativeInterfaces.NATIVE_CALLBACKS.CAMERA_PERMISSION_STATUS);
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// Validate and set defaults for config
|
|
78
|
+
const permissionConfig = {
|
|
79
|
+
includeDetails: config.includeDetails || false,
|
|
80
|
+
...config
|
|
81
|
+
};
|
|
82
|
+
registerCallback(_NativeInterfaces.NATIVE_CALLBACKS.CAMERA_PERMISSION_STATUS, data => {
|
|
83
|
+
cleanup();
|
|
84
|
+
try {
|
|
85
|
+
const result = typeof data === "string" ? JSON.parse(data) : data;
|
|
86
|
+
if (result.error) {
|
|
87
|
+
reject(new Error(result.error));
|
|
88
|
+
} else {
|
|
89
|
+
resolve(result);
|
|
90
|
+
}
|
|
91
|
+
} catch (error) {
|
|
92
|
+
reject(error);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
try {
|
|
96
|
+
_NativeBridge.default.camera.requestPermission(JSON.stringify(permissionConfig));
|
|
97
|
+
} catch (error) {
|
|
98
|
+
cleanup();
|
|
99
|
+
reject(error);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Validate camera options and set defaults
|
|
106
|
+
* @param {Object} options - Raw camera options
|
|
107
|
+
* @returns {Object} - Validated camera options with defaults
|
|
108
|
+
*/
|
|
109
|
+
static validateCameraOptions(options) {
|
|
110
|
+
const validated = {};
|
|
111
|
+
|
|
112
|
+
// Quality validation
|
|
113
|
+
if (options.quality && Object.values(_NativeInterfaces.CAMERA_QUALITY).includes(options.quality.toLowerCase())) {
|
|
114
|
+
validated.quality = options.quality.toLowerCase();
|
|
115
|
+
} else {
|
|
116
|
+
validated.quality = _NativeInterfaces.CAMERA_QUALITY.MEDIUM; // Default
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Format validation
|
|
120
|
+
if (options.format && Object.values(_NativeInterfaces.CAMERA_FORMAT).includes(options.format.toLowerCase())) {
|
|
121
|
+
validated.format = options.format.toLowerCase();
|
|
122
|
+
} else {
|
|
123
|
+
validated.format = _NativeInterfaces.CAMERA_FORMAT.JPEG; // Default
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Camera device validation
|
|
127
|
+
if (options.cameraDevice && Object.values(_NativeInterfaces.CAMERA_DEVICE).includes(options.cameraDevice.toLowerCase())) {
|
|
128
|
+
validated.cameraDevice = options.cameraDevice.toLowerCase();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Flash mode validation
|
|
132
|
+
if (options.flashMode && Object.values(_NativeInterfaces.CAMERA_FLASH_MODE).includes(options.flashMode.toLowerCase())) {
|
|
133
|
+
validated.flashMode = options.flashMode.toLowerCase();
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Allow editing validation
|
|
137
|
+
if (typeof options.allowEditing === "boolean") {
|
|
138
|
+
validated.allowEditing = options.allowEditing;
|
|
139
|
+
} else {
|
|
140
|
+
validated.allowEditing = false; // Default
|
|
141
|
+
}
|
|
142
|
+
return validated;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Get default camera options
|
|
147
|
+
* @returns {Object} - Default camera options
|
|
148
|
+
*/
|
|
149
|
+
static getDefaultOptions() {
|
|
150
|
+
return {
|
|
151
|
+
quality: _NativeInterfaces.CAMERA_QUALITY.MEDIUM,
|
|
152
|
+
format: _NativeInterfaces.CAMERA_FORMAT.JPEG,
|
|
153
|
+
allowEditing: false
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Get default permission config
|
|
159
|
+
* @returns {Object} - Default permission config
|
|
160
|
+
*/
|
|
161
|
+
static getDefaultPermissionConfig() {
|
|
162
|
+
return {
|
|
163
|
+
includeDetails: false
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Validate camera quality
|
|
169
|
+
* @param {string} quality - Quality string to validate
|
|
170
|
+
* @returns {boolean} - True if valid quality
|
|
171
|
+
*/
|
|
172
|
+
static isValidQuality(quality) {
|
|
173
|
+
return quality && Object.values(_NativeInterfaces.CAMERA_QUALITY).includes(quality.toLowerCase());
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Validate camera format
|
|
178
|
+
* @param {string} format - Format string to validate
|
|
179
|
+
* @returns {boolean} - True if valid format
|
|
180
|
+
*/
|
|
181
|
+
static isValidFormat(format) {
|
|
182
|
+
return format && Object.values(_NativeInterfaces.CAMERA_FORMAT).includes(format.toLowerCase());
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Validate camera device
|
|
187
|
+
* @param {string} device - Device string to validate
|
|
188
|
+
* @returns {boolean} - True if valid device
|
|
189
|
+
*/
|
|
190
|
+
static isValidDevice(device) {
|
|
191
|
+
return device && Object.values(_NativeInterfaces.CAMERA_DEVICE).includes(device.toLowerCase());
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Validate flash mode
|
|
196
|
+
* @param {string} flashMode - Flash mode string to validate
|
|
197
|
+
* @returns {boolean} - True if valid flash mode
|
|
198
|
+
*/
|
|
199
|
+
static isValidFlashMode(flashMode) {
|
|
200
|
+
return flashMode && Object.values(_NativeInterfaces.CAMERA_FLASH_MODE).includes(flashMode.toLowerCase());
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
var _default = exports.default = CameraUtils;
|