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.
Files changed (184) hide show
  1. package/babel.native.config.cjs +8 -0
  2. package/bin/catalyst.js +49 -105
  3. package/changelog.md +8 -0
  4. package/dist/caching.js +1 -1
  5. package/dist/index.jsx +8 -0
  6. package/dist/logger.js +74 -3
  7. package/dist/native/androidProject/app/build.gradle.kts +1 -0
  8. package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/CustomWebview.kt +143 -4
  9. package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/MainActivity.kt +26 -6
  10. package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/MetricsMonitor.kt +143 -17
  11. package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/NativeBridge.kt +6 -0
  12. package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/WebCacheManager.kt +26 -0
  13. package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/utils/BridgeUtils.kt +56 -1
  14. package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/utils/KeyboardUtil.kt +48 -8
  15. package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/utils/PerfDeliveryState.kt +36 -0
  16. package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/utils/PerfEventBuffer.kt +289 -0
  17. package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/utils/ProfilerNavigationState.kt +13 -0
  18. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/ProfilerLifecycleTest.kt +51 -0
  19. package/dist/native/androidSetup.js +300 -8
  20. package/dist/native/bridge/WebBridge.js +481 -59
  21. package/dist/native/bridge/constants/NativeInterfaces.js +290 -44
  22. package/dist/native/bridge/errors.js +250 -26
  23. package/dist/native/bridge/hooks/index.js +125 -1
  24. package/dist/native/bridge/hooks/useCamera.js +347 -9
  25. package/dist/native/bridge/hooks/useDataProtection.js +200 -2
  26. package/dist/native/bridge/hooks/useDeviceInfo.js +71 -2
  27. package/dist/native/bridge/hooks/useFilePicker.js +429 -2
  28. package/dist/native/bridge/hooks/useGoogleSignIn.js +81 -1
  29. package/dist/native/bridge/hooks/useHapticFeedback.js +196 -1
  30. package/dist/native/bridge/hooks/useIntent.js +95 -1
  31. package/dist/native/bridge/hooks/useNativeTransition.js +202 -27
  32. package/dist/native/bridge/hooks/useNetworkStatus.js +84 -3
  33. package/dist/native/bridge/hooks/useNotification.js +318 -2
  34. package/dist/native/bridge/hooks/useSafeArea.js +84 -2
  35. package/dist/native/bridge/hooks/useVideoStream.js +434 -6
  36. package/dist/native/bridge/hooks/utils.js +27 -1
  37. package/dist/native/bridge/hooks.js +16 -1
  38. package/dist/native/bridge/perf/collectors/ApiCollector.js +85 -0
  39. package/dist/native/bridge/perf/collectors/CacheCollector.js +215 -0
  40. package/dist/native/bridge/perf/collectors/HookCollector.js +165 -0
  41. package/dist/native/bridge/perf/collectors/InsightsCollector.js +505 -0
  42. package/dist/native/bridge/perf/collectors/InteractionCollector.js +273 -0
  43. package/dist/native/bridge/perf/collectors/KeyboardCollector.js +124 -0
  44. package/dist/native/bridge/perf/collectors/NavigationCollector.js +294 -0
  45. package/dist/native/bridge/perf/collectors/NetworkTimingCollector.js +183 -0
  46. package/dist/native/bridge/perf/collectors/RenderCollector.js +284 -0
  47. package/dist/native/bridge/perf/collectors/ScrollCollector.js +111 -0
  48. package/dist/native/bridge/perf/collectors/ThreadCollector.js +111 -0
  49. package/dist/native/bridge/perf/core/constants.js +126 -0
  50. package/dist/native/bridge/perf/core/measure.js +189 -0
  51. package/dist/native/bridge/perf/core/session.js +100 -0
  52. package/dist/native/bridge/perf/core/store.js +554 -0
  53. package/dist/native/bridge/perf/core/summary.js +174 -0
  54. package/dist/native/bridge/perf/core/traceExport.js +240 -0
  55. package/dist/native/bridge/perf/core/waterfalls.js +146 -0
  56. package/dist/native/bridge/perf/index.js +402 -0
  57. package/dist/native/bridge/safeArea.js +53 -5
  58. package/dist/native/bridge/standardizedHooks.js +595 -82
  59. package/dist/native/bridge/useBaseHook.js +274 -38
  60. package/dist/native/bridge/utils/CameraUtils.js +201 -56
  61. package/dist/native/bridge/utils/FileObjectConverter.js +129 -18
  62. package/dist/native/bridge/utils/NativeBridge.js +425 -141
  63. package/dist/native/buildAndroid/assets.js +510 -13
  64. package/dist/native/buildAndroid/build.js +296 -19
  65. package/dist/native/buildAndroid/config.js +87 -1
  66. package/dist/native/buildAndroid/index.js +374 -1
  67. package/dist/native/buildAppAndroid.js +34 -2
  68. package/dist/native/buildAppIos.js +62 -2
  69. package/dist/native/buildIos/assets.js +609 -8
  70. package/dist/native/buildIos/build.js +639 -20
  71. package/dist/native/buildIos/config.js +294 -12
  72. package/dist/native/buildIos/index.js +343 -6
  73. package/dist/native/buildIos/plugins.js +343 -16
  74. package/dist/native/internal-plugins/device-info-plugin/android/DeviceInfoPlugin.kt +43 -0
  75. package/dist/native/internal-plugins/device-info-plugin/ios/DeviceInfoPlugin.swift +28 -0
  76. package/dist/native/internal-plugins/device-info-plugin/manifest.json +19 -0
  77. package/dist/native/internalPluginUtils.js +232 -7
  78. package/dist/native/iosnativeWebView/Sources/Core/Constants/CatalystConstants.swift +19 -0
  79. package/dist/native/iosnativeWebView/Sources/Core/Constants/ConfigConstants.swift +4 -0
  80. package/dist/native/iosnativeWebView/Sources/Core/Utils/BootTimingUtility.swift +5 -1
  81. package/dist/native/iosnativeWebView/Sources/Core/Utils/CacheManager.swift +10 -0
  82. package/dist/native/iosnativeWebView/Sources/Core/Utils/DisplayLinkPerfMonitor.swift +89 -0
  83. package/dist/native/iosnativeWebView/Sources/Core/Utils/PerfEventBuffer.swift +373 -0
  84. package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeFileHandler.swift +35 -1
  85. package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeMessageValidator.swift +24 -11
  86. package/dist/native/iosnativeWebView/Sources/Core/WebView/NativeBridge.swift +9 -0
  87. package/dist/native/iosnativeWebView/Sources/Core/WebView/WebView.swift +126 -0
  88. package/dist/native/iosnativeWebView/Sources/Core/WebView/WebViewNavigationDelegate.swift +75 -1
  89. package/dist/native/iosnativeWebView/iosnativeWebViewTests/BridgeMessageValidatorTests.swift +13 -0
  90. package/dist/native/package.json +3 -0
  91. package/dist/native/plugin-bridge/PluginBridge.js +227 -1
  92. package/dist/native/pluginComposerAndroid.js +407 -23
  93. package/dist/native/pluginComposerIos.js +435 -11
  94. package/dist/native/renameAndroidProject.js +1094 -88
  95. package/dist/native/setupEmulatorIos.js +289 -22
  96. package/dist/native/setupServer.js +160 -19
  97. package/dist/native/terminalProgress.js +199 -11
  98. package/dist/native/utils.js +193 -15
  99. package/dist/offline/catalyst-sw.js +145 -1
  100. package/dist/offline/registerServiceWorker.js +33 -1
  101. package/dist/otel.js +375 -46
  102. package/dist/router/ClientRouter.js +14 -2
  103. package/dist/router/ServerRouter.js +9 -1
  104. package/dist/router.js +1 -1
  105. package/dist/scripts/build.js +112 -3
  106. package/dist/scripts/checkVersion.js +3 -1
  107. package/dist/scripts/cleanCache.js +30 -1
  108. package/dist/scripts/generateOfflineManifest.js +116 -1
  109. package/dist/scripts/loadEnvironmentVariables.js +32 -6
  110. package/dist/scripts/plugins.js +309 -1
  111. package/dist/scripts/preServerInit.js +13 -0
  112. package/dist/scripts/scriptUtils.js +54 -3
  113. package/dist/scripts/serve.js +51 -4
  114. package/dist/scripts/start.js +47 -10
  115. package/dist/scripts/validator.js +149 -1
  116. package/dist/sentry.cjs +127 -0
  117. package/dist/sentry.js +125 -5
  118. package/dist/server/expressServer.js +250 -5
  119. package/dist/server/manifestCache.js +36 -0
  120. package/dist/server/renderer/ChunkExtractor.js +144 -0
  121. package/dist/server/renderer/document/Body.jsx +59 -0
  122. package/dist/server/renderer/document/FastRefresh.jsx +20 -0
  123. package/dist/server/renderer/document/Head.jsx +60 -0
  124. package/dist/server/renderer/document/index.jsx +2 -0
  125. package/dist/server/renderer/extract.js +149 -31
  126. package/dist/server/renderer/handler.jsx +433 -0
  127. package/dist/server/renderer/index.js +8 -1
  128. package/dist/server/renderer/render.js +47 -0
  129. package/dist/server/utils/botDetectionMiddleware.js +29 -0
  130. package/dist/server/utils/cjsRequire.js +10 -0
  131. package/dist/server/utils/userAgentUtil.js +87 -9
  132. package/dist/server/utils/validator.js +164 -1
  133. package/dist/vite/FastRefresh.jsx +20 -0
  134. package/dist/vite/inject-cache-key-plugin.js +276 -0
  135. package/dist/vite/loadCustomViteConfig.js +22 -0
  136. package/dist/vite/manifest-categorization-plugin.js +455 -0
  137. package/dist/vite/node-loader.mjs +458 -0
  138. package/dist/vite/scssParams.js +21 -0
  139. package/dist/vite/vite.config.client.js +130 -0
  140. package/dist/vite/vite.config.js +422 -0
  141. package/dist/vite/vite.config.server.js +84 -0
  142. package/dist/web-router/components/MetaTag.jsx +34 -0
  143. package/dist/web-router/components/RouterDataProvider.jsx +332 -0
  144. package/dist/web-router/components/Split.jsx +200 -0
  145. package/dist/web-router/components/SplitInview.jsx +106 -0
  146. package/dist/web-router/components/SsrRequestContext.jsx +14 -0
  147. package/dist/web-router/context.jsx +12 -0
  148. package/dist/web-router/hooks.jsx +72 -0
  149. package/dist/web-router/types/components/MetaTag.d.ts +2 -0
  150. package/dist/web-router/types/components/RouterDataProvider.d.ts +95 -0
  151. package/dist/web-router/types/context.d.ts +14 -0
  152. package/dist/web-router/types/hooks.d.ts +1 -0
  153. package/dist/web-router/types/index.d.ts +3 -0
  154. package/dist/web-router/types/utils/metaDataUtils.d.ts +24 -0
  155. package/dist/web-router/utils/metaDataUtils.jsx +119 -0
  156. package/mcp_v2/conversion-tasks.json +35 -17
  157. package/mcp_v2/knowledge-base.json +124 -13
  158. package/mcp_v2/lib/helpers.js +10 -0
  159. package/mcp_v2/mcp.js +4 -4
  160. package/mcp_v2/package.json +1 -0
  161. package/mcp_v2/tools/build.js +116 -20
  162. package/mcp_v2/tools/conversion.js +106 -5
  163. package/mcp_v2/tools/tasks.js +18 -14
  164. package/package.json +35 -68
  165. package/babel.config.js +0 -32
  166. package/dist/index.js +0 -1
  167. package/dist/scripts/devBuild.js +0 -3
  168. package/dist/scripts/devServe.js +0 -3
  169. package/dist/scripts/loadScriptsBeforeServerStarts.js +0 -4
  170. package/dist/scripts/registerAliases.js +0 -6
  171. package/dist/server/renderer/document/Body.js +0 -11
  172. package/dist/server/renderer/document/Head.js +0 -9
  173. package/dist/server/renderer/document/index.js +0 -1
  174. package/dist/server/renderer/handler.js +0 -47
  175. package/dist/server/startServer.js +0 -57
  176. package/dist/webpack/babel-plugins/remove-client.plugin.js +0 -5
  177. package/dist/webpack/babel-plugins/remove-ssr.plugin.js +0 -5
  178. package/dist/webpack/babel.config.client.js +0 -1
  179. package/dist/webpack/babel.config.ssr.js +0 -1
  180. package/dist/webpack/base.babel.js +0 -7
  181. package/dist/webpack/development.client.babel.js +0 -10
  182. package/dist/webpack/production.client.babel.js +0 -4
  183. package/dist/webpack/production.ssr.babel.js +0 -8
  184. package/dist/webpack/scssParams.js +0 -9
@@ -1 +1,125 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"requestCameraPermission",{enumerable:true,get:function(){return _useCamera.requestCameraPermission;}});Object.defineProperty(exports,"requestHapticFeedback",{enumerable:true,get:function(){return _useHapticFeedback.requestHapticFeedback;}});Object.defineProperty(exports,"requestNotificationPermission",{enumerable:true,get:function(){return _useNotification.requestNotificationPermission;}});Object.defineProperty(exports,"sanitizeFilePickerOptions",{enumerable:true,get:function(){return _useFilePicker.sanitizeFilePickerOptions;}});Object.defineProperty(exports,"useCamera",{enumerable:true,get:function(){return _useCamera.useCamera;}});Object.defineProperty(exports,"useCameraPermission",{enumerable:true,get:function(){return _useCamera.useCameraPermission;}});Object.defineProperty(exports,"useDataProtection",{enumerable:true,get:function(){return _useDataProtection.useDataProtection;}});Object.defineProperty(exports,"useDeviceInfo",{enumerable:true,get:function(){return _useDeviceInfo.useDeviceInfo;}});Object.defineProperty(exports,"useFilePicker",{enumerable:true,get:function(){return _useFilePicker.useFilePicker;}});Object.defineProperty(exports,"useGoogleSignIn",{enumerable:true,get:function(){return _useGoogleSignIn.useGoogleSignIn;}});Object.defineProperty(exports,"useHapticFeedback",{enumerable:true,get:function(){return _useHapticFeedback.useHapticFeedback;}});Object.defineProperty(exports,"useIntent",{enumerable:true,get:function(){return _useIntent.useIntent;}});Object.defineProperty(exports,"useNativeTransition",{enumerable:true,get:function(){return _useNativeTransition.useNativeTransition;}});Object.defineProperty(exports,"useNetworkStatus",{enumerable:true,get:function(){return _useNetworkStatus.useNetworkStatus;}});Object.defineProperty(exports,"useNotification",{enumerable:true,get:function(){return _useNotification.useNotification;}});Object.defineProperty(exports,"useNotificationPermission",{enumerable:true,get:function(){return _useNotification.useNotificationPermission;}});Object.defineProperty(exports,"useSafeArea",{enumerable:true,get:function(){return _useSafeArea.useSafeArea;}});Object.defineProperty(exports,"useVideoStream",{enumerable:true,get:function(){return _useVideoStream.useVideoStream;}});var _useGoogleSignIn=require("./useGoogleSignIn.js");var _useCamera=require("./useCamera.js");var _useIntent=require("./useIntent.js");var _useFilePicker=require("./useFilePicker.js");var _useHapticFeedback=require("./useHapticFeedback.js");var _useNotification=require("./useNotification.js");var _useNetworkStatus=require("./useNetworkStatus.js");var _useDeviceInfo=require("./useDeviceInfo.js");var _useDataProtection=require("./useDataProtection.js");var _useSafeArea=require("./useSafeArea.js");var _useVideoStream=require("./useVideoStream.js");var _useNativeTransition=require("./useNativeTransition.js");
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "requestCameraPermission", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _useCamera.requestCameraPermission;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "requestHapticFeedback", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _useHapticFeedback.requestHapticFeedback;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "requestNotificationPermission", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _useNotification.requestNotificationPermission;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "sanitizeFilePickerOptions", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _useFilePicker.sanitizeFilePickerOptions;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "useCamera", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _useCamera.useCamera;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "useCameraPermission", {
37
+ enumerable: true,
38
+ get: function () {
39
+ return _useCamera.useCameraPermission;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "useDataProtection", {
43
+ enumerable: true,
44
+ get: function () {
45
+ return _useDataProtection.useDataProtection;
46
+ }
47
+ });
48
+ Object.defineProperty(exports, "useDeviceInfo", {
49
+ enumerable: true,
50
+ get: function () {
51
+ return _useDeviceInfo.useDeviceInfo;
52
+ }
53
+ });
54
+ Object.defineProperty(exports, "useFilePicker", {
55
+ enumerable: true,
56
+ get: function () {
57
+ return _useFilePicker.useFilePicker;
58
+ }
59
+ });
60
+ Object.defineProperty(exports, "useGoogleSignIn", {
61
+ enumerable: true,
62
+ get: function () {
63
+ return _useGoogleSignIn.useGoogleSignIn;
64
+ }
65
+ });
66
+ Object.defineProperty(exports, "useHapticFeedback", {
67
+ enumerable: true,
68
+ get: function () {
69
+ return _useHapticFeedback.useHapticFeedback;
70
+ }
71
+ });
72
+ Object.defineProperty(exports, "useIntent", {
73
+ enumerable: true,
74
+ get: function () {
75
+ return _useIntent.useIntent;
76
+ }
77
+ });
78
+ Object.defineProperty(exports, "useNativeTransition", {
79
+ enumerable: true,
80
+ get: function () {
81
+ return _useNativeTransition.useNativeTransition;
82
+ }
83
+ });
84
+ Object.defineProperty(exports, "useNetworkStatus", {
85
+ enumerable: true,
86
+ get: function () {
87
+ return _useNetworkStatus.useNetworkStatus;
88
+ }
89
+ });
90
+ Object.defineProperty(exports, "useNotification", {
91
+ enumerable: true,
92
+ get: function () {
93
+ return _useNotification.useNotification;
94
+ }
95
+ });
96
+ Object.defineProperty(exports, "useNotificationPermission", {
97
+ enumerable: true,
98
+ get: function () {
99
+ return _useNotification.useNotificationPermission;
100
+ }
101
+ });
102
+ Object.defineProperty(exports, "useSafeArea", {
103
+ enumerable: true,
104
+ get: function () {
105
+ return _useSafeArea.useSafeArea;
106
+ }
107
+ });
108
+ Object.defineProperty(exports, "useVideoStream", {
109
+ enumerable: true,
110
+ get: function () {
111
+ return _useVideoStream.useVideoStream;
112
+ }
113
+ });
114
+ var _useGoogleSignIn = require("./useGoogleSignIn.js");
115
+ var _useCamera = require("./useCamera.js");
116
+ var _useIntent = require("./useIntent.js");
117
+ var _useFilePicker = require("./useFilePicker.js");
118
+ var _useHapticFeedback = require("./useHapticFeedback.js");
119
+ var _useNotification = require("./useNotification.js");
120
+ var _useNetworkStatus = require("./useNetworkStatus.js");
121
+ var _useDeviceInfo = require("./useDeviceInfo.js");
122
+ var _useDataProtection = require("./useDataProtection.js");
123
+ var _useSafeArea = require("./useSafeArea.js");
124
+ var _useVideoStream = require("./useVideoStream.js");
125
+ var _useNativeTransition = require("./useNativeTransition.js");
@@ -1,9 +1,347 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useCameraPermission=exports.useCamera=exports.requestCameraPermission=void 0;var _react=require("react");var _NativeBridge=_interopRequireDefault(require("../utils/NativeBridge.js"));var _NativeInterfaces=require("../constants/NativeInterfaces.js");var _useBaseHook=require("../useBaseHook.js");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e};}/* eslint-disable react-compiler/react-compiler, react-hooks/exhaustive-deps */const useCamera=({webFallback}={})=>{const base=(0,_useBaseHook.useBaseHook)("useCamera",{hasWebFallback:true,webFallback});const[permission,setPermission]=(0,_react.useState)(null);if(typeof window==="undefined"){return{data:null,loading:false,progress:null,error:null,isWeb:true,isNative:false,webFallbackActive:false,webFallbackDisabled:false,setWebFallback:()=>{},execute:()=>{},clear:()=>{},clearError:()=>{},permission:null,photo:null,takePhoto:()=>{},isLoading:false,clearPhoto:()=>{}};}if(base.webFallbackDisabled){return{data:null,loading:false,progress:null,error:null,isWeb:true,isNative:false,webFallbackActive:false,webFallbackDisabled:true,setWebFallback:base.setWebFallback,execute:()=>{},clear:()=>{},clearError:()=>{},permission:null,photo:null,takePhoto:()=>{},isLoading:false,clearPhoto:()=>{}};}// Web fallback callback — always declared (Rules of Hooks)
2
- const webTakePhoto=(0,_react.useCallback)(()=>{const input=document.createElement("input");input.type="file";input.accept="image/*";input.capture="environment";input.onchange=()=>{const file=input.files?.[0];if(!file)return;const fileSrc=URL.createObjectURL(file);base.setDataAndComplete({fileSrc,fileName:file.name,size:file.size,mimeType:file.type,transport:"OBJECT_URL",source:"camera"});};input.click();},[base]);if(base.webFallbackActive){return{data:base.data,loading:base.loading,progress:base.progress,error:base.error,isWeb:true,isNative:false,webFallbackActive:true,webFallbackDisabled:false,setWebFallback:base.setWebFallback,execute:webTakePhoto,clear:base.clear,clearError:base.clearError,permission:null,photo:base.data,takePhoto:webTakePhoto,isLoading:base.loading,clearPhoto:base.clear};}(0,_react.useEffect)(()=>{window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_CAMERA_CAPTURE,data=>{try{const result=typeof data==="string"?JSON.parse(data):data;console.log("📷 Camera capture result:",result);const photoData=result.fileSrc?{fileSrc:result.fileSrc,fileName:result.fileName,size:result.size,mimeType:result.mimeType,transport:result.transport,source:result.source}:{fileSrc:result.imageUrl,fileName:"camera_photo.jpg",size:0,mimeType:"image/jpeg",transport:"LEGACY",source:"camera"};base.setDataAndComplete(photoData);if(photoData.transport){base.updateProgress({transport:photoData.transport,bytesTotal:photoData.size||null});}console.log("📷 Photo captured successfully via transport:",photoData.transport);}catch(parseError){console.error("📷 Error parsing camera capture data:",parseError);base.handleNativeError("Failed to process captured photo");}});window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.CAMERA_PERMISSION_STATUS,data=>{setPermission(data);console.log("📷 Camera permission status:",data);});window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_CAMERA_ERROR,data=>{console.error("📷 Camera error:",data);base.handleNativeError(data);});return()=>{window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.CAMERA_PERMISSION_STATUS);window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_CAMERA_CAPTURE);window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_CAMERA_ERROR);};},[base.setDataAndComplete,base.handleNativeError,base.updateProgress]);const takePhoto=()=>{console.log("📷 Camera open requested");base.executeOperation(()=>{base.updateProgress({state:"capturing",phase:"requesting",message:"Opening camera..."});_NativeBridge.default.camera.open();},"camera capture");};return{data:base.data,loading:base.loading,progress:base.progress,error:base.error,isWeb:base.isWeb,isNative:base.isNative,webFallbackActive:false,webFallbackDisabled:false,setWebFallback:base.setWebFallback,execute:takePhoto,clear:base.clear,clearError:base.clearError,permission,photo:base.data,takePhoto,isLoading:base.loading,clearPhoto:base.clear};};exports.useCamera=useCamera;const requestCameraPermission=()=>{if(typeof window==="undefined"){return Promise.resolve(null);}if(!window.WebBridge){throw new Error("WebBridge is not initialized. Call WebBridge.init() first.");}return new Promise((resolve,reject)=>{try{if(!_NativeBridge.default.isAvailable()){reject(new Error("Native bridge not available"));return;}const handlePermissionStatus=data=>{window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.CAMERA_PERMISSION_STATUS);if(data===_NativeInterfaces.PERMISSION_STATUS.GRANTED){resolve(data);}else{reject(new Error(`Camera permission ${data.toLowerCase()}`));}};window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.CAMERA_PERMISSION_STATUS,handlePermissionStatus);_NativeBridge.default.camera.requestPermission();console.log("📷 Camera permission requested");}catch(error){reject(error);}});};exports.requestCameraPermission=requestCameraPermission;const useCameraPermission=({webFallback}={})=>{const isWeb=typeof window==="undefined"?true:!_NativeBridge.default.isAvailable();// All hooks unconditionally at top level (Rules of Hooks)
3
- const[webFallbackState,setWebFallback]=(0,_react.useState)(true);const webFallbackResolved=webFallback!==undefined?webFallback!==false:webFallbackState;const webFallbackActive=isWeb&&webFallbackResolved;const webFallbackDisabled=isWeb&&!webFallbackResolved;const[permission,setPermission]=(0,_react.useState)(null);const[isLoading,setIsLoading]=(0,_react.useState)(true);const permResultRef=(0,_react.useRef)(null);(0,_react.useEffect)(()=>{if(typeof window==="undefined"){setIsLoading(false);return;}if(webFallbackDisabled){setIsLoading(false);return;}if(!window.WebBridge){// Web fallback: navigator.permissions API (query only — never prompts)
4
- if(typeof navigator==="undefined"||!navigator.permissions){setPermission(_NativeInterfaces.PERMISSION_STATUS.NOT_DETERMINED);setIsLoading(false);return;}const PERM_MAP={granted:_NativeInterfaces.PERMISSION_STATUS.GRANTED,denied:_NativeInterfaces.PERMISSION_STATUS.DENIED,prompt:_NativeInterfaces.PERMISSION_STATUS.NOT_DETERMINED};navigator.permissions.query({name:"camera"}).then(result=>{permResultRef.current=result;setPermission(PERM_MAP[result.state]??_NativeInterfaces.PERMISSION_STATUS.NOT_DETERMINED);setIsLoading(false);result.onchange=()=>{setPermission(PERM_MAP[result.state]??_NativeInterfaces.PERMISSION_STATUS.NOT_DETERMINED);};}).catch(()=>{setPermission(_NativeInterfaces.PERMISSION_STATUS.NOT_DETERMINED);setIsLoading(false);});return;}// Native path
5
- const requestPermission=async()=>{try{if(!_NativeBridge.default.isAvailable()){setPermission(_NativeInterfaces.PERMISSION_STATUS.NOT_DETERMINED);setIsLoading(false);return;}window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.CAMERA_PERMISSION_STATUS,data=>{setPermission(data);setIsLoading(false);console.log("📷 Camera permission status updated:",data);});_NativeBridge.default.camera.requestPermission();}catch(error){console.error("📷 Error requesting camera permission:",error);setPermission(_NativeInterfaces.PERMISSION_STATUS.DENIED);setIsLoading(false);}};requestPermission();return()=>{if(window.WebBridge&&_NativeBridge.default.isAvailable()){window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.CAMERA_PERMISSION_STATUS);}};},[webFallbackDisabled]);// Web: navigator.permissions.query() never prompts. request() triggers getUserMedia
6
- // which causes the browser to show the permission dialog, then re-reads permission state.
7
- const request=(0,_react.useCallback)(async()=>{if(!isWeb||typeof window==="undefined")return;if(!navigator.mediaDevices?.getUserMedia)return;try{setIsLoading(true);const stream=await navigator.mediaDevices.getUserMedia({video:true,audio:false});stream.getTracks().forEach(t=>t.stop());}catch(_){// Ignore — the permission state change fires via permResultRef.current.onchange
8
- }// Re-query to get the authoritative state after the prompt
9
- if(navigator.permissions){try{const result=await navigator.permissions.query({name:"camera"});const PERM_MAP={granted:_NativeInterfaces.PERMISSION_STATUS.GRANTED,denied:_NativeInterfaces.PERMISSION_STATUS.DENIED,prompt:_NativeInterfaces.PERMISSION_STATUS.NOT_DETERMINED};setPermission(PERM_MAP[result.state]??_NativeInterfaces.PERMISSION_STATUS.NOT_DETERMINED);}catch(_){/* permission query not supported */}}setIsLoading(false);},[isWeb]);if(typeof window==="undefined"){return{permission:null,isLoading:false,webFallbackActive:false,webFallbackDisabled:false,setWebFallback:()=>{},request:()=>{}};}return{permission,isLoading,webFallbackActive,webFallbackDisabled,setWebFallback,request};};exports.useCameraPermission=useCameraPermission;
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useCameraPermission = exports.useCamera = exports.requestCameraPermission = void 0;
7
+ var _react = require("react");
8
+ var _NativeBridge = _interopRequireDefault(require("../utils/NativeBridge.js"));
9
+ var _NativeInterfaces = require("../constants/NativeInterfaces.js");
10
+ var _useBaseHook = require("../useBaseHook.js");
11
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
+ /* eslint-disable react-compiler/react-compiler, react-hooks/exhaustive-deps */
13
+
14
+ const useCamera = ({
15
+ webFallback
16
+ } = {}) => {
17
+ const base = (0, _useBaseHook.useBaseHook)("useCamera", {
18
+ hasWebFallback: true,
19
+ webFallback
20
+ });
21
+ const [permission, setPermission] = (0, _react.useState)(null);
22
+ if (typeof window === "undefined") {
23
+ return {
24
+ data: null,
25
+ loading: false,
26
+ progress: null,
27
+ error: null,
28
+ isWeb: true,
29
+ isNative: false,
30
+ webFallbackActive: false,
31
+ webFallbackDisabled: false,
32
+ setWebFallback: () => {},
33
+ execute: () => {},
34
+ clear: () => {},
35
+ clearError: () => {},
36
+ permission: null,
37
+ photo: null,
38
+ takePhoto: () => {},
39
+ isLoading: false,
40
+ clearPhoto: () => {}
41
+ };
42
+ }
43
+ if (base.webFallbackDisabled) {
44
+ return {
45
+ data: null,
46
+ loading: false,
47
+ progress: null,
48
+ error: null,
49
+ isWeb: true,
50
+ isNative: false,
51
+ webFallbackActive: false,
52
+ webFallbackDisabled: true,
53
+ setWebFallback: base.setWebFallback,
54
+ execute: () => {},
55
+ clear: () => {},
56
+ clearError: () => {},
57
+ permission: null,
58
+ photo: null,
59
+ takePhoto: () => {},
60
+ isLoading: false,
61
+ clearPhoto: () => {}
62
+ };
63
+ }
64
+
65
+ // Web fallback callback — always declared (Rules of Hooks)
66
+ const webTakePhoto = (0, _react.useCallback)(() => {
67
+ const input = document.createElement("input");
68
+ input.type = "file";
69
+ input.accept = "image/*";
70
+ input.capture = "environment";
71
+ input.onchange = () => {
72
+ const file = input.files?.[0];
73
+ if (!file) return;
74
+ const fileSrc = URL.createObjectURL(file);
75
+ base.setDataAndComplete({
76
+ fileSrc,
77
+ fileName: file.name,
78
+ size: file.size,
79
+ mimeType: file.type,
80
+ transport: "OBJECT_URL",
81
+ source: "camera"
82
+ });
83
+ };
84
+ input.click();
85
+ }, [base]);
86
+ if (base.webFallbackActive) {
87
+ return {
88
+ data: base.data,
89
+ loading: base.loading,
90
+ progress: base.progress,
91
+ error: base.error,
92
+ isWeb: true,
93
+ isNative: false,
94
+ webFallbackActive: true,
95
+ webFallbackDisabled: false,
96
+ setWebFallback: base.setWebFallback,
97
+ execute: webTakePhoto,
98
+ clear: base.clear,
99
+ clearError: base.clearError,
100
+ permission: null,
101
+ photo: base.data,
102
+ takePhoto: webTakePhoto,
103
+ isLoading: base.loading,
104
+ clearPhoto: base.clear
105
+ };
106
+ }
107
+ (0, _react.useEffect)(() => {
108
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_CAMERA_CAPTURE, data => {
109
+ try {
110
+ const result = typeof data === "string" ? JSON.parse(data) : data;
111
+ console.log("📷 Camera capture result:", result);
112
+ const photoData = result.fileSrc ? {
113
+ fileSrc: result.fileSrc,
114
+ fileName: result.fileName,
115
+ size: result.size,
116
+ mimeType: result.mimeType,
117
+ transport: result.transport,
118
+ source: result.source
119
+ } : {
120
+ fileSrc: result.imageUrl,
121
+ fileName: "camera_photo.jpg",
122
+ size: 0,
123
+ mimeType: "image/jpeg",
124
+ transport: "LEGACY",
125
+ source: "camera"
126
+ };
127
+ base.setDataAndComplete(photoData);
128
+ if (photoData.transport) {
129
+ base.updateProgress({
130
+ transport: photoData.transport,
131
+ bytesTotal: photoData.size || null
132
+ });
133
+ }
134
+ console.log("📷 Photo captured successfully via transport:", photoData.transport);
135
+ } catch (parseError) {
136
+ console.error("📷 Error parsing camera capture data:", parseError);
137
+ base.handleNativeError("Failed to process captured photo");
138
+ }
139
+ });
140
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.CAMERA_PERMISSION_STATUS, data => {
141
+ setPermission(data);
142
+ console.log("📷 Camera permission status:", data);
143
+ });
144
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_CAMERA_ERROR, data => {
145
+ console.error("📷 Camera error:", data);
146
+ base.handleNativeError(data);
147
+ });
148
+ return () => {
149
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.CAMERA_PERMISSION_STATUS);
150
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_CAMERA_CAPTURE);
151
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_CAMERA_ERROR);
152
+ };
153
+ }, [base.setDataAndComplete, base.handleNativeError, base.updateProgress]);
154
+ const takePhoto = () => {
155
+ console.log("📷 Camera open requested");
156
+ base.executeOperation(() => {
157
+ base.updateProgress({
158
+ state: "capturing",
159
+ phase: "requesting",
160
+ message: "Opening camera..."
161
+ });
162
+ _NativeBridge.default.camera.open();
163
+ }, "camera capture");
164
+ };
165
+ return {
166
+ data: base.data,
167
+ loading: base.loading,
168
+ progress: base.progress,
169
+ error: base.error,
170
+ isWeb: base.isWeb,
171
+ isNative: base.isNative,
172
+ webFallbackActive: false,
173
+ webFallbackDisabled: false,
174
+ setWebFallback: base.setWebFallback,
175
+ execute: takePhoto,
176
+ clear: base.clear,
177
+ clearError: base.clearError,
178
+ permission,
179
+ photo: base.data,
180
+ takePhoto,
181
+ isLoading: base.loading,
182
+ clearPhoto: base.clear
183
+ };
184
+ };
185
+ exports.useCamera = useCamera;
186
+ const requestCameraPermission = () => {
187
+ if (typeof window === "undefined") {
188
+ return Promise.resolve(null);
189
+ }
190
+ if (!window.WebBridge) {
191
+ throw new Error("WebBridge is not initialized. Call WebBridge.init() first.");
192
+ }
193
+ return new Promise((resolve, reject) => {
194
+ try {
195
+ if (!_NativeBridge.default.isAvailable()) {
196
+ reject(new Error("Native bridge not available"));
197
+ return;
198
+ }
199
+ const handlePermissionStatus = data => {
200
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.CAMERA_PERMISSION_STATUS);
201
+ if (data === _NativeInterfaces.PERMISSION_STATUS.GRANTED) {
202
+ resolve(data);
203
+ } else {
204
+ reject(new Error(`Camera permission ${data.toLowerCase()}`));
205
+ }
206
+ };
207
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.CAMERA_PERMISSION_STATUS, handlePermissionStatus);
208
+ _NativeBridge.default.camera.requestPermission();
209
+ console.log("📷 Camera permission requested");
210
+ } catch (error) {
211
+ reject(error);
212
+ }
213
+ });
214
+ };
215
+ exports.requestCameraPermission = requestCameraPermission;
216
+ const useCameraPermission = ({
217
+ webFallback
218
+ } = {}) => {
219
+ const isWeb = typeof window === "undefined" ? true : !_NativeBridge.default.isAvailable();
220
+
221
+ // All hooks unconditionally at top level (Rules of Hooks)
222
+ const [webFallbackState, setWebFallback] = (0, _react.useState)(true);
223
+ const webFallbackResolved = webFallback !== undefined ? webFallback !== false : webFallbackState;
224
+ const webFallbackActive = isWeb && webFallbackResolved;
225
+ const webFallbackDisabled = isWeb && !webFallbackResolved;
226
+ const [permission, setPermission] = (0, _react.useState)(null);
227
+ const [isLoading, setIsLoading] = (0, _react.useState)(true);
228
+ const permResultRef = (0, _react.useRef)(null);
229
+ (0, _react.useEffect)(() => {
230
+ if (typeof window === "undefined") {
231
+ setIsLoading(false);
232
+ return;
233
+ }
234
+ if (webFallbackDisabled) {
235
+ setIsLoading(false);
236
+ return;
237
+ }
238
+ if (!window.WebBridge) {
239
+ // Web fallback: navigator.permissions API (query only — never prompts)
240
+ if (typeof navigator === "undefined" || !navigator.permissions) {
241
+ setPermission(_NativeInterfaces.PERMISSION_STATUS.NOT_DETERMINED);
242
+ setIsLoading(false);
243
+ return;
244
+ }
245
+ const PERM_MAP = {
246
+ granted: _NativeInterfaces.PERMISSION_STATUS.GRANTED,
247
+ denied: _NativeInterfaces.PERMISSION_STATUS.DENIED,
248
+ prompt: _NativeInterfaces.PERMISSION_STATUS.NOT_DETERMINED
249
+ };
250
+ navigator.permissions.query({
251
+ name: "camera"
252
+ }).then(result => {
253
+ permResultRef.current = result;
254
+ setPermission(PERM_MAP[result.state] ?? _NativeInterfaces.PERMISSION_STATUS.NOT_DETERMINED);
255
+ setIsLoading(false);
256
+ result.onchange = () => {
257
+ setPermission(PERM_MAP[result.state] ?? _NativeInterfaces.PERMISSION_STATUS.NOT_DETERMINED);
258
+ };
259
+ }).catch(() => {
260
+ setPermission(_NativeInterfaces.PERMISSION_STATUS.NOT_DETERMINED);
261
+ setIsLoading(false);
262
+ });
263
+ return;
264
+ }
265
+
266
+ // Native path
267
+ const requestPermission = async () => {
268
+ try {
269
+ if (!_NativeBridge.default.isAvailable()) {
270
+ setPermission(_NativeInterfaces.PERMISSION_STATUS.NOT_DETERMINED);
271
+ setIsLoading(false);
272
+ return;
273
+ }
274
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.CAMERA_PERMISSION_STATUS, data => {
275
+ setPermission(data);
276
+ setIsLoading(false);
277
+ console.log("📷 Camera permission status updated:", data);
278
+ });
279
+ _NativeBridge.default.camera.requestPermission();
280
+ } catch (error) {
281
+ console.error("📷 Error requesting camera permission:", error);
282
+ setPermission(_NativeInterfaces.PERMISSION_STATUS.DENIED);
283
+ setIsLoading(false);
284
+ }
285
+ };
286
+ requestPermission();
287
+ return () => {
288
+ if (window.WebBridge && _NativeBridge.default.isAvailable()) {
289
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.CAMERA_PERMISSION_STATUS);
290
+ }
291
+ };
292
+ }, [webFallbackDisabled]);
293
+
294
+ // Web: navigator.permissions.query() never prompts. request() triggers getUserMedia
295
+ // which causes the browser to show the permission dialog, then re-reads permission state.
296
+ const request = (0, _react.useCallback)(async () => {
297
+ if (!isWeb || typeof window === "undefined") return;
298
+ if (!navigator.mediaDevices?.getUserMedia) return;
299
+ try {
300
+ setIsLoading(true);
301
+ const stream = await navigator.mediaDevices.getUserMedia({
302
+ video: true,
303
+ audio: false
304
+ });
305
+ stream.getTracks().forEach(t => t.stop());
306
+ } catch (_) {
307
+ // Ignore — the permission state change fires via permResultRef.current.onchange
308
+ }
309
+
310
+ // Re-query to get the authoritative state after the prompt
311
+ if (navigator.permissions) {
312
+ try {
313
+ const result = await navigator.permissions.query({
314
+ name: "camera"
315
+ });
316
+ const PERM_MAP = {
317
+ granted: _NativeInterfaces.PERMISSION_STATUS.GRANTED,
318
+ denied: _NativeInterfaces.PERMISSION_STATUS.DENIED,
319
+ prompt: _NativeInterfaces.PERMISSION_STATUS.NOT_DETERMINED
320
+ };
321
+ setPermission(PERM_MAP[result.state] ?? _NativeInterfaces.PERMISSION_STATUS.NOT_DETERMINED);
322
+ } catch (_) {
323
+ /* permission query not supported */
324
+ }
325
+ }
326
+ setIsLoading(false);
327
+ }, [isWeb]);
328
+ if (typeof window === "undefined") {
329
+ return {
330
+ permission: null,
331
+ isLoading: false,
332
+ webFallbackActive: false,
333
+ webFallbackDisabled: false,
334
+ setWebFallback: () => {},
335
+ request: () => {}
336
+ };
337
+ }
338
+ return {
339
+ permission,
340
+ isLoading,
341
+ webFallbackActive,
342
+ webFallbackDisabled,
343
+ setWebFallback,
344
+ request
345
+ };
346
+ };
347
+ exports.useCameraPermission = useCameraPermission;