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,2 +1,318 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useNotificationPermission=exports.useNotification=exports.requestNotificationPermission=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 */// Shared callback system — allows hook + requestNotificationPermission to share one WebBridge listener
2
- const permissionStatusListeners=new Set();let isPermissionCallbackRegistered=false;const registerPermissionStatusListener=callback=>{permissionStatusListeners.add(callback);if(!isPermissionCallbackRegistered&&typeof window!=="undefined"&&window.WebBridge){isPermissionCallbackRegistered=true;window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.NOTIFICATION_PERMISSION_STATUS,data=>{permissionStatusListeners.forEach(listener=>{try{listener(data);}catch(error){console.error("Error in permission status listener:",error);}});});}return()=>{permissionStatusListeners.delete(callback);};};const unregisterPermissionStatusListener=callback=>{permissionStatusListeners.delete(callback);};const requestNotificationPermission=()=>{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=>{unregisterPermissionStatusListener(handlePermissionStatus);if(data===_NativeInterfaces.PERMISSION_STATUS.GRANTED){resolve(data);}else{reject(new Error(`Notification permission ${data.toLowerCase()}`));}};registerPermissionStatusListener(handlePermissionStatus);_NativeBridge.default.notification.requestPermission();}catch(error){reject(error);}});};exports.requestNotificationPermission=requestNotificationPermission;const useNotificationPermission=()=>{if(typeof window==="undefined"){return{permission:null,isLoading:false};}if(!window.WebBridge){throw new Error("WebBridge is not initialized. Call WebBridge.init() first.");}const[permission,setPermission]=(0,_react.useState)(null);const[isLoading,setIsLoading]=(0,_react.useState)(true);(0,_react.useEffect)(()=>{const requestPermission=async()=>{try{if(!_NativeBridge.default.isAvailable()){setPermission(_NativeInterfaces.PERMISSION_STATUS.NOT_DETERMINED);setIsLoading(false);return;}window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.NOTIFICATION_PERMISSION_STATUS,data=>{setPermission(data);setIsLoading(false);console.log("🔔 Notification permission status updated:",data);});_NativeBridge.default.notification.requestPermission();}catch(error){console.error("🔔 Error requesting notification permission:",error);setPermission(_NativeInterfaces.PERMISSION_STATUS.DENIED);setIsLoading(false);}};requestPermission();return()=>{window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.NOTIFICATION_PERMISSION_STATUS);};},[]);return{permission,isLoading};};exports.useNotificationPermission=useNotificationPermission;const useNotification=()=>{const base=(0,_useBaseHook.useBaseHook)("useNotification");const[permissionStatus,setPermissionStatus]=(0,_react.useState)(null);const[pushToken,setPushToken]=(0,_react.useState)(null);const[badges,setBadges]=(0,_react.useState)(0);const[lastNotification,setLastNotification]=(0,_react.useState)(null);const[subscribedTopics,setSubscribedTopics]=(0,_react.useState)([]);if(typeof window==="undefined"){return{data:null,loading:false,error:null,execute:()=>{},scheduleLocal:()=>{},cancelLocal:()=>{},registerForPush:()=>{},updateBadge:()=>{},subscribeToTopic:()=>{},unsubscribeFromTopic:()=>{},getSubscribedTopics:()=>{},permissionStatus:null,pushToken:null,badges:0,subscribedTopics:[]};}if(!window.WebBridge){throw new Error("WebBridge is not initialized. Call WebBridge.init() first.");}(0,_react.useEffect)(()=>{const unregister=registerPermissionStatusListener(data=>{setPermissionStatus(data);});if(_NativeBridge.default.isAvailable()){try{if(_NativeBridge.default.isAndroid&&window.NativeBridge?.checkNotificationPermissionStatus){window.NativeBridge.checkNotificationPermissionStatus(null);}else if(_NativeBridge.default.isIOS&&window.webkit?.messageHandlers?.NativeBridge){window.webkit.messageHandlers.NativeBridge.postMessage({command:"checkNotificationPermissionStatus",data:null});}}catch(error){console.error("🔔 Error checking notification permission status:",error);}}window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.LOCAL_NOTIFICATION_SCHEDULED,data=>{try{const result=typeof data==="string"?JSON.parse(data):data;if(result?.success===false||result?.error){base.handleNativeError(result.error||result);return;}base.setDataAndComplete(result);}catch(error){base.handleNativeError(error);}});window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.LOCAL_NOTIFICATION_CANCELLED,data=>{try{const result=typeof data==="string"?JSON.parse(data):data;if(result?.success===false||result?.error){base.handleNativeError(result.error||result);return;}base.setDataAndComplete(result);}catch(error){base.handleNativeError(error);}});window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.PUSH_NOTIFICATION_TOKEN,data=>{try{const result=typeof data==="string"?JSON.parse(data):data;if(result?.error){base.handleNativeError(result.error);return;}setPushToken(result.token);base.setDataAndComplete(result);}catch(error){base.handleNativeError(error);}});window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.NOTIFICATION_RECEIVED,data=>{const notification=typeof data==="string"?JSON.parse(data):data;setLastNotification(notification);});window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.NOTIFICATION_TAPPED,data=>{try{const result=typeof data==="string"?JSON.parse(data):data;base.setDataAndComplete(result);}catch(error){base.handleNativeError(error);}});window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.NOTIFICATION_ACTION_PERFORMED,data=>{const action=typeof data==="string"?JSON.parse(data):data;base.setDataAndComplete(action);});window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.TOPIC_SUBSCRIPTION_RESULT,data=>{try{const result=typeof data==="string"?JSON.parse(data):data;if(result?.error){base.handleNativeError(result.error);return;}if(result?.success===false){base.handleNativeError(result);return;}base.setDataAndComplete(result);}catch(error){base.handleNativeError(error);}});window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.SUBSCRIBED_TOPICS_RESULT,data=>{try{const result=typeof data==="string"?JSON.parse(data):data;if(result?.error){base.handleNativeError(result.error);return;}if(result?.success===false){base.handleNativeError(result);return;}setSubscribedTopics(result.topics||[]);base.setDataAndComplete(result);}catch(error){base.handleNativeError(error);}});return()=>{unregister();window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.LOCAL_NOTIFICATION_SCHEDULED);window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.LOCAL_NOTIFICATION_CANCELLED);window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.PUSH_NOTIFICATION_TOKEN);window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.NOTIFICATION_RECEIVED);window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.NOTIFICATION_TAPPED);window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.NOTIFICATION_ACTION_PERFORMED);window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.TOPIC_SUBSCRIPTION_RESULT);window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.SUBSCRIBED_TOPICS_RESULT);};},[]);const requestPermission=()=>{requestNotificationPermission().catch(err=>base.handleNativeError(err));};const scheduleLocal=config=>{base.executeOperation(()=>{_NativeBridge.default.notification.scheduleLocal(config);},"schedule local notification");};const cancelLocal=notificationId=>{base.executeOperation(()=>{_NativeBridge.default.notification.cancelLocal(notificationId);},"cancel notification");};const registerForPush=()=>{base.executeOperation(()=>{_NativeBridge.default.notification.registerForPush();},"register for push");};const updateBadge=count=>{base.callNative(()=>_NativeBridge.default.notification.updateBadge(count));setBadges(count);};const subscribeToTopic=topic=>{base.executeOperation(()=>{_NativeBridge.default.notification.subscribeToTopic(topic);},"subscribe to topic");};const unsubscribeFromTopic=topic=>{base.executeOperation(()=>{_NativeBridge.default.notification.unsubscribeFromTopic(topic);},"unsubscribe from topic");};const getSubscribedTopics=()=>{base.executeOperation(()=>{_NativeBridge.default.notification.getSubscribedTopics();},"get subscribed topics");};return{data:base.data,loading:base.loading,progress:base.progress,error:base.error,execute:scheduleLocal,clear:base.clear,clearError:base.clearError,isNative:base.isNative,isWeb:base.isWeb,permissionStatus,pushToken,badges,lastNotification,subscribedTopics,scheduleLocal,cancelLocal,registerForPush,updateBadge,subscribeToTopic,unsubscribeFromTopic,getSubscribedTopics,schedule:scheduleLocal,requestPermission};};exports.useNotification=useNotification;
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useNotificationPermission = exports.useNotification = exports.requestNotificationPermission = 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
+ // Shared callback system — allows hook + requestNotificationPermission to share one WebBridge listener
15
+ const permissionStatusListeners = new Set();
16
+ let isPermissionCallbackRegistered = false;
17
+ const registerPermissionStatusListener = callback => {
18
+ permissionStatusListeners.add(callback);
19
+ if (!isPermissionCallbackRegistered && typeof window !== "undefined" && window.WebBridge) {
20
+ isPermissionCallbackRegistered = true;
21
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.NOTIFICATION_PERMISSION_STATUS, data => {
22
+ permissionStatusListeners.forEach(listener => {
23
+ try {
24
+ listener(data);
25
+ } catch (error) {
26
+ console.error("Error in permission status listener:", error);
27
+ }
28
+ });
29
+ });
30
+ }
31
+ return () => {
32
+ permissionStatusListeners.delete(callback);
33
+ };
34
+ };
35
+ const unregisterPermissionStatusListener = callback => {
36
+ permissionStatusListeners.delete(callback);
37
+ };
38
+ const requestNotificationPermission = () => {
39
+ if (typeof window === "undefined") {
40
+ return Promise.resolve(null);
41
+ }
42
+ if (!window.WebBridge) {
43
+ throw new Error("WebBridge is not initialized. Call WebBridge.init() first.");
44
+ }
45
+ return new Promise((resolve, reject) => {
46
+ try {
47
+ if (!_NativeBridge.default.isAvailable()) {
48
+ reject(new Error("Native bridge not available"));
49
+ return;
50
+ }
51
+ const handlePermissionStatus = data => {
52
+ unregisterPermissionStatusListener(handlePermissionStatus);
53
+ if (data === _NativeInterfaces.PERMISSION_STATUS.GRANTED) {
54
+ resolve(data);
55
+ } else {
56
+ reject(new Error(`Notification permission ${data.toLowerCase()}`));
57
+ }
58
+ };
59
+ registerPermissionStatusListener(handlePermissionStatus);
60
+ _NativeBridge.default.notification.requestPermission();
61
+ } catch (error) {
62
+ reject(error);
63
+ }
64
+ });
65
+ };
66
+ exports.requestNotificationPermission = requestNotificationPermission;
67
+ const useNotificationPermission = () => {
68
+ if (typeof window === "undefined") {
69
+ return {
70
+ permission: null,
71
+ isLoading: false
72
+ };
73
+ }
74
+ if (!window.WebBridge) {
75
+ throw new Error("WebBridge is not initialized. Call WebBridge.init() first.");
76
+ }
77
+ const [permission, setPermission] = (0, _react.useState)(null);
78
+ const [isLoading, setIsLoading] = (0, _react.useState)(true);
79
+ (0, _react.useEffect)(() => {
80
+ const requestPermission = async () => {
81
+ try {
82
+ if (!_NativeBridge.default.isAvailable()) {
83
+ setPermission(_NativeInterfaces.PERMISSION_STATUS.NOT_DETERMINED);
84
+ setIsLoading(false);
85
+ return;
86
+ }
87
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.NOTIFICATION_PERMISSION_STATUS, data => {
88
+ setPermission(data);
89
+ setIsLoading(false);
90
+ console.log("🔔 Notification permission status updated:", data);
91
+ });
92
+ _NativeBridge.default.notification.requestPermission();
93
+ } catch (error) {
94
+ console.error("🔔 Error requesting notification permission:", error);
95
+ setPermission(_NativeInterfaces.PERMISSION_STATUS.DENIED);
96
+ setIsLoading(false);
97
+ }
98
+ };
99
+ requestPermission();
100
+ return () => {
101
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.NOTIFICATION_PERMISSION_STATUS);
102
+ };
103
+ }, []);
104
+ return {
105
+ permission,
106
+ isLoading
107
+ };
108
+ };
109
+ exports.useNotificationPermission = useNotificationPermission;
110
+ const useNotification = () => {
111
+ const base = (0, _useBaseHook.useBaseHook)("useNotification");
112
+ const [permissionStatus, setPermissionStatus] = (0, _react.useState)(null);
113
+ const [pushToken, setPushToken] = (0, _react.useState)(null);
114
+ const [badges, setBadges] = (0, _react.useState)(0);
115
+ const [lastNotification, setLastNotification] = (0, _react.useState)(null);
116
+ const [subscribedTopics, setSubscribedTopics] = (0, _react.useState)([]);
117
+ if (typeof window === "undefined") {
118
+ return {
119
+ data: null,
120
+ loading: false,
121
+ error: null,
122
+ execute: () => {},
123
+ scheduleLocal: () => {},
124
+ cancelLocal: () => {},
125
+ registerForPush: () => {},
126
+ updateBadge: () => {},
127
+ subscribeToTopic: () => {},
128
+ unsubscribeFromTopic: () => {},
129
+ getSubscribedTopics: () => {},
130
+ permissionStatus: null,
131
+ pushToken: null,
132
+ badges: 0,
133
+ subscribedTopics: []
134
+ };
135
+ }
136
+ if (!window.WebBridge) {
137
+ throw new Error("WebBridge is not initialized. Call WebBridge.init() first.");
138
+ }
139
+ (0, _react.useEffect)(() => {
140
+ const unregister = registerPermissionStatusListener(data => {
141
+ setPermissionStatus(data);
142
+ });
143
+ if (_NativeBridge.default.isAvailable()) {
144
+ try {
145
+ if (_NativeBridge.default.isAndroid && window.NativeBridge?.checkNotificationPermissionStatus) {
146
+ window.NativeBridge.checkNotificationPermissionStatus(null);
147
+ } else if (_NativeBridge.default.isIOS && window.webkit?.messageHandlers?.NativeBridge) {
148
+ window.webkit.messageHandlers.NativeBridge.postMessage({
149
+ command: "checkNotificationPermissionStatus",
150
+ data: null
151
+ });
152
+ }
153
+ } catch (error) {
154
+ console.error("🔔 Error checking notification permission status:", error);
155
+ }
156
+ }
157
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.LOCAL_NOTIFICATION_SCHEDULED, data => {
158
+ try {
159
+ const result = typeof data === "string" ? JSON.parse(data) : data;
160
+ if (result?.success === false || result?.error) {
161
+ base.handleNativeError(result.error || result);
162
+ return;
163
+ }
164
+ base.setDataAndComplete(result);
165
+ } catch (error) {
166
+ base.handleNativeError(error);
167
+ }
168
+ });
169
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.LOCAL_NOTIFICATION_CANCELLED, data => {
170
+ try {
171
+ const result = typeof data === "string" ? JSON.parse(data) : data;
172
+ if (result?.success === false || result?.error) {
173
+ base.handleNativeError(result.error || result);
174
+ return;
175
+ }
176
+ base.setDataAndComplete(result);
177
+ } catch (error) {
178
+ base.handleNativeError(error);
179
+ }
180
+ });
181
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.PUSH_NOTIFICATION_TOKEN, data => {
182
+ try {
183
+ const result = typeof data === "string" ? JSON.parse(data) : data;
184
+ if (result?.error) {
185
+ base.handleNativeError(result.error);
186
+ return;
187
+ }
188
+ setPushToken(result.token);
189
+ base.setDataAndComplete(result);
190
+ } catch (error) {
191
+ base.handleNativeError(error);
192
+ }
193
+ });
194
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.NOTIFICATION_RECEIVED, data => {
195
+ const notification = typeof data === "string" ? JSON.parse(data) : data;
196
+ setLastNotification(notification);
197
+ });
198
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.NOTIFICATION_TAPPED, data => {
199
+ try {
200
+ const result = typeof data === "string" ? JSON.parse(data) : data;
201
+ base.setDataAndComplete(result);
202
+ } catch (error) {
203
+ base.handleNativeError(error);
204
+ }
205
+ });
206
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.NOTIFICATION_ACTION_PERFORMED, data => {
207
+ const action = typeof data === "string" ? JSON.parse(data) : data;
208
+ base.setDataAndComplete(action);
209
+ });
210
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.TOPIC_SUBSCRIPTION_RESULT, data => {
211
+ try {
212
+ const result = typeof data === "string" ? JSON.parse(data) : data;
213
+ if (result?.error) {
214
+ base.handleNativeError(result.error);
215
+ return;
216
+ }
217
+ if (result?.success === false) {
218
+ base.handleNativeError(result);
219
+ return;
220
+ }
221
+ base.setDataAndComplete(result);
222
+ } catch (error) {
223
+ base.handleNativeError(error);
224
+ }
225
+ });
226
+ window.WebBridge.register(_NativeInterfaces.NATIVE_CALLBACKS.SUBSCRIBED_TOPICS_RESULT, data => {
227
+ try {
228
+ const result = typeof data === "string" ? JSON.parse(data) : data;
229
+ if (result?.error) {
230
+ base.handleNativeError(result.error);
231
+ return;
232
+ }
233
+ if (result?.success === false) {
234
+ base.handleNativeError(result);
235
+ return;
236
+ }
237
+ setSubscribedTopics(result.topics || []);
238
+ base.setDataAndComplete(result);
239
+ } catch (error) {
240
+ base.handleNativeError(error);
241
+ }
242
+ });
243
+ return () => {
244
+ unregister();
245
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.LOCAL_NOTIFICATION_SCHEDULED);
246
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.LOCAL_NOTIFICATION_CANCELLED);
247
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.PUSH_NOTIFICATION_TOKEN);
248
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.NOTIFICATION_RECEIVED);
249
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.NOTIFICATION_TAPPED);
250
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.NOTIFICATION_ACTION_PERFORMED);
251
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.TOPIC_SUBSCRIPTION_RESULT);
252
+ window.WebBridge.unregister(_NativeInterfaces.NATIVE_CALLBACKS.SUBSCRIBED_TOPICS_RESULT);
253
+ };
254
+ }, []);
255
+ const requestPermission = () => {
256
+ requestNotificationPermission().catch(err => base.handleNativeError(err));
257
+ };
258
+ const scheduleLocal = config => {
259
+ base.executeOperation(() => {
260
+ _NativeBridge.default.notification.scheduleLocal(config);
261
+ }, "schedule local notification");
262
+ };
263
+ const cancelLocal = notificationId => {
264
+ base.executeOperation(() => {
265
+ _NativeBridge.default.notification.cancelLocal(notificationId);
266
+ }, "cancel notification");
267
+ };
268
+ const registerForPush = () => {
269
+ base.executeOperation(() => {
270
+ _NativeBridge.default.notification.registerForPush();
271
+ }, "register for push");
272
+ };
273
+ const updateBadge = count => {
274
+ base.callNative(() => _NativeBridge.default.notification.updateBadge(count));
275
+ setBadges(count);
276
+ };
277
+ const subscribeToTopic = topic => {
278
+ base.executeOperation(() => {
279
+ _NativeBridge.default.notification.subscribeToTopic(topic);
280
+ }, "subscribe to topic");
281
+ };
282
+ const unsubscribeFromTopic = topic => {
283
+ base.executeOperation(() => {
284
+ _NativeBridge.default.notification.unsubscribeFromTopic(topic);
285
+ }, "unsubscribe from topic");
286
+ };
287
+ const getSubscribedTopics = () => {
288
+ base.executeOperation(() => {
289
+ _NativeBridge.default.notification.getSubscribedTopics();
290
+ }, "get subscribed topics");
291
+ };
292
+ return {
293
+ data: base.data,
294
+ loading: base.loading,
295
+ progress: base.progress,
296
+ error: base.error,
297
+ execute: scheduleLocal,
298
+ clear: base.clear,
299
+ clearError: base.clearError,
300
+ isNative: base.isNative,
301
+ isWeb: base.isWeb,
302
+ permissionStatus,
303
+ pushToken,
304
+ badges,
305
+ lastNotification,
306
+ subscribedTopics,
307
+ scheduleLocal,
308
+ cancelLocal,
309
+ registerForPush,
310
+ updateBadge,
311
+ subscribeToTopic,
312
+ unsubscribeFromTopic,
313
+ getSubscribedTopics,
314
+ schedule: scheduleLocal,
315
+ requestPermission
316
+ };
317
+ };
318
+ exports.useNotification = useNotification;
@@ -1,2 +1,84 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useSafeArea=void 0;var _react=require("react");var _NativeBridge=_interopRequireDefault(require("../utils/NativeBridge.js"));var _safeArea=require("../safeArea.js");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e};}/* eslint-disable react-compiler/react-compiler, react-hooks/exhaustive-deps */const useSafeArea=({webFallback}={})=>{const fromGlobal=(0,_safeArea.getSafeAreaFromGlobal)();const initialValue=fromGlobal||{..._safeArea.DEFAULT_INSETS};const[insets,setInsets]=(0,_react.useState)(()=>initialValue);const isNative=_NativeBridge.default.isAvailable();const[webFallbackState,setWebFallback]=(0,_react.useState)(true);const webFallbackResolved=webFallback!==undefined?webFallback!==false:webFallbackState;const webFallbackActive=!isNative&&webFallbackResolved;const webFallbackDisabled=!isNative&&!webFallbackResolved;(0,_react.useEffect)(()=>{if(typeof window==="undefined")return;if(!_NativeBridge.default.isAvailable()){if(webFallbackDisabled)return;// Web fallback: read CSS env() safe area insets (Safari notch support)
2
- const readCSSInsets=()=>{const style=getComputedStyle(document.documentElement);const read=prop=>{const val=style.getPropertyValue(prop).trim();return val?parseFloat(val)||0:0;};const webInsets={top:read("--sat")||read("env(safe-area-inset-top)"),right:read("--sar")||read("env(safe-area-inset-right)"),bottom:read("--sab")||read("env(safe-area-inset-bottom)"),left:read("--sal")||read("env(safe-area-inset-left)")};setInsets(webInsets);(0,_safeArea.setSafeAreaGlobal)(webInsets);};const id=setTimeout(readCSSInsets,0);return()=>clearTimeout(id);}if(!window.WebBridge)return;const handleInsetsUpdate=data=>{try{const parsed=typeof data==="string"?JSON.parse(data):data;const normalized={top:Number(parsed.top)||0,right:Number(parsed.right)||0,bottom:Number(parsed.bottom)||0,left:Number(parsed.left)||0};setInsets(normalized);(0,_safeArea.setSafeAreaGlobal)(normalized);}catch(error){console.error("Error parsing safe area insets:",error);setInsets({..._safeArea.DEFAULT_INSETS});}};window.WebBridge.register("ON_SAFE_AREA_INSETS_UPDATED",handleInsetsUpdate);_NativeBridge.default.safeArea.get();return()=>{window.WebBridge.unregister("ON_SAFE_AREA_INSETS_UPDATED");};},[webFallbackDisabled]);return{...insets,isNative,isWeb:!isNative,webFallbackActive,webFallbackDisabled,setWebFallback};};exports.useSafeArea=useSafeArea;
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useSafeArea = void 0;
7
+ var _react = require("react");
8
+ var _NativeBridge = _interopRequireDefault(require("../utils/NativeBridge.js"));
9
+ var _safeArea = require("../safeArea.js");
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ /* eslint-disable react-compiler/react-compiler, react-hooks/exhaustive-deps */
12
+
13
+ const useSafeArea = ({
14
+ webFallback
15
+ } = {}) => {
16
+ const fromGlobal = (0, _safeArea.getSafeAreaFromGlobal)();
17
+ const initialValue = fromGlobal || {
18
+ ..._safeArea.DEFAULT_INSETS
19
+ };
20
+ const [insets, setInsets] = (0, _react.useState)(() => initialValue);
21
+ const isNative = _NativeBridge.default.isAvailable();
22
+ const [webFallbackState, setWebFallback] = (0, _react.useState)(true);
23
+ const webFallbackResolved = webFallback !== undefined ? webFallback !== false : webFallbackState;
24
+ const webFallbackActive = !isNative && webFallbackResolved;
25
+ const webFallbackDisabled = !isNative && !webFallbackResolved;
26
+ (0, _react.useEffect)(() => {
27
+ if (typeof window === "undefined") return;
28
+ if (!_NativeBridge.default.isAvailable()) {
29
+ if (webFallbackDisabled) return;
30
+
31
+ // Web fallback: read CSS env() safe area insets (Safari notch support)
32
+ const readCSSInsets = () => {
33
+ const style = getComputedStyle(document.documentElement);
34
+ const read = prop => {
35
+ const val = style.getPropertyValue(prop).trim();
36
+ return val ? parseFloat(val) || 0 : 0;
37
+ };
38
+ const webInsets = {
39
+ top: read("--sat") || read("env(safe-area-inset-top)"),
40
+ right: read("--sar") || read("env(safe-area-inset-right)"),
41
+ bottom: read("--sab") || read("env(safe-area-inset-bottom)"),
42
+ left: read("--sal") || read("env(safe-area-inset-left)")
43
+ };
44
+ setInsets(webInsets);
45
+ (0, _safeArea.setSafeAreaGlobal)(webInsets);
46
+ };
47
+ const id = setTimeout(readCSSInsets, 0);
48
+ return () => clearTimeout(id);
49
+ }
50
+ if (!window.WebBridge) return;
51
+ const handleInsetsUpdate = data => {
52
+ try {
53
+ const parsed = typeof data === "string" ? JSON.parse(data) : data;
54
+ const normalized = {
55
+ top: Number(parsed.top) || 0,
56
+ right: Number(parsed.right) || 0,
57
+ bottom: Number(parsed.bottom) || 0,
58
+ left: Number(parsed.left) || 0
59
+ };
60
+ setInsets(normalized);
61
+ (0, _safeArea.setSafeAreaGlobal)(normalized);
62
+ } catch (error) {
63
+ console.error("Error parsing safe area insets:", error);
64
+ setInsets({
65
+ ..._safeArea.DEFAULT_INSETS
66
+ });
67
+ }
68
+ };
69
+ window.WebBridge.register("ON_SAFE_AREA_INSETS_UPDATED", handleInsetsUpdate);
70
+ _NativeBridge.default.safeArea.get();
71
+ return () => {
72
+ window.WebBridge.unregister("ON_SAFE_AREA_INSETS_UPDATED");
73
+ };
74
+ }, [webFallbackDisabled]);
75
+ return {
76
+ ...insets,
77
+ isNative,
78
+ isWeb: !isNative,
79
+ webFallbackActive,
80
+ webFallbackDisabled,
81
+ setWebFallback
82
+ };
83
+ };
84
+ exports.useSafeArea = useSafeArea;