catalyst-core 0.2.0-beta.3 → 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 (160) 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/androidSetup.js +300 -8
  8. package/dist/native/bridge/WebBridge.js +481 -59
  9. package/dist/native/bridge/constants/NativeInterfaces.js +290 -45
  10. package/dist/native/bridge/errors.js +250 -26
  11. package/dist/native/bridge/hooks/index.js +125 -1
  12. package/dist/native/bridge/hooks/useCamera.js +347 -9
  13. package/dist/native/bridge/hooks/useDataProtection.js +200 -2
  14. package/dist/native/bridge/hooks/useDeviceInfo.js +71 -2
  15. package/dist/native/bridge/hooks/useFilePicker.js +429 -2
  16. package/dist/native/bridge/hooks/useGoogleSignIn.js +81 -1
  17. package/dist/native/bridge/hooks/useHapticFeedback.js +196 -1
  18. package/dist/native/bridge/hooks/useIntent.js +95 -1
  19. package/dist/native/bridge/hooks/useNativeTransition.js +202 -27
  20. package/dist/native/bridge/hooks/useNetworkStatus.js +84 -3
  21. package/dist/native/bridge/hooks/useNotification.js +318 -2
  22. package/dist/native/bridge/hooks/useSafeArea.js +84 -2
  23. package/dist/native/bridge/hooks/useVideoStream.js +434 -6
  24. package/dist/native/bridge/hooks/utils.js +27 -1
  25. package/dist/native/bridge/hooks.js +16 -1
  26. package/dist/native/bridge/perf/collectors/ApiCollector.js +66 -3
  27. package/dist/native/bridge/perf/collectors/CacheCollector.js +186 -11
  28. package/dist/native/bridge/perf/collectors/HookCollector.js +141 -19
  29. package/dist/native/bridge/perf/collectors/InsightsCollector.js +481 -23
  30. package/dist/native/bridge/perf/collectors/InteractionCollector.js +245 -10
  31. package/dist/native/bridge/perf/collectors/KeyboardCollector.js +107 -8
  32. package/dist/native/bridge/perf/collectors/NavigationCollector.js +273 -32
  33. package/dist/native/bridge/perf/collectors/NetworkTimingCollector.js +178 -2
  34. package/dist/native/bridge/perf/collectors/RenderCollector.js +258 -14
  35. package/dist/native/bridge/perf/collectors/ScrollCollector.js +95 -9
  36. package/dist/native/bridge/perf/collectors/ThreadCollector.js +90 -6
  37. package/dist/native/bridge/perf/core/constants.js +103 -20
  38. package/dist/native/bridge/perf/core/measure.js +179 -30
  39. package/dist/native/bridge/perf/core/session.js +89 -23
  40. package/dist/native/bridge/perf/core/store.js +554 -1
  41. package/dist/native/bridge/perf/core/summary.js +174 -1
  42. package/dist/native/bridge/perf/core/traceExport.js +240 -1
  43. package/dist/native/bridge/perf/core/waterfalls.js +146 -1
  44. package/dist/native/bridge/perf/index.js +359 -38
  45. package/dist/native/bridge/safeArea.js +53 -5
  46. package/dist/native/bridge/standardizedHooks.js +595 -82
  47. package/dist/native/bridge/useBaseHook.js +274 -38
  48. package/dist/native/bridge/utils/CameraUtils.js +201 -56
  49. package/dist/native/bridge/utils/FileObjectConverter.js +129 -18
  50. package/dist/native/bridge/utils/NativeBridge.js +425 -141
  51. package/dist/native/buildAndroid/assets.js +510 -13
  52. package/dist/native/buildAndroid/build.js +296 -19
  53. package/dist/native/buildAndroid/config.js +87 -1
  54. package/dist/native/buildAndroid/index.js +374 -1
  55. package/dist/native/buildAppAndroid.js +34 -2
  56. package/dist/native/buildAppIos.js +62 -2
  57. package/dist/native/buildIos/assets.js +609 -8
  58. package/dist/native/buildIos/build.js +639 -20
  59. package/dist/native/buildIos/config.js +294 -12
  60. package/dist/native/buildIos/index.js +343 -6
  61. package/dist/native/buildIos/plugins.js +343 -16
  62. package/dist/native/internal-plugins/device-info-plugin/android/DeviceInfoPlugin.kt +43 -0
  63. package/dist/native/internal-plugins/device-info-plugin/ios/DeviceInfoPlugin.swift +28 -0
  64. package/dist/native/internal-plugins/device-info-plugin/manifest.json +19 -0
  65. package/dist/native/internalPluginUtils.js +232 -7
  66. package/dist/native/package.json +3 -0
  67. package/dist/native/plugin-bridge/PluginBridge.js +227 -1
  68. package/dist/native/pluginComposerAndroid.js +407 -23
  69. package/dist/native/pluginComposerIos.js +435 -11
  70. package/dist/native/renameAndroidProject.js +1094 -88
  71. package/dist/native/setupEmulatorIos.js +289 -22
  72. package/dist/native/setupServer.js +160 -19
  73. package/dist/native/terminalProgress.js +199 -11
  74. package/dist/native/utils.js +193 -15
  75. package/dist/offline/catalyst-sw.js +145 -1
  76. package/dist/offline/registerServiceWorker.js +33 -1
  77. package/dist/otel.js +375 -46
  78. package/dist/router/ClientRouter.js +14 -2
  79. package/dist/router/ServerRouter.js +9 -1
  80. package/dist/router.js +1 -1
  81. package/dist/scripts/build.js +112 -3
  82. package/dist/scripts/checkVersion.js +3 -1
  83. package/dist/scripts/cleanCache.js +30 -1
  84. package/dist/scripts/generateOfflineManifest.js +116 -1
  85. package/dist/scripts/loadEnvironmentVariables.js +32 -6
  86. package/dist/scripts/plugins.js +309 -1
  87. package/dist/scripts/preServerInit.js +13 -0
  88. package/dist/scripts/scriptUtils.js +54 -3
  89. package/dist/scripts/serve.js +51 -4
  90. package/dist/scripts/start.js +47 -10
  91. package/dist/scripts/validator.js +149 -1
  92. package/dist/sentry.cjs +127 -0
  93. package/dist/sentry.js +125 -5
  94. package/dist/server/expressServer.js +250 -5
  95. package/dist/server/manifestCache.js +36 -0
  96. package/dist/server/renderer/ChunkExtractor.js +144 -0
  97. package/dist/server/renderer/document/Body.jsx +59 -0
  98. package/dist/server/renderer/document/FastRefresh.jsx +20 -0
  99. package/dist/server/renderer/document/Head.jsx +60 -0
  100. package/dist/server/renderer/document/index.jsx +2 -0
  101. package/dist/server/renderer/extract.js +149 -31
  102. package/dist/server/renderer/handler.jsx +433 -0
  103. package/dist/server/renderer/index.js +8 -1
  104. package/dist/server/renderer/render.js +47 -0
  105. package/dist/server/utils/botDetectionMiddleware.js +29 -0
  106. package/dist/server/utils/cjsRequire.js +10 -0
  107. package/dist/server/utils/userAgentUtil.js +87 -9
  108. package/dist/server/utils/validator.js +164 -1
  109. package/dist/vite/FastRefresh.jsx +20 -0
  110. package/dist/vite/inject-cache-key-plugin.js +276 -0
  111. package/dist/vite/loadCustomViteConfig.js +22 -0
  112. package/dist/vite/manifest-categorization-plugin.js +455 -0
  113. package/dist/vite/node-loader.mjs +458 -0
  114. package/dist/vite/scssParams.js +21 -0
  115. package/dist/vite/vite.config.client.js +130 -0
  116. package/dist/vite/vite.config.js +422 -0
  117. package/dist/vite/vite.config.server.js +84 -0
  118. package/dist/web-router/components/MetaTag.jsx +34 -0
  119. package/dist/web-router/components/RouterDataProvider.jsx +332 -0
  120. package/dist/web-router/components/Split.jsx +200 -0
  121. package/dist/web-router/components/SplitInview.jsx +106 -0
  122. package/dist/web-router/components/SsrRequestContext.jsx +14 -0
  123. package/dist/web-router/context.jsx +12 -0
  124. package/dist/web-router/hooks.jsx +72 -0
  125. package/dist/web-router/types/components/MetaTag.d.ts +2 -0
  126. package/dist/web-router/types/components/RouterDataProvider.d.ts +95 -0
  127. package/dist/web-router/types/context.d.ts +14 -0
  128. package/dist/web-router/types/hooks.d.ts +1 -0
  129. package/dist/web-router/types/index.d.ts +3 -0
  130. package/dist/web-router/types/utils/metaDataUtils.d.ts +24 -0
  131. package/dist/web-router/utils/metaDataUtils.jsx +119 -0
  132. package/mcp_v2/conversion-tasks.json +35 -17
  133. package/mcp_v2/knowledge-base.json +124 -13
  134. package/mcp_v2/lib/helpers.js +10 -0
  135. package/mcp_v2/mcp.js +4 -4
  136. package/mcp_v2/package.json +1 -0
  137. package/mcp_v2/tools/build.js +116 -20
  138. package/mcp_v2/tools/conversion.js +106 -5
  139. package/mcp_v2/tools/tasks.js +18 -14
  140. package/package.json +35 -68
  141. package/babel.config.js +0 -32
  142. package/dist/index.js +0 -1
  143. package/dist/scripts/devBuild.js +0 -3
  144. package/dist/scripts/devServe.js +0 -3
  145. package/dist/scripts/loadScriptsBeforeServerStarts.js +0 -4
  146. package/dist/scripts/registerAliases.js +0 -6
  147. package/dist/server/renderer/document/Body.js +0 -11
  148. package/dist/server/renderer/document/Head.js +0 -9
  149. package/dist/server/renderer/document/index.js +0 -1
  150. package/dist/server/renderer/handler.js +0 -47
  151. package/dist/server/startServer.js +0 -57
  152. package/dist/webpack/babel-plugins/remove-client.plugin.js +0 -5
  153. package/dist/webpack/babel-plugins/remove-ssr.plugin.js +0 -5
  154. package/dist/webpack/babel.config.client.js +0 -1
  155. package/dist/webpack/babel.config.ssr.js +0 -1
  156. package/dist/webpack/base.babel.js +0 -7
  157. package/dist/webpack/development.client.babel.js +0 -10
  158. package/dist/webpack/production.client.babel.js +0 -4
  159. package/dist/webpack/production.ssr.babel.js +0 -8
  160. package/dist/webpack/scssParams.js +0 -9
@@ -1,98 +1,611 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useIntent=exports.useFilePicker=exports.useCamera=void 0;var _react=require("react");var _useBaseHook=require("./useBaseHook");var _NativeBridge=_interopRequireDefault(require("./utils/NativeBridge.js"));var _NativeInterfaces=require("./constants/NativeInterfaces");var _errors=require("./errors");var _FileObjectConverter=require("./utils/FileObjectConverter.js");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e};}/* eslint-disable react-compiler/react-compiler, react-hooks/exhaustive-deps, no-case-declarations *//**
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useIntent = exports.useFilePicker = exports.useCamera = void 0;
7
+ var _react = require("react");
8
+ var _useBaseHook = require("./useBaseHook");
9
+ var _NativeBridge = _interopRequireDefault(require("./utils/NativeBridge.js"));
10
+ var _NativeInterfaces = require("./constants/NativeInterfaces");
11
+ var _errors = require("./errors");
12
+ var _FileObjectConverter = require("./utils/FileObjectConverter.js");
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
+ /* eslint-disable react-compiler/react-compiler, react-hooks/exhaustive-deps, no-case-declarations */
15
+
16
+ /**
2
17
  * Standardized Camera Superhook
3
18
  * Comprehensive camera functionality with integrated permission management
4
19
  * Follows standardized interface with execute as primary function
5
20
  *
6
21
  * @param {Object} options - Configuration options
7
22
  * @returns {Object} Standardized camera superhook interface
8
- */const useCamera=(options={})=>{const base=(0,_useBaseHook.useBaseHook)("useCamera",options);const[permission,setPermission]=(0,_react.useState)({status:"not_determined",canRequest:true,lastChecked:null});// Camera operations
9
- const CAMERA_OPERATIONS={TAKE_PHOTO:"takePhoto",REQUEST_PERMISSION:"requestPermission",CHECK_PERMISSION:"checkPermission"};// Camera-specific progress phases
10
- const CAMERA_PHASES={REQUESTING_PERMISSION:"requesting_permission",CHECKING_PERMISSION:"checking_permission",OPENING_CAMERA:"opening_camera",CAPTURING:"capturing",PROCESSING:"processing",COMPLETE:"complete"};(0,_react.useEffect)(()=>{// Server-side rendering safety
11
- if(typeof window==="undefined")return;if(!window.WebBridge){console.warn("WebBridge not initialized. Camera functionality unavailable.");return;}// Camera capture success handler
12
- const handleCameraCapture=data=>{try{const result=typeof data==="string"?JSON.parse(data):data;base.updateProgress({phase:CAMERA_PHASES.PROCESSING,message:"Processing captured photo..."});// Handle new tri-transport format or legacy format
13
- const photoData=result.fileSrc?{// New tri-transport format
14
- fileSrc:result.fileSrc,fileName:result.fileName,size:result.size,mimeType:result.mimeType,transport:result.transport,source:result.source,filePath:result.filePath}:{// Legacy format (fallback)
15
- fileSrc:result.imageUrl,fileName:result.fileName||"camera_photo.jpg",size:result.size||0,mimeType:result.mimeType||"image/jpeg",transport:"LEGACY",source:"camera",filePath:result.filePath||null};// Create comprehensive data object with photo and permission info
16
- const cameraData={...photoData,permission:permission,lastOperation:CAMERA_OPERATIONS.TAKE_PHOTO,operationSuccess:true,timestamp:new Date().toISOString()};base.setDataAndComplete(cameraData);console.log("📷 Photo captured successfully via transport:",photoData.transport);}catch(parseError){console.error("📷 Error parsing camera capture data:",parseError);const error=(0,_errors.createStandardError)(_errors.ERROR_CODES.INTERNAL_ERROR,"Failed to process captured photo",parseError);base.handleNativeError(error);}};// Camera permission status handler
17
- const handlePermissionStatus=data=>{const permissionStatus=typeof data==="string"?data:data.status||data;const newPermission={status:permissionStatus.toLowerCase(),canRequest:permissionStatus!=="permanently_denied",lastChecked:new Date().toISOString()};setPermission(newPermission);console.log("📷 Camera permission status:",newPermission);// Update data with permission info
18
- const permissionData={permission:newPermission,lastOperation:CAMERA_OPERATIONS.REQUEST_PERMISSION,operationSuccess:permissionStatus==="GRANTED",timestamp:new Date().toISOString()};if(permissionStatus==="GRANTED"){base.updateProgress({phase:CAMERA_PHASES.OPENING_CAMERA,message:"Camera permission granted, ready to capture..."});base.setDataAndComplete(permissionData);}else if(permissionStatus==="DENIED"){const error=(0,_errors.createStandardError)(_errors.ERROR_CODES.PERMISSION_DENIED,"Camera permission denied",null,"Camera permission is required to take photos");base.handleNativeError(error);}};// Camera error handler
19
- const handleCameraError=data=>{console.error("📷 Camera error:",data);base.handleNativeError(data);};// Register event listeners
20
- window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_CAMERA_CAPTURE,handleCameraCapture);window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.CAMERA_PERMISSION_STATUS,handlePermissionStatus);window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_CAMERA_ERROR,handleCameraError);// Cleanup function
21
- return()=>{window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_CAMERA_CAPTURE);window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.CAMERA_PERMISSION_STATUS);window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_CAMERA_ERROR);};},[base]);// Main execute function for camera superhook
22
- const executeCamera=(operation,...args)=>{if(base.isWeb){console.warn(`Camera ${operation} requires web fallback implementation (isWeb: true)`);return;}switch(operation){case CAMERA_OPERATIONS.TAKE_PHOTO:return handleTakePhoto(args[0]||{});case CAMERA_OPERATIONS.REQUEST_PERMISSION:return handleRequestPermission();case CAMERA_OPERATIONS.CHECK_PERMISSION:return handleCheckPermission();default:const error=(0,_errors.createStandardError)(_errors.ERROR_CODES.INVALID_PARAMETERS,`Unknown camera operation: ${operation}`,null,`Valid operations: ${Object.values(CAMERA_OPERATIONS).join(", ")}`);base.handleNativeError(error);}};// Camera operation handlers
23
- const handleTakePhoto=(cameraOptions={})=>{base.executeOperation(()=>{base.updateProgress({phase:CAMERA_PHASES.REQUESTING_PERMISSION,message:"Requesting camera permission..."});_NativeBridge.default.camera.open(cameraOptions);console.log("📷 Camera open requested with options:",cameraOptions);},"photo capture");};const handleRequestPermission=()=>{base.executeOperation(()=>{base.updateProgress({phase:CAMERA_PHASES.REQUESTING_PERMISSION,message:"Requesting camera permission..."});if(_NativeBridge.default.camera.requestPermission){_NativeBridge.default.camera.requestPermission();}else{// Fallback method
24
- _NativeBridge.default.camera.checkPermission();}console.log("📷 Camera permission requested");},"permission request");};const handleCheckPermission=()=>{base.executeOperation(()=>{base.updateProgress({phase:CAMERA_PHASES.CHECKING_PERMISSION,message:"Checking camera permission..."});_NativeBridge.default.camera.checkPermission();console.log("📷 Camera permission check requested");},"permission check");};// Return standardized superhook interface
25
- return{// Standard interface (from useBaseHook)
26
- data:base.data,loading:base.loading,progress:base.progress,error:base.error,isWeb:base.isWeb,isNative:base.isNative,clear:base.clear,clearError:base.clearError,// Main execute function
27
- execute:executeCamera,// Semantic aliases for execute
28
- takePhoto:options=>executeCamera(CAMERA_OPERATIONS.TAKE_PHOTO,options),requestPermission:()=>executeCamera(CAMERA_OPERATIONS.REQUEST_PERMISSION),checkPermission:()=>executeCamera(CAMERA_OPERATIONS.CHECK_PERMISSION),// Current state info
29
- permission:permission,// Legacy compatibility
30
- photo:base.data,clearPhoto:base.clear};};/**
23
+ */
24
+ const useCamera = (options = {}) => {
25
+ const base = (0, _useBaseHook.useBaseHook)("useCamera", options);
26
+ const [permission, setPermission] = (0, _react.useState)({
27
+ status: "not_determined",
28
+ canRequest: true,
29
+ lastChecked: null
30
+ });
31
+
32
+ // Camera operations
33
+ const CAMERA_OPERATIONS = {
34
+ TAKE_PHOTO: "takePhoto",
35
+ REQUEST_PERMISSION: "requestPermission",
36
+ CHECK_PERMISSION: "checkPermission"
37
+ };
38
+
39
+ // Camera-specific progress phases
40
+ const CAMERA_PHASES = {
41
+ REQUESTING_PERMISSION: "requesting_permission",
42
+ CHECKING_PERMISSION: "checking_permission",
43
+ OPENING_CAMERA: "opening_camera",
44
+ CAPTURING: "capturing",
45
+ PROCESSING: "processing",
46
+ COMPLETE: "complete"
47
+ };
48
+ (0, _react.useEffect)(() => {
49
+ // Server-side rendering safety
50
+ if (typeof window === "undefined") return;
51
+ if (!window.WebBridge) {
52
+ console.warn("WebBridge not initialized. Camera functionality unavailable.");
53
+ return;
54
+ }
55
+
56
+ // Camera capture success handler
57
+ const handleCameraCapture = data => {
58
+ try {
59
+ const result = typeof data === "string" ? JSON.parse(data) : data;
60
+ base.updateProgress({
61
+ phase: CAMERA_PHASES.PROCESSING,
62
+ message: "Processing captured photo..."
63
+ });
64
+
65
+ // Handle new tri-transport format or legacy format
66
+ const photoData = result.fileSrc ? {
67
+ // New tri-transport format
68
+ fileSrc: result.fileSrc,
69
+ fileName: result.fileName,
70
+ size: result.size,
71
+ mimeType: result.mimeType,
72
+ transport: result.transport,
73
+ source: result.source,
74
+ filePath: result.filePath
75
+ } : {
76
+ // Legacy format (fallback)
77
+ fileSrc: result.imageUrl,
78
+ fileName: result.fileName || "camera_photo.jpg",
79
+ size: result.size || 0,
80
+ mimeType: result.mimeType || "image/jpeg",
81
+ transport: "LEGACY",
82
+ source: "camera",
83
+ filePath: result.filePath || null
84
+ };
85
+
86
+ // Create comprehensive data object with photo and permission info
87
+ const cameraData = {
88
+ ...photoData,
89
+ permission: permission,
90
+ lastOperation: CAMERA_OPERATIONS.TAKE_PHOTO,
91
+ operationSuccess: true,
92
+ timestamp: new Date().toISOString()
93
+ };
94
+ base.setDataAndComplete(cameraData);
95
+ console.log("📷 Photo captured successfully via transport:", photoData.transport);
96
+ } catch (parseError) {
97
+ console.error("📷 Error parsing camera capture data:", parseError);
98
+ const error = (0, _errors.createStandardError)(_errors.ERROR_CODES.INTERNAL_ERROR, "Failed to process captured photo", parseError);
99
+ base.handleNativeError(error);
100
+ }
101
+ };
102
+
103
+ // Camera permission status handler
104
+ const handlePermissionStatus = data => {
105
+ const permissionStatus = typeof data === "string" ? data : data.status || data;
106
+ const newPermission = {
107
+ status: permissionStatus.toLowerCase(),
108
+ canRequest: permissionStatus !== "permanently_denied",
109
+ lastChecked: new Date().toISOString()
110
+ };
111
+ setPermission(newPermission);
112
+ console.log("📷 Camera permission status:", newPermission);
113
+
114
+ // Update data with permission info
115
+ const permissionData = {
116
+ permission: newPermission,
117
+ lastOperation: CAMERA_OPERATIONS.REQUEST_PERMISSION,
118
+ operationSuccess: permissionStatus === "GRANTED",
119
+ timestamp: new Date().toISOString()
120
+ };
121
+ if (permissionStatus === "GRANTED") {
122
+ base.updateProgress({
123
+ phase: CAMERA_PHASES.OPENING_CAMERA,
124
+ message: "Camera permission granted, ready to capture..."
125
+ });
126
+ base.setDataAndComplete(permissionData);
127
+ } else if (permissionStatus === "DENIED") {
128
+ const error = (0, _errors.createStandardError)(_errors.ERROR_CODES.PERMISSION_DENIED, "Camera permission denied", null, "Camera permission is required to take photos");
129
+ base.handleNativeError(error);
130
+ }
131
+ };
132
+
133
+ // Camera error handler
134
+ const handleCameraError = data => {
135
+ console.error("📷 Camera error:", data);
136
+ base.handleNativeError(data);
137
+ };
138
+
139
+ // Register event listeners
140
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_CAMERA_CAPTURE, handleCameraCapture);
141
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.CAMERA_PERMISSION_STATUS, handlePermissionStatus);
142
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_CAMERA_ERROR, handleCameraError);
143
+
144
+ // Cleanup function
145
+ return () => {
146
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_CAMERA_CAPTURE);
147
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.CAMERA_PERMISSION_STATUS);
148
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_CAMERA_ERROR);
149
+ };
150
+ }, [base]);
151
+
152
+ // Main execute function for camera superhook
153
+ const executeCamera = (operation, ...args) => {
154
+ if (base.isWeb) {
155
+ console.warn(`Camera ${operation} requires web fallback implementation (isWeb: true)`);
156
+ return;
157
+ }
158
+ switch (operation) {
159
+ case CAMERA_OPERATIONS.TAKE_PHOTO:
160
+ return handleTakePhoto(args[0] || {});
161
+ case CAMERA_OPERATIONS.REQUEST_PERMISSION:
162
+ return handleRequestPermission();
163
+ case CAMERA_OPERATIONS.CHECK_PERMISSION:
164
+ return handleCheckPermission();
165
+ default:
166
+ const error = (0, _errors.createStandardError)(_errors.ERROR_CODES.INVALID_PARAMETERS, `Unknown camera operation: ${operation}`, null, `Valid operations: ${Object.values(CAMERA_OPERATIONS).join(", ")}`);
167
+ base.handleNativeError(error);
168
+ }
169
+ };
170
+
171
+ // Camera operation handlers
172
+ const handleTakePhoto = (cameraOptions = {}) => {
173
+ base.executeOperation(() => {
174
+ base.updateProgress({
175
+ phase: CAMERA_PHASES.REQUESTING_PERMISSION,
176
+ message: "Requesting camera permission..."
177
+ });
178
+ _NativeBridge.default.camera.open(cameraOptions);
179
+ console.log("📷 Camera open requested with options:", cameraOptions);
180
+ }, "photo capture");
181
+ };
182
+ const handleRequestPermission = () => {
183
+ base.executeOperation(() => {
184
+ base.updateProgress({
185
+ phase: CAMERA_PHASES.REQUESTING_PERMISSION,
186
+ message: "Requesting camera permission..."
187
+ });
188
+ if (_NativeBridge.default.camera.requestPermission) {
189
+ _NativeBridge.default.camera.requestPermission();
190
+ } else {
191
+ // Fallback method
192
+ _NativeBridge.default.camera.checkPermission();
193
+ }
194
+ console.log("📷 Camera permission requested");
195
+ }, "permission request");
196
+ };
197
+ const handleCheckPermission = () => {
198
+ base.executeOperation(() => {
199
+ base.updateProgress({
200
+ phase: CAMERA_PHASES.CHECKING_PERMISSION,
201
+ message: "Checking camera permission..."
202
+ });
203
+ _NativeBridge.default.camera.checkPermission();
204
+ console.log("📷 Camera permission check requested");
205
+ }, "permission check");
206
+ };
207
+
208
+ // Return standardized superhook interface
209
+ return {
210
+ // Standard interface (from useBaseHook)
211
+ data: base.data,
212
+ loading: base.loading,
213
+ progress: base.progress,
214
+ error: base.error,
215
+ isWeb: base.isWeb,
216
+ isNative: base.isNative,
217
+ clear: base.clear,
218
+ clearError: base.clearError,
219
+ // Main execute function
220
+ execute: executeCamera,
221
+ // Semantic aliases for execute
222
+ takePhoto: options => executeCamera(CAMERA_OPERATIONS.TAKE_PHOTO, options),
223
+ requestPermission: () => executeCamera(CAMERA_OPERATIONS.REQUEST_PERMISSION),
224
+ checkPermission: () => executeCamera(CAMERA_OPERATIONS.CHECK_PERMISSION),
225
+ // Current state info
226
+ permission: permission,
227
+ // Legacy compatibility
228
+ photo: base.data,
229
+ clearPhoto: base.clear
230
+ };
231
+ };
232
+
233
+ /**
31
234
  * Standardized File Picker Hook
32
235
  * Provides consistent interface with error standardization and environment detection
33
236
  *
34
237
  * @param {Object} options - Configuration options
35
238
  * @returns {Object} Standardized file picker interface
36
- */exports.useCamera=useCamera;const useFilePicker=(options={})=>{const base=(0,_useBaseHook.useBaseHook)("useFilePicker",options);// Cache for converted File objects to prevent redundant conversions
37
- const fileObjectCache=(0,_react.useRef)(null);// File picker specific progress phases
38
- const FILE_PICKER_PHASES={OPENING:"opening",PROCESSING:"processing",ROUTING:"routing",COMPLETE:"complete"};(0,_react.useEffect)(()=>{// Server-side rendering safety
39
- if(typeof window==="undefined")return;if(!window.WebBridge){console.warn("WebBridge not initialized. File picker functionality unavailable.");return;}// File picked success handler
40
- const handleFilePicked=data=>{try{const result=typeof data==="string"?JSON.parse(data):data;console.log("📁 File picked result:",result);base.updateProgress({phase:FILE_PICKER_PHASES.PROCESSING,message:"Processing selected file..."});// Handle tri-transport format
41
- const fileData={fileSrc:result.fileSrc,fileName:result.fileName,size:result.size,mimeType:result.mimeType,transport:result.transport,filePath:result.filePath};// Clear file object cache when new file is picked
42
- fileObjectCache.current=null;base.setDataAndComplete(fileData);console.log("📁 File processed successfully via transport:",fileData.transport);}catch(parseError){console.error("📁 Error parsing file picker data:",parseError);const error=(0,_errors.createStandardError)(_errors.ERROR_CODES.INTERNAL_ERROR,"Failed to process selected file",parseError);base.handleNativeError(error);}};// File pick error handler
43
- const handleFilePickError=data=>{console.error("📁 File pick error:",data);base.handleNativeError(data);};// File pick cancelled handler
44
- const handleFilePickCancelled=data=>{console.log("📁 File pick cancelled:",data);const error=(0,_errors.createStandardError)(_errors.ERROR_CODES.OPERATION_CANCELLED,"File selection was cancelled",data);base.handleNativeError(error);};// File picker state updates
45
- const handleFilePickStateUpdate=data=>{try{const stateData=typeof data==="string"?JSON.parse(data):data;console.log("📁 File picker state:",stateData.state);let phase=FILE_PICKER_PHASES.PROCESSING;let message="Processing...";switch(stateData.state){case"opening":phase=FILE_PICKER_PHASES.OPENING;message="Opening file picker...";break;case"processing":phase=FILE_PICKER_PHASES.PROCESSING;message="Processing selected file...";break;case"routing":phase=FILE_PICKER_PHASES.ROUTING;message="Determining transport method...";break;default:message=stateData.state;}base.updateProgress({phase,message});}catch(parseError){console.error("📁 Error parsing file picker state:",parseError);}};// Register event listeners
46
- window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_FILE_PICKED,handleFilePicked);window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_FILE_PICK_ERROR,handleFilePickError);window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_FILE_PICK_CANCELLED,handleFilePickCancelled);window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_FILE_PICK_STATE_UPDATE,handleFilePickStateUpdate);// Cleanup function
47
- return()=>{window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_FILE_PICKED);window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_FILE_PICK_ERROR);window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_FILE_PICK_CANCELLED);window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_FILE_PICK_STATE_UPDATE);};},[base]);// Pick file function
48
- const pickFile=(mimeType=null)=>{base.executeOperation(()=>{const finalMimeType=mimeType||"*/*";base.updateProgress({phase:FILE_PICKER_PHASES.OPENING,message:`Opening file picker${mimeType?` for ${mimeType}`:""}...`});_NativeBridge.default.file.pick(finalMimeType);console.log("📁 File picker opened with MIME type:",finalMimeType);},"file selection");};/**
49
- * Get File object from current file data
50
- * Lazy loading - only converts when called
51
- * Caches result to prevent redundant conversions
52
- * @returns {Promise<File>} JavaScript File object for FormData/POST API
53
- * @throws {Error} If file data is unavailable or transport is unsupported
54
- */const getFileObject=(0,_react.useCallback)(async()=>{// Validate file data exists
55
- if(!base.data){throw new Error("No file data available. Please pick a file first.");}// Return cached File object if available
56
- if(fileObjectCache.current){console.log("📁 Returning cached File object");return fileObjectCache.current;}const{fileSrc,fileName,mimeType,transport}=base.data;// Check if transport supports File object creation
57
- if(!(0,_FileObjectConverter.canCreateFileObject)(transport)){const errorMessage=(0,_FileObjectConverter.getUnsupportedTransportMessage)(transport);console.error("❌",errorMessage);throw new Error(errorMessage);}console.log("📁 Converting to File object",{transport,fileName,mimeType});try{let fileObject;if(transport==="BRIDGE_BASE64"){// Synchronous conversion for base64
58
- fileObject=(0,_FileObjectConverter.base64ToFile)(fileSrc,fileName,mimeType);}else if(transport==="FRAMEWORK_SERVER"){// Asynchronous fetch and conversion for URL
59
- fileObject=await(0,_FileObjectConverter.urlToFile)(fileSrc,fileName,mimeType);}// Cache the result
60
- fileObjectCache.current=fileObject;console.log("✅ File object created successfully",{name:fileObject.name,size:fileObject.size,type:fileObject.type});return fileObject;}catch(error){console.error("❌ Failed to create File object:",error);throw new Error(`Failed to create File object: ${error.message}`);}},[base.data]);// Check if File object can be created from current file data
61
- const canCreateFileObjectForCurrentFile=base.data?(0,_FileObjectConverter.canCreateFileObject)(base.data.transport):false;// Return standardized interface
62
- return{// Standard interface
63
- data:base.data,loading:base.loading,progress:base.progress,error:base.error,isWeb:base.isWeb,isNative:base.isNative,// Actions
64
- execute:pickFile,// Standard execute function
65
- pickFile,// Semantic alias
66
- clear:base.clear,clearError:base.clearError,// File object conversion (NEW)
67
- getFileObject,// Lazy loading File object converter
68
- canCreateFileObject:canCreateFileObjectForCurrentFile,// Boolean flag
69
- // Legacy compatibility (for gradual migration)
70
- selectedFile:base.data,// Legacy alias
71
- isLoading:base.loading,// Legacy alias
72
- processingState:base.progress?.phase,// Legacy alias
73
- clearFile:base.clear// Legacy alias
74
- };};/**
239
+ */
240
+ exports.useCamera = useCamera;
241
+ const useFilePicker = (options = {}) => {
242
+ const base = (0, _useBaseHook.useBaseHook)("useFilePicker", options);
243
+
244
+ // Cache for converted File objects to prevent redundant conversions
245
+ const fileObjectCache = (0, _react.useRef)(null);
246
+
247
+ // File picker specific progress phases
248
+ const FILE_PICKER_PHASES = {
249
+ OPENING: "opening",
250
+ PROCESSING: "processing",
251
+ ROUTING: "routing",
252
+ COMPLETE: "complete"
253
+ };
254
+ (0, _react.useEffect)(() => {
255
+ // Server-side rendering safety
256
+ if (typeof window === "undefined") return;
257
+ if (!window.WebBridge) {
258
+ console.warn("WebBridge not initialized. File picker functionality unavailable.");
259
+ return;
260
+ }
261
+
262
+ // File picked success handler
263
+ const handleFilePicked = data => {
264
+ try {
265
+ const result = typeof data === "string" ? JSON.parse(data) : data;
266
+ console.log("📁 File picked result:", result);
267
+ base.updateProgress({
268
+ phase: FILE_PICKER_PHASES.PROCESSING,
269
+ message: "Processing selected file..."
270
+ });
271
+
272
+ // Handle tri-transport format
273
+ const fileData = {
274
+ fileSrc: result.fileSrc,
275
+ fileName: result.fileName,
276
+ size: result.size,
277
+ mimeType: result.mimeType,
278
+ transport: result.transport,
279
+ filePath: result.filePath
280
+ };
281
+
282
+ // Clear file object cache when new file is picked
283
+ fileObjectCache.current = null;
284
+ base.setDataAndComplete(fileData);
285
+ console.log("📁 File processed successfully via transport:", fileData.transport);
286
+ } catch (parseError) {
287
+ console.error("📁 Error parsing file picker data:", parseError);
288
+ const error = (0, _errors.createStandardError)(_errors.ERROR_CODES.INTERNAL_ERROR, "Failed to process selected file", parseError);
289
+ base.handleNativeError(error);
290
+ }
291
+ };
292
+
293
+ // File pick error handler
294
+ const handleFilePickError = data => {
295
+ console.error("📁 File pick error:", data);
296
+ base.handleNativeError(data);
297
+ };
298
+
299
+ // File pick cancelled handler
300
+ const handleFilePickCancelled = data => {
301
+ console.log("📁 File pick cancelled:", data);
302
+ const error = (0, _errors.createStandardError)(_errors.ERROR_CODES.OPERATION_CANCELLED, "File selection was cancelled", data);
303
+ base.handleNativeError(error);
304
+ };
305
+
306
+ // File picker state updates
307
+ const handleFilePickStateUpdate = data => {
308
+ try {
309
+ const stateData = typeof data === "string" ? JSON.parse(data) : data;
310
+ console.log("📁 File picker state:", stateData.state);
311
+ let phase = FILE_PICKER_PHASES.PROCESSING;
312
+ let message = "Processing...";
313
+ switch (stateData.state) {
314
+ case "opening":
315
+ phase = FILE_PICKER_PHASES.OPENING;
316
+ message = "Opening file picker...";
317
+ break;
318
+ case "processing":
319
+ phase = FILE_PICKER_PHASES.PROCESSING;
320
+ message = "Processing selected file...";
321
+ break;
322
+ case "routing":
323
+ phase = FILE_PICKER_PHASES.ROUTING;
324
+ message = "Determining transport method...";
325
+ break;
326
+ default:
327
+ message = stateData.state;
328
+ }
329
+ base.updateProgress({
330
+ phase,
331
+ message
332
+ });
333
+ } catch (parseError) {
334
+ console.error("📁 Error parsing file picker state:", parseError);
335
+ }
336
+ };
337
+
338
+ // Register event listeners
339
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_FILE_PICKED, handleFilePicked);
340
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_FILE_PICK_ERROR, handleFilePickError);
341
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_FILE_PICK_CANCELLED, handleFilePickCancelled);
342
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_FILE_PICK_STATE_UPDATE, handleFilePickStateUpdate);
343
+
344
+ // Cleanup function
345
+ return () => {
346
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_FILE_PICKED);
347
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_FILE_PICK_ERROR);
348
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_FILE_PICK_CANCELLED);
349
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_FILE_PICK_STATE_UPDATE);
350
+ };
351
+ }, [base]);
352
+
353
+ // Pick file function
354
+ const pickFile = (mimeType = null) => {
355
+ base.executeOperation(() => {
356
+ const finalMimeType = mimeType || "*/*";
357
+ base.updateProgress({
358
+ phase: FILE_PICKER_PHASES.OPENING,
359
+ message: `Opening file picker${mimeType ? ` for ${mimeType}` : ""}...`
360
+ });
361
+ _NativeBridge.default.file.pick(finalMimeType);
362
+ console.log("📁 File picker opened with MIME type:", finalMimeType);
363
+ }, "file selection");
364
+ };
365
+
366
+ /**
367
+ * Get File object from current file data
368
+ * Lazy loading - only converts when called
369
+ * Caches result to prevent redundant conversions
370
+ * @returns {Promise<File>} JavaScript File object for FormData/POST API
371
+ * @throws {Error} If file data is unavailable or transport is unsupported
372
+ */
373
+ const getFileObject = (0, _react.useCallback)(async () => {
374
+ // Validate file data exists
375
+ if (!base.data) {
376
+ throw new Error("No file data available. Please pick a file first.");
377
+ }
378
+
379
+ // Return cached File object if available
380
+ if (fileObjectCache.current) {
381
+ console.log("📁 Returning cached File object");
382
+ return fileObjectCache.current;
383
+ }
384
+ const {
385
+ fileSrc,
386
+ fileName,
387
+ mimeType,
388
+ transport
389
+ } = base.data;
390
+
391
+ // Check if transport supports File object creation
392
+ if (!(0, _FileObjectConverter.canCreateFileObject)(transport)) {
393
+ const errorMessage = (0, _FileObjectConverter.getUnsupportedTransportMessage)(transport);
394
+ console.error("❌", errorMessage);
395
+ throw new Error(errorMessage);
396
+ }
397
+ console.log("📁 Converting to File object", {
398
+ transport,
399
+ fileName,
400
+ mimeType
401
+ });
402
+ try {
403
+ let fileObject;
404
+ if (transport === "BRIDGE_BASE64") {
405
+ // Synchronous conversion for base64
406
+ fileObject = (0, _FileObjectConverter.base64ToFile)(fileSrc, fileName, mimeType);
407
+ } else if (transport === "FRAMEWORK_SERVER") {
408
+ // Asynchronous fetch and conversion for URL
409
+ fileObject = await (0, _FileObjectConverter.urlToFile)(fileSrc, fileName, mimeType);
410
+ }
411
+
412
+ // Cache the result
413
+ fileObjectCache.current = fileObject;
414
+ console.log("✅ File object created successfully", {
415
+ name: fileObject.name,
416
+ size: fileObject.size,
417
+ type: fileObject.type
418
+ });
419
+ return fileObject;
420
+ } catch (error) {
421
+ console.error("❌ Failed to create File object:", error);
422
+ throw new Error(`Failed to create File object: ${error.message}`);
423
+ }
424
+ }, [base.data]);
425
+
426
+ // Check if File object can be created from current file data
427
+ const canCreateFileObjectForCurrentFile = base.data ? (0, _FileObjectConverter.canCreateFileObject)(base.data.transport) : false;
428
+
429
+ // Return standardized interface
430
+ return {
431
+ // Standard interface
432
+ data: base.data,
433
+ loading: base.loading,
434
+ progress: base.progress,
435
+ error: base.error,
436
+ isWeb: base.isWeb,
437
+ isNative: base.isNative,
438
+ // Actions
439
+ execute: pickFile,
440
+ // Standard execute function
441
+ pickFile,
442
+ // Semantic alias
443
+ clear: base.clear,
444
+ clearError: base.clearError,
445
+ // File object conversion (NEW)
446
+ getFileObject,
447
+ // Lazy loading File object converter
448
+ canCreateFileObject: canCreateFileObjectForCurrentFile,
449
+ // Boolean flag
450
+
451
+ // Legacy compatibility (for gradual migration)
452
+ selectedFile: base.data,
453
+ // Legacy alias
454
+ isLoading: base.loading,
455
+ // Legacy alias
456
+ processingState: base.progress?.phase,
457
+ // Legacy alias
458
+ clearFile: base.clear // Legacy alias
459
+ };
460
+ };
461
+
462
+ /**
75
463
  * Standardized Intent Hook
76
464
  * Provides consistent interface with error standardization and environment detection
77
465
  *
78
466
  * @param {Object} options - Configuration options
79
467
  * @returns {Object} Standardized intent interface
80
- */exports.useFilePicker=useFilePicker;const useIntent=(options={})=>{const base=(0,_useBaseHook.useBaseHook)("useIntent",options);// Intent specific progress phases
81
- const INTENT_PHASES={PREPARING:"preparing",DOWNLOADING:"downloading",OPENING:"opening",COMPLETE:"complete"};(0,_react.useEffect)(()=>{// Server-side rendering safety
82
- if(typeof window==="undefined")return;if(!window.WebBridge){console.warn("WebBridge not initialized. Intent functionality unavailable.");return;}// Intent success handler
83
- const handleIntentSuccess=data=>{try{const result=typeof data==="string"?JSON.parse(data):data;console.log("🔗 Intent success result:",result);const intentData={url:result.url,mimeType:result.mimeType,success:result.success||true,message:result.message||"File opened successfully"};base.setDataAndComplete(intentData);console.log("🔗 Intent completed successfully");}catch(parseError){console.error("🔗 Error parsing intent result:",parseError);const error=(0,_errors.createStandardError)(_errors.ERROR_CODES.INTERNAL_ERROR,"Failed to process intent result",parseError);base.handleNativeError(error);}};// Intent error handler
84
- const handleIntentError=data=>{console.error("🔗 Intent error:",data);base.handleNativeError(data);};// Intent state updates (if available)
85
- const handleIntentStateUpdate=data=>{try{const stateData=typeof data==="string"?JSON.parse(data):data;console.log("🔗 Intent state:",stateData.state);let phase=INTENT_PHASES.PREPARING;let message="Processing...";switch(stateData.state){case"preparing":phase=INTENT_PHASES.PREPARING;message="Preparing to open file...";break;case"downloading":phase=INTENT_PHASES.DOWNLOADING;message="Downloading file...";break;case"opening":phase=INTENT_PHASES.OPENING;message="Opening with external app...";break;default:message=stateData.state;}base.updateProgress({phase,message,percentage:stateData.percentage||null});}catch(parseError){console.error("🔗 Error parsing intent state:",parseError);}};// Register event listeners (some callbacks might not exist in legacy intent)
86
- window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_INTENT_SUCCESS||"ON_INTENT_SUCCESS",handleIntentSuccess);window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_INTENT_ERROR||"ON_INTENT_ERROR",handleIntentError);// Optional state updates (might not be implemented in current intent system)
87
- if(_NativeInterfaces.NATIVE_CALLBACKS.ON_INTENT_STATE_UPDATE){window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_INTENT_STATE_UPDATE,handleIntentStateUpdate);}// Cleanup function
88
- return()=>{window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_INTENT_SUCCESS||"ON_INTENT_SUCCESS");window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_INTENT_ERROR||"ON_INTENT_ERROR");if(_NativeInterfaces.NATIVE_CALLBACKS.ON_INTENT_STATE_UPDATE){window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_INTENT_STATE_UPDATE);}};},[base]);// Open file function
89
- const openFile=(url,mimeType=null)=>{if(!url){const error=(0,_errors.createStandardError)(_errors.ERROR_CODES.INVALID_PARAMETERS,"URL is required for opening files",null,"Please provide a valid URL to open");base.handleNativeError(error);return;}base.executeOperation(()=>{const finalMimeType=mimeType||"*/*";base.updateProgress({phase:INTENT_PHASES.PREPARING,message:`Preparing to open ${url}...`});// Check if intent system has specific methods
90
- if(_NativeBridge.default.intent&&_NativeBridge.default.intent.openFile){_NativeBridge.default.intent.openFile(url,finalMimeType);}else{// Fallback to generic method if available
91
- _NativeBridge.default.openFile(url,finalMimeType);}console.log("🔗 Intent to open file:",url,"with MIME type:",finalMimeType);},"file opening");};// Return standardized interface
92
- return{// Standard interface
93
- data:base.data,loading:base.loading,progress:base.progress,error:base.error,isWeb:base.isWeb,isNative:base.isNative,// Actions
94
- execute:openFile,// Standard execute function
95
- openFile,// Semantic alias
96
- clear:base.clear,clearError:base.clearError,// Legacy compatibility (for gradual migration)
97
- result:base.data// Legacy alias if needed
98
- };};exports.useIntent=useIntent;
468
+ */
469
+ exports.useFilePicker = useFilePicker;
470
+ const useIntent = (options = {}) => {
471
+ const base = (0, _useBaseHook.useBaseHook)("useIntent", options);
472
+
473
+ // Intent specific progress phases
474
+ const INTENT_PHASES = {
475
+ PREPARING: "preparing",
476
+ DOWNLOADING: "downloading",
477
+ OPENING: "opening",
478
+ COMPLETE: "complete"
479
+ };
480
+ (0, _react.useEffect)(() => {
481
+ // Server-side rendering safety
482
+ if (typeof window === "undefined") return;
483
+ if (!window.WebBridge) {
484
+ console.warn("WebBridge not initialized. Intent functionality unavailable.");
485
+ return;
486
+ }
487
+
488
+ // Intent success handler
489
+ const handleIntentSuccess = data => {
490
+ try {
491
+ const result = typeof data === "string" ? JSON.parse(data) : data;
492
+ console.log("🔗 Intent success result:", result);
493
+ const intentData = {
494
+ url: result.url,
495
+ mimeType: result.mimeType,
496
+ success: result.success || true,
497
+ message: result.message || "File opened successfully"
498
+ };
499
+ base.setDataAndComplete(intentData);
500
+ console.log("🔗 Intent completed successfully");
501
+ } catch (parseError) {
502
+ console.error("🔗 Error parsing intent result:", parseError);
503
+ const error = (0, _errors.createStandardError)(_errors.ERROR_CODES.INTERNAL_ERROR, "Failed to process intent result", parseError);
504
+ base.handleNativeError(error);
505
+ }
506
+ };
507
+
508
+ // Intent error handler
509
+ const handleIntentError = data => {
510
+ console.error("🔗 Intent error:", data);
511
+ base.handleNativeError(data);
512
+ };
513
+
514
+ // Intent state updates (if available)
515
+ const handleIntentStateUpdate = data => {
516
+ try {
517
+ const stateData = typeof data === "string" ? JSON.parse(data) : data;
518
+ console.log("🔗 Intent state:", stateData.state);
519
+ let phase = INTENT_PHASES.PREPARING;
520
+ let message = "Processing...";
521
+ switch (stateData.state) {
522
+ case "preparing":
523
+ phase = INTENT_PHASES.PREPARING;
524
+ message = "Preparing to open file...";
525
+ break;
526
+ case "downloading":
527
+ phase = INTENT_PHASES.DOWNLOADING;
528
+ message = "Downloading file...";
529
+ break;
530
+ case "opening":
531
+ phase = INTENT_PHASES.OPENING;
532
+ message = "Opening with external app...";
533
+ break;
534
+ default:
535
+ message = stateData.state;
536
+ }
537
+ base.updateProgress({
538
+ phase,
539
+ message,
540
+ percentage: stateData.percentage || null
541
+ });
542
+ } catch (parseError) {
543
+ console.error("🔗 Error parsing intent state:", parseError);
544
+ }
545
+ };
546
+
547
+ // Register event listeners (some callbacks might not exist in legacy intent)
548
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_INTENT_SUCCESS || "ON_INTENT_SUCCESS", handleIntentSuccess);
549
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_INTENT_ERROR || "ON_INTENT_ERROR", handleIntentError);
550
+
551
+ // Optional state updates (might not be implemented in current intent system)
552
+ if (_NativeInterfaces.NATIVE_CALLBACKS.ON_INTENT_STATE_UPDATE) {
553
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_INTENT_STATE_UPDATE, handleIntentStateUpdate);
554
+ }
555
+
556
+ // Cleanup function
557
+ return () => {
558
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_INTENT_SUCCESS || "ON_INTENT_SUCCESS");
559
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_INTENT_ERROR || "ON_INTENT_ERROR");
560
+ if (_NativeInterfaces.NATIVE_CALLBACKS.ON_INTENT_STATE_UPDATE) {
561
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_INTENT_STATE_UPDATE);
562
+ }
563
+ };
564
+ }, [base]);
565
+
566
+ // Open file function
567
+ const openFile = (url, mimeType = null) => {
568
+ if (!url) {
569
+ const error = (0, _errors.createStandardError)(_errors.ERROR_CODES.INVALID_PARAMETERS, "URL is required for opening files", null, "Please provide a valid URL to open");
570
+ base.handleNativeError(error);
571
+ return;
572
+ }
573
+ base.executeOperation(() => {
574
+ const finalMimeType = mimeType || "*/*";
575
+ base.updateProgress({
576
+ phase: INTENT_PHASES.PREPARING,
577
+ message: `Preparing to open ${url}...`
578
+ });
579
+
580
+ // Check if intent system has specific methods
581
+ if (_NativeBridge.default.intent && _NativeBridge.default.intent.openFile) {
582
+ _NativeBridge.default.intent.openFile(url, finalMimeType);
583
+ } else {
584
+ // Fallback to generic method if available
585
+ _NativeBridge.default.openFile(url, finalMimeType);
586
+ }
587
+ console.log("🔗 Intent to open file:", url, "with MIME type:", finalMimeType);
588
+ }, "file opening");
589
+ };
590
+
591
+ // Return standardized interface
592
+ return {
593
+ // Standard interface
594
+ data: base.data,
595
+ loading: base.loading,
596
+ progress: base.progress,
597
+ error: base.error,
598
+ isWeb: base.isWeb,
599
+ isNative: base.isNative,
600
+ // Actions
601
+ execute: openFile,
602
+ // Standard execute function
603
+ openFile,
604
+ // Semantic alias
605
+ clear: base.clear,
606
+ clearError: base.clearError,
607
+ // Legacy compatibility (for gradual migration)
608
+ result: base.data // Legacy alias if needed
609
+ };
610
+ };
611
+ exports.useIntent = useIntent;