@formo/analytics-react-native 0.1.0

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 (247) hide show
  1. package/README.md +302 -0
  2. package/lib/commonjs/FormoAnalytics.js +526 -0
  3. package/lib/commonjs/FormoAnalytics.js.map +1 -0
  4. package/lib/commonjs/FormoAnalyticsProvider.js +265 -0
  5. package/lib/commonjs/FormoAnalyticsProvider.js.map +1 -0
  6. package/lib/commonjs/constants/config.js +69 -0
  7. package/lib/commonjs/constants/config.js.map +1 -0
  8. package/lib/commonjs/constants/events.js +30 -0
  9. package/lib/commonjs/constants/events.js.map +1 -0
  10. package/lib/commonjs/constants/index.js +39 -0
  11. package/lib/commonjs/constants/index.js.map +1 -0
  12. package/lib/commonjs/constants/storage.js +23 -0
  13. package/lib/commonjs/constants/storage.js.map +1 -0
  14. package/lib/commonjs/index.js +65 -0
  15. package/lib/commonjs/index.js.map +1 -0
  16. package/lib/commonjs/lib/consent/index.js +56 -0
  17. package/lib/commonjs/lib/consent/index.js.map +1 -0
  18. package/lib/commonjs/lib/event/EventFactory.js +493 -0
  19. package/lib/commonjs/lib/event/EventFactory.js.map +1 -0
  20. package/lib/commonjs/lib/event/EventManager.js +46 -0
  21. package/lib/commonjs/lib/event/EventManager.js.map +1 -0
  22. package/lib/commonjs/lib/event/EventQueue.js +290 -0
  23. package/lib/commonjs/lib/event/EventQueue.js.map +1 -0
  24. package/lib/commonjs/lib/event/index.js +50 -0
  25. package/lib/commonjs/lib/event/index.js.map +1 -0
  26. package/lib/commonjs/lib/event/types.js +6 -0
  27. package/lib/commonjs/lib/event/types.js.map +1 -0
  28. package/lib/commonjs/lib/lifecycle/index.js +196 -0
  29. package/lib/commonjs/lib/lifecycle/index.js.map +1 -0
  30. package/lib/commonjs/lib/logger/index.js +48 -0
  31. package/lib/commonjs/lib/logger/index.js.map +1 -0
  32. package/lib/commonjs/lib/session/index.js +109 -0
  33. package/lib/commonjs/lib/session/index.js.map +1 -0
  34. package/lib/commonjs/lib/storage/AsyncStorageAdapter.js +164 -0
  35. package/lib/commonjs/lib/storage/AsyncStorageAdapter.js.map +1 -0
  36. package/lib/commonjs/lib/storage/MemoryStorage.js +41 -0
  37. package/lib/commonjs/lib/storage/MemoryStorage.js.map +1 -0
  38. package/lib/commonjs/lib/storage/StorageBlueprint.js +24 -0
  39. package/lib/commonjs/lib/storage/StorageBlueprint.js.map +1 -0
  40. package/lib/commonjs/lib/storage/StorageManager.js +126 -0
  41. package/lib/commonjs/lib/storage/StorageManager.js.map +1 -0
  42. package/lib/commonjs/lib/storage/index.js +49 -0
  43. package/lib/commonjs/lib/storage/index.js.map +1 -0
  44. package/lib/commonjs/lib/storage/types.js +2 -0
  45. package/lib/commonjs/lib/storage/types.js.map +1 -0
  46. package/lib/commonjs/lib/wagmi/WagmiEventHandler.js +445 -0
  47. package/lib/commonjs/lib/wagmi/WagmiEventHandler.js.map +1 -0
  48. package/lib/commonjs/lib/wagmi/index.js +28 -0
  49. package/lib/commonjs/lib/wagmi/index.js.map +1 -0
  50. package/lib/commonjs/lib/wagmi/types.js +2 -0
  51. package/lib/commonjs/lib/wagmi/types.js.map +1 -0
  52. package/lib/commonjs/types/base.js +6 -0
  53. package/lib/commonjs/types/base.js.map +1 -0
  54. package/lib/commonjs/types/events.js +22 -0
  55. package/lib/commonjs/types/events.js.map +1 -0
  56. package/lib/commonjs/types/index.js +28 -0
  57. package/lib/commonjs/types/index.js.map +1 -0
  58. package/lib/commonjs/utils/address.js +82 -0
  59. package/lib/commonjs/utils/address.js.map +1 -0
  60. package/lib/commonjs/utils/hash.js +30 -0
  61. package/lib/commonjs/utils/hash.js.map +1 -0
  62. package/lib/commonjs/utils/helpers.js +116 -0
  63. package/lib/commonjs/utils/helpers.js.map +1 -0
  64. package/lib/commonjs/utils/index.js +61 -0
  65. package/lib/commonjs/utils/index.js.map +1 -0
  66. package/lib/commonjs/utils/timestamp.js +34 -0
  67. package/lib/commonjs/utils/timestamp.js.map +1 -0
  68. package/lib/commonjs/utils/trafficSource.js +147 -0
  69. package/lib/commonjs/utils/trafficSource.js.map +1 -0
  70. package/lib/commonjs/version.js +10 -0
  71. package/lib/commonjs/version.js.map +1 -0
  72. package/lib/module/FormoAnalytics.js +519 -0
  73. package/lib/module/FormoAnalytics.js.map +1 -0
  74. package/lib/module/FormoAnalyticsProvider.js +256 -0
  75. package/lib/module/FormoAnalyticsProvider.js.map +1 -0
  76. package/lib/module/constants/config.js +62 -0
  77. package/lib/module/constants/config.js.map +1 -0
  78. package/lib/module/constants/events.js +24 -0
  79. package/lib/module/constants/events.js.map +1 -0
  80. package/lib/module/constants/index.js +4 -0
  81. package/lib/module/constants/index.js.map +1 -0
  82. package/lib/module/constants/storage.js +17 -0
  83. package/lib/module/constants/storage.js.map +1 -0
  84. package/lib/module/index.js +51 -0
  85. package/lib/module/index.js.map +1 -0
  86. package/lib/module/lib/consent/index.js +49 -0
  87. package/lib/module/lib/consent/index.js.map +1 -0
  88. package/lib/module/lib/event/EventFactory.js +488 -0
  89. package/lib/module/lib/event/EventFactory.js.map +1 -0
  90. package/lib/module/lib/event/EventManager.js +41 -0
  91. package/lib/module/lib/event/EventManager.js.map +1 -0
  92. package/lib/module/lib/event/EventQueue.js +283 -0
  93. package/lib/module/lib/event/EventQueue.js.map +1 -0
  94. package/lib/module/lib/event/index.js +5 -0
  95. package/lib/module/lib/event/index.js.map +1 -0
  96. package/lib/module/lib/event/types.js +2 -0
  97. package/lib/module/lib/event/types.js.map +1 -0
  98. package/lib/module/lib/lifecycle/index.js +190 -0
  99. package/lib/module/lib/lifecycle/index.js.map +1 -0
  100. package/lib/module/lib/logger/index.js +42 -0
  101. package/lib/module/lib/logger/index.js.map +1 -0
  102. package/lib/module/lib/session/index.js +92 -0
  103. package/lib/module/lib/session/index.js.map +1 -0
  104. package/lib/module/lib/storage/AsyncStorageAdapter.js +158 -0
  105. package/lib/module/lib/storage/AsyncStorageAdapter.js.map +1 -0
  106. package/lib/module/lib/storage/MemoryStorage.js +35 -0
  107. package/lib/module/lib/storage/MemoryStorage.js.map +1 -0
  108. package/lib/module/lib/storage/StorageBlueprint.js +18 -0
  109. package/lib/module/lib/storage/StorageBlueprint.js.map +1 -0
  110. package/lib/module/lib/storage/StorageManager.js +115 -0
  111. package/lib/module/lib/storage/StorageManager.js.map +1 -0
  112. package/lib/module/lib/storage/index.js +5 -0
  113. package/lib/module/lib/storage/index.js.map +1 -0
  114. package/lib/module/lib/storage/types.js +2 -0
  115. package/lib/module/lib/storage/types.js.map +1 -0
  116. package/lib/module/lib/wagmi/WagmiEventHandler.js +439 -0
  117. package/lib/module/lib/wagmi/WagmiEventHandler.js.map +1 -0
  118. package/lib/module/lib/wagmi/index.js +3 -0
  119. package/lib/module/lib/wagmi/index.js.map +1 -0
  120. package/lib/module/lib/wagmi/types.js +2 -0
  121. package/lib/module/lib/wagmi/types.js.map +1 -0
  122. package/lib/module/types/base.js +2 -0
  123. package/lib/module/types/base.js.map +1 -0
  124. package/lib/module/types/events.js +17 -0
  125. package/lib/module/types/events.js.map +1 -0
  126. package/lib/module/types/index.js +3 -0
  127. package/lib/module/types/index.js.map +1 -0
  128. package/lib/module/utils/address.js +74 -0
  129. package/lib/module/utils/address.js.map +1 -0
  130. package/lib/module/utils/hash.js +24 -0
  131. package/lib/module/utils/hash.js.map +1 -0
  132. package/lib/module/utils/helpers.js +105 -0
  133. package/lib/module/utils/helpers.js.map +1 -0
  134. package/lib/module/utils/index.js +6 -0
  135. package/lib/module/utils/index.js.map +1 -0
  136. package/lib/module/utils/timestamp.js +26 -0
  137. package/lib/module/utils/timestamp.js.map +1 -0
  138. package/lib/module/utils/trafficSource.js +137 -0
  139. package/lib/module/utils/trafficSource.js.map +1 -0
  140. package/lib/module/version.js +4 -0
  141. package/lib/module/version.js.map +1 -0
  142. package/lib/typescript/FormoAnalytics.d.ts +163 -0
  143. package/lib/typescript/FormoAnalytics.d.ts.map +1 -0
  144. package/lib/typescript/FormoAnalyticsProvider.d.ts +29 -0
  145. package/lib/typescript/FormoAnalyticsProvider.d.ts.map +1 -0
  146. package/lib/typescript/constants/config.d.ts +8 -0
  147. package/lib/typescript/constants/config.d.ts.map +1 -0
  148. package/lib/typescript/constants/events.d.ts +23 -0
  149. package/lib/typescript/constants/events.d.ts.map +1 -0
  150. package/lib/typescript/constants/index.d.ts +4 -0
  151. package/lib/typescript/constants/index.d.ts.map +1 -0
  152. package/lib/typescript/constants/storage.d.ts +10 -0
  153. package/lib/typescript/constants/storage.d.ts.map +1 -0
  154. package/lib/typescript/index.d.ts +44 -0
  155. package/lib/typescript/index.d.ts.map +1 -0
  156. package/lib/typescript/lib/consent/index.d.ts +13 -0
  157. package/lib/typescript/lib/consent/index.d.ts.map +1 -0
  158. package/lib/typescript/lib/event/EventFactory.d.ts +61 -0
  159. package/lib/typescript/lib/event/EventFactory.d.ts.map +1 -0
  160. package/lib/typescript/lib/event/EventManager.d.ts +17 -0
  161. package/lib/typescript/lib/event/EventManager.d.ts.map +1 -0
  162. package/lib/typescript/lib/event/EventQueue.d.ts +74 -0
  163. package/lib/typescript/lib/event/EventQueue.d.ts.map +1 -0
  164. package/lib/typescript/lib/event/index.d.ts +5 -0
  165. package/lib/typescript/lib/event/index.d.ts.map +1 -0
  166. package/lib/typescript/lib/event/types.d.ts +23 -0
  167. package/lib/typescript/lib/event/types.d.ts.map +1 -0
  168. package/lib/typescript/lib/lifecycle/index.d.ts +46 -0
  169. package/lib/typescript/lib/lifecycle/index.d.ts.map +1 -0
  170. package/lib/typescript/lib/logger/index.d.ts +19 -0
  171. package/lib/typescript/lib/logger/index.d.ts.map +1 -0
  172. package/lib/typescript/lib/session/index.d.ts +41 -0
  173. package/lib/typescript/lib/session/index.d.ts.map +1 -0
  174. package/lib/typescript/lib/storage/AsyncStorageAdapter.d.ts +48 -0
  175. package/lib/typescript/lib/storage/AsyncStorageAdapter.d.ts.map +1 -0
  176. package/lib/typescript/lib/storage/MemoryStorage.d.ts +18 -0
  177. package/lib/typescript/lib/storage/MemoryStorage.d.ts.map +1 -0
  178. package/lib/typescript/lib/storage/StorageBlueprint.d.ts +21 -0
  179. package/lib/typescript/lib/storage/StorageBlueprint.d.ts.map +1 -0
  180. package/lib/typescript/lib/storage/StorageManager.d.ts +45 -0
  181. package/lib/typescript/lib/storage/StorageManager.d.ts.map +1 -0
  182. package/lib/typescript/lib/storage/index.d.ts +5 -0
  183. package/lib/typescript/lib/storage/index.d.ts.map +1 -0
  184. package/lib/typescript/lib/storage/types.d.ts +22 -0
  185. package/lib/typescript/lib/storage/types.d.ts.map +1 -0
  186. package/lib/typescript/lib/wagmi/WagmiEventHandler.d.ts +104 -0
  187. package/lib/typescript/lib/wagmi/WagmiEventHandler.d.ts.map +1 -0
  188. package/lib/typescript/lib/wagmi/index.d.ts +3 -0
  189. package/lib/typescript/lib/wagmi/index.d.ts.map +1 -0
  190. package/lib/typescript/lib/wagmi/types.d.ts +54 -0
  191. package/lib/typescript/lib/wagmi/types.d.ts.map +1 -0
  192. package/lib/typescript/types/base.d.ts +219 -0
  193. package/lib/typescript/types/base.d.ts.map +1 -0
  194. package/lib/typescript/types/events.d.ts +111 -0
  195. package/lib/typescript/types/events.d.ts.map +1 -0
  196. package/lib/typescript/types/index.d.ts +3 -0
  197. package/lib/typescript/types/index.d.ts.map +1 -0
  198. package/lib/typescript/utils/address.d.ts +25 -0
  199. package/lib/typescript/utils/address.d.ts.map +1 -0
  200. package/lib/typescript/utils/hash.d.ts +10 -0
  201. package/lib/typescript/utils/hash.d.ts.map +1 -0
  202. package/lib/typescript/utils/helpers.d.ts +26 -0
  203. package/lib/typescript/utils/helpers.d.ts.map +1 -0
  204. package/lib/typescript/utils/index.d.ts +6 -0
  205. package/lib/typescript/utils/index.d.ts.map +1 -0
  206. package/lib/typescript/utils/timestamp.d.ts +13 -0
  207. package/lib/typescript/utils/timestamp.d.ts.map +1 -0
  208. package/lib/typescript/utils/trafficSource.d.ts +30 -0
  209. package/lib/typescript/utils/trafficSource.d.ts.map +1 -0
  210. package/lib/typescript/version.d.ts +2 -0
  211. package/lib/typescript/version.d.ts.map +1 -0
  212. package/package.json +143 -0
  213. package/src/FormoAnalytics.ts +685 -0
  214. package/src/FormoAnalyticsProvider.tsx +296 -0
  215. package/src/constants/config.ts +62 -0
  216. package/src/constants/events.ts +26 -0
  217. package/src/constants/index.ts +3 -0
  218. package/src/constants/storage.ts +16 -0
  219. package/src/index.ts +55 -0
  220. package/src/lib/consent/index.ts +52 -0
  221. package/src/lib/event/EventFactory.ts +682 -0
  222. package/src/lib/event/EventManager.ts +50 -0
  223. package/src/lib/event/EventQueue.ts +371 -0
  224. package/src/lib/event/index.ts +4 -0
  225. package/src/lib/event/types.ts +107 -0
  226. package/src/lib/lifecycle/index.ts +215 -0
  227. package/src/lib/logger/index.ts +56 -0
  228. package/src/lib/session/index.ts +103 -0
  229. package/src/lib/storage/AsyncStorageAdapter.ts +173 -0
  230. package/src/lib/storage/MemoryStorage.ts +43 -0
  231. package/src/lib/storage/StorageBlueprint.ts +30 -0
  232. package/src/lib/storage/StorageManager.ts +121 -0
  233. package/src/lib/storage/index.ts +4 -0
  234. package/src/lib/storage/types.ts +23 -0
  235. package/src/lib/wagmi/WagmiEventHandler.ts +574 -0
  236. package/src/lib/wagmi/index.ts +2 -0
  237. package/src/lib/wagmi/types.ts +71 -0
  238. package/src/types/base.ts +287 -0
  239. package/src/types/events.ts +140 -0
  240. package/src/types/index.ts +2 -0
  241. package/src/utils/address.ts +84 -0
  242. package/src/utils/hash.ts +23 -0
  243. package/src/utils/helpers.ts +139 -0
  244. package/src/utils/index.ts +5 -0
  245. package/src/utils/timestamp.ts +25 -0
  246. package/src/utils/trafficSource.ts +153 -0
  247. package/src/version.ts +3 -0
@@ -0,0 +1,256 @@
1
+ import React, { createContext, useContext, useEffect, useMemo, useRef, useState } from "react";
2
+ import { FormoAnalytics } from "./FormoAnalytics";
3
+ import { initStorageManager } from "./lib/storage";
4
+ import { logger } from "./lib/logger";
5
+ // Default context with no-op methods
6
+ const defaultContext = {
7
+ chain: () => Promise.resolve(),
8
+ screen: () => Promise.resolve(),
9
+ reset: () => {},
10
+ cleanup: () => Promise.resolve(),
11
+ detect: () => Promise.resolve(),
12
+ connect: () => Promise.resolve(),
13
+ disconnect: () => Promise.resolve(),
14
+ signature: () => Promise.resolve(),
15
+ transaction: () => Promise.resolve(),
16
+ identify: () => Promise.resolve(),
17
+ track: () => Promise.resolve(),
18
+ setTrafficSourceFromUrl: () => {},
19
+ optOutTracking: () => {},
20
+ optInTracking: () => {},
21
+ hasOptedOutTracking: () => false
22
+ };
23
+ export const FormoAnalyticsContext = /*#__PURE__*/createContext(defaultContext);
24
+
25
+ /**
26
+ * Formo Analytics Provider for React Native
27
+ *
28
+ * Wraps your app to provide analytics context
29
+ *
30
+ * @example
31
+ * ```tsx
32
+ * import AsyncStorage from '@react-native-async-storage/async-storage';
33
+ * import { FormoAnalyticsProvider } from '@formo/analytics-react-native';
34
+ *
35
+ * function App() {
36
+ * return (
37
+ * <FormoAnalyticsProvider
38
+ * writeKey="your-write-key"
39
+ * asyncStorage={AsyncStorage}
40
+ * options={{ wagmi: { config, queryClient } }}
41
+ * >
42
+ * <YourApp />
43
+ * </FormoAnalyticsProvider>
44
+ * );
45
+ * }
46
+ * ```
47
+ */
48
+ export const FormoAnalyticsProvider = props => {
49
+ const {
50
+ writeKey,
51
+ disabled = false,
52
+ children
53
+ } = props;
54
+ if (!writeKey) {
55
+ logger.error("FormoAnalyticsProvider: No Write Key provided");
56
+ return /*#__PURE__*/React.createElement(FormoAnalyticsContext.Provider, {
57
+ value: defaultContext
58
+ }, children);
59
+ }
60
+ if (disabled) {
61
+ logger.warn("FormoAnalytics is disabled");
62
+ return /*#__PURE__*/React.createElement(FormoAnalyticsContext.Provider, {
63
+ value: defaultContext
64
+ }, children);
65
+ }
66
+ return /*#__PURE__*/React.createElement(InitializedAnalytics, props);
67
+ };
68
+ const InitializedAnalytics = ({
69
+ writeKey,
70
+ options,
71
+ asyncStorage,
72
+ onReady,
73
+ onError,
74
+ children
75
+ }) => {
76
+ const [sdk, setSdk] = useState(defaultContext);
77
+ const sdkRef = useRef(defaultContext);
78
+ const storageInitKeyRef = useRef(null);
79
+ const cleanupPromiseRef = useRef(Promise.resolve());
80
+ const initializationIdRef = useRef(0);
81
+
82
+ // Only initialize storage manager when writeKey changes, not on every render
83
+ if (storageInitKeyRef.current !== writeKey) {
84
+ initStorageManager(writeKey);
85
+ storageInitKeyRef.current = writeKey;
86
+ }
87
+
88
+ // Store callbacks and options in refs to avoid re-initialization when references change
89
+ // This fixes the issue where inline arrow functions cause repeated SDK init
90
+ const onReadyRef = useRef(onReady);
91
+ const onErrorRef = useRef(onError);
92
+ const optionsRef = useRef(options);
93
+
94
+ // Update refs when values change (without triggering effect)
95
+ useEffect(() => {
96
+ onReadyRef.current = onReady;
97
+ }, [onReady]);
98
+ useEffect(() => {
99
+ onErrorRef.current = onError;
100
+ }, [onError]);
101
+ useEffect(() => {
102
+ optionsRef.current = options;
103
+ }, [options]);
104
+
105
+ // Extract individual option values to avoid reference equality issues with options object
106
+ const tracking = options?.tracking;
107
+ const autocapture = options?.autocapture;
108
+ const apiHost = options?.apiHost;
109
+ const flushAt = options?.flushAt;
110
+ const flushInterval = options?.flushInterval;
111
+ const retryCount = options?.retryCount;
112
+ const maxQueueSize = options?.maxQueueSize;
113
+ const loggerOption = options?.logger;
114
+ const app = options?.app;
115
+ const hasReady = !!options?.ready;
116
+ const wagmiConfig = options?.wagmi?.config;
117
+ const wagmiQueryClient = options?.wagmi?.queryClient;
118
+
119
+ // Create stable key from serializable options
120
+ const optionsKey = useMemo(() => {
121
+ const serializableOptions = {
122
+ tracking,
123
+ autocapture,
124
+ apiHost,
125
+ flushAt,
126
+ flushInterval,
127
+ retryCount,
128
+ maxQueueSize,
129
+ logger: loggerOption,
130
+ app,
131
+ hasReady
132
+ };
133
+ try {
134
+ return JSON.stringify(serializableOptions);
135
+ } catch (error) {
136
+ logger.warn("Failed to serialize options, using timestamp", error);
137
+ return Date.now().toString();
138
+ }
139
+ }, [tracking, autocapture, apiHost, flushAt, flushInterval, retryCount, maxQueueSize, loggerOption, app, hasReady]);
140
+ useEffect(() => {
141
+ // Increment initialization ID to track which initialization is current
142
+ const currentInitId = ++initializationIdRef.current;
143
+ let isCleanedUp = false;
144
+ const initialize = async () => {
145
+ // Wait for any pending cleanup to complete before re-initializing
146
+ // This prevents race conditions between cleanup and init
147
+ await cleanupPromiseRef.current;
148
+
149
+ // Check if this initialization is still current after awaiting cleanup
150
+ if (currentInitId !== initializationIdRef.current || isCleanedUp) {
151
+ logger.debug("Skipping stale initialization");
152
+ return;
153
+ }
154
+
155
+ // Clean up existing SDK and await flush completion
156
+ if (sdkRef.current && sdkRef.current !== defaultContext) {
157
+ logger.log("Cleaning up existing FormoAnalytics SDK instance");
158
+ const cleanup = sdkRef.current.cleanup();
159
+ cleanupPromiseRef.current = cleanup;
160
+ await cleanup;
161
+ sdkRef.current = defaultContext;
162
+ setSdk(defaultContext);
163
+ }
164
+
165
+ // Check again after cleanup
166
+ if (currentInitId !== initializationIdRef.current || isCleanedUp) {
167
+ logger.debug("Skipping stale initialization after cleanup");
168
+ return;
169
+ }
170
+ try {
171
+ // Use optionsRef.current to ensure we have the latest options
172
+ const sdkInstance = await FormoAnalytics.init(writeKey, optionsRef.current, asyncStorage);
173
+
174
+ // Verify this initialization is still current
175
+ if (currentInitId !== initializationIdRef.current || isCleanedUp) {
176
+ logger.log("Initialization superseded, cleaning up new instance");
177
+ await sdkInstance.cleanup();
178
+ return;
179
+ }
180
+ setSdk(sdkInstance);
181
+ sdkRef.current = sdkInstance;
182
+ logger.log("Successfully initialized FormoAnalytics SDK");
183
+
184
+ // Call onReady callback using the ref (stable reference)
185
+ onReadyRef.current?.(sdkInstance);
186
+ } catch (error) {
187
+ if (currentInitId === initializationIdRef.current && !isCleanedUp) {
188
+ logger.error("Failed to initialize FormoAnalytics SDK", error);
189
+ // Call onError callback using the ref (stable reference)
190
+ onErrorRef.current?.(error instanceof Error ? error : new Error(String(error)));
191
+ }
192
+ }
193
+ };
194
+ initialize();
195
+ return () => {
196
+ isCleanedUp = true;
197
+ if (sdkRef.current && sdkRef.current !== defaultContext) {
198
+ logger.log("Cleaning up FormoAnalytics SDK instance");
199
+ // Store cleanup promise so next initialization can await it
200
+ const cleanup = sdkRef.current.cleanup().catch(error => {
201
+ logger.error("Error during SDK cleanup:", error);
202
+ });
203
+ cleanupPromiseRef.current = cleanup;
204
+ sdkRef.current = defaultContext;
205
+ }
206
+ };
207
+ // Note: onReady and onError are NOT in the dependency array
208
+ // They are accessed via refs to prevent re-initialization
209
+ // wagmiConfig and wagmiQueryClient are tracked separately since they're not serializable
210
+ }, [writeKey, optionsKey, asyncStorage, wagmiConfig, wagmiQueryClient]);
211
+ return /*#__PURE__*/React.createElement(FormoAnalyticsContext.Provider, {
212
+ value: sdk
213
+ }, children);
214
+ };
215
+
216
+ /**
217
+ * Hook to access Formo Analytics
218
+ *
219
+ * @example
220
+ * ```tsx
221
+ * import { useFormo } from '@formo/analytics-react-native';
222
+ *
223
+ * function MyScreen() {
224
+ * const formo = useFormo();
225
+ *
226
+ * useEffect(() => {
227
+ * formo.screen('Home');
228
+ * }, []);
229
+ *
230
+ * const handleButtonPress = () => {
231
+ * formo.track('Button Pressed', { buttonName: 'signup' });
232
+ * };
233
+ *
234
+ * return <Button onPress={handleButtonPress}>Sign Up</Button>;
235
+ * }
236
+ * ```
237
+ */
238
+ // Track if the useFormo warning has been logged to avoid console spam
239
+ let hasLoggedUseFormoWarning = false;
240
+ export const useFormo = () => {
241
+ const context = useContext(FormoAnalyticsContext);
242
+
243
+ // Check if SDK has been initialized (context will be defaultContext before init completes)
244
+ // Only log the warning once to avoid flooding the console during async initialization
245
+ if (context === defaultContext && !hasLoggedUseFormoWarning) {
246
+ hasLoggedUseFormoWarning = true;
247
+ logger.warn("useFormo called before SDK initialization complete. " + "Ensure FormoAnalyticsProvider is mounted and writeKey is provided.");
248
+ }
249
+
250
+ // Reset the warning flag when SDK is initialized so it can warn again after a reset
251
+ if (context !== defaultContext) {
252
+ hasLoggedUseFormoWarning = false;
253
+ }
254
+ return context;
255
+ };
256
+ //# sourceMappingURL=FormoAnalyticsProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","createContext","useContext","useEffect","useMemo","useRef","useState","FormoAnalytics","initStorageManager","logger","defaultContext","chain","Promise","resolve","screen","reset","cleanup","detect","connect","disconnect","signature","transaction","identify","track","setTrafficSourceFromUrl","optOutTracking","optInTracking","hasOptedOutTracking","FormoAnalyticsContext","FormoAnalyticsProvider","props","writeKey","disabled","children","error","createElement","Provider","value","warn","InitializedAnalytics","options","asyncStorage","onReady","onError","sdk","setSdk","sdkRef","storageInitKeyRef","cleanupPromiseRef","initializationIdRef","current","onReadyRef","onErrorRef","optionsRef","tracking","autocapture","apiHost","flushAt","flushInterval","retryCount","maxQueueSize","loggerOption","app","hasReady","ready","wagmiConfig","wagmi","config","wagmiQueryClient","queryClient","optionsKey","serializableOptions","JSON","stringify","Date","now","toString","currentInitId","isCleanedUp","initialize","debug","log","sdkInstance","init","Error","String","catch","hasLoggedUseFormoWarning","useFormo","context"],"sourceRoot":"../../src","sources":["FormoAnalyticsProvider.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,62 @@
1
+ export const EVENTS_API_ORIGIN = "https://events.formo.so";
2
+ export const EVENTS_API_HOST = `${EVENTS_API_ORIGIN}/v0/raw_events`;
3
+ export const EVENTS_API_REQUEST_HEADER = writeKey => ({
4
+ "Content-Type": "application/json",
5
+ Authorization: `Bearer ${writeKey}`
6
+ });
7
+
8
+ // Timezone to country mapping
9
+ export const COUNTRY_LIST = {
10
+ // Africa
11
+ "Africa/Abidjan": "CI",
12
+ "Africa/Accra": "GH",
13
+ "Africa/Addis_Ababa": "ET",
14
+ "Africa/Algiers": "DZ",
15
+ "Africa/Cairo": "EG",
16
+ "Africa/Casablanca": "MA",
17
+ "Africa/Johannesburg": "ZA",
18
+ "Africa/Lagos": "NG",
19
+ "Africa/Nairobi": "KE",
20
+ // America
21
+ "America/Anchorage": "US",
22
+ "America/Argentina/Buenos_Aires": "AR",
23
+ "America/Bogota": "CO",
24
+ "America/Chicago": "US",
25
+ "America/Denver": "US",
26
+ "America/Los_Angeles": "US",
27
+ "America/Mexico_City": "MX",
28
+ "America/New_York": "US",
29
+ "America/Phoenix": "US",
30
+ "America/Sao_Paulo": "BR",
31
+ "America/Toronto": "CA",
32
+ "America/Vancouver": "CA",
33
+ // Asia
34
+ "Asia/Bangkok": "TH",
35
+ "Asia/Dubai": "AE",
36
+ "Asia/Ho_Chi_Minh": "VN",
37
+ "Asia/Hong_Kong": "HK",
38
+ "Asia/Jakarta": "ID",
39
+ "Asia/Kolkata": "IN",
40
+ "Asia/Manila": "PH",
41
+ "Asia/Seoul": "KR",
42
+ "Asia/Shanghai": "CN",
43
+ "Asia/Singapore": "SG",
44
+ "Asia/Taipei": "TW",
45
+ "Asia/Tokyo": "JP",
46
+ // Australia
47
+ "Australia/Melbourne": "AU",
48
+ "Australia/Sydney": "AU",
49
+ // Europe
50
+ "Europe/Amsterdam": "NL",
51
+ "Europe/Berlin": "DE",
52
+ "Europe/London": "GB",
53
+ "Europe/Madrid": "ES",
54
+ "Europe/Moscow": "RU",
55
+ "Europe/Paris": "FR",
56
+ "Europe/Rome": "IT",
57
+ "Europe/Zurich": "CH",
58
+ // Pacific
59
+ "Pacific/Auckland": "NZ",
60
+ "Pacific/Honolulu": "US"
61
+ };
62
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["EVENTS_API_ORIGIN","EVENTS_API_HOST","EVENTS_API_REQUEST_HEADER","writeKey","Authorization","COUNTRY_LIST"],"sourceRoot":"../../../src","sources":["constants/config.ts"],"mappings":"AAAA,OAAO,MAAMA,iBAAiB,GAAG,yBAAyB;AAC1D,OAAO,MAAMC,eAAe,GAAG,GAAGD,iBAAiB,gBAAgB;AAEnE,OAAO,MAAME,yBAAyB,GAAIC,QAAgB,KAAM;EAC9D,cAAc,EAAE,kBAAkB;EAClCC,aAAa,EAAE,UAAUD,QAAQ;AACnC,CAAC,CAAC;;AAEF;AACA,OAAO,MAAME,YAAoC,GAAG;EAClD;EACA,gBAAgB,EAAE,IAAI;EACtB,cAAc,EAAE,IAAI;EACpB,oBAAoB,EAAE,IAAI;EAC1B,gBAAgB,EAAE,IAAI;EACtB,cAAc,EAAE,IAAI;EACpB,mBAAmB,EAAE,IAAI;EACzB,qBAAqB,EAAE,IAAI;EAC3B,cAAc,EAAE,IAAI;EACpB,gBAAgB,EAAE,IAAI;EACtB;EACA,mBAAmB,EAAE,IAAI;EACzB,gCAAgC,EAAE,IAAI;EACtC,gBAAgB,EAAE,IAAI;EACtB,iBAAiB,EAAE,IAAI;EACvB,gBAAgB,EAAE,IAAI;EACtB,qBAAqB,EAAE,IAAI;EAC3B,qBAAqB,EAAE,IAAI;EAC3B,kBAAkB,EAAE,IAAI;EACxB,iBAAiB,EAAE,IAAI;EACvB,mBAAmB,EAAE,IAAI;EACzB,iBAAiB,EAAE,IAAI;EACvB,mBAAmB,EAAE,IAAI;EACzB;EACA,cAAc,EAAE,IAAI;EACpB,YAAY,EAAE,IAAI;EAClB,kBAAkB,EAAE,IAAI;EACxB,gBAAgB,EAAE,IAAI;EACtB,cAAc,EAAE,IAAI;EACpB,cAAc,EAAE,IAAI;EACpB,aAAa,EAAE,IAAI;EACnB,YAAY,EAAE,IAAI;EAClB,eAAe,EAAE,IAAI;EACrB,gBAAgB,EAAE,IAAI;EACtB,aAAa,EAAE,IAAI;EACnB,YAAY,EAAE,IAAI;EAClB;EACA,qBAAqB,EAAE,IAAI;EAC3B,kBAAkB,EAAE,IAAI;EACxB;EACA,kBAAkB,EAAE,IAAI;EACxB,eAAe,EAAE,IAAI;EACrB,eAAe,EAAE,IAAI;EACrB,eAAe,EAAE,IAAI;EACrB,eAAe,EAAE,IAAI;EACrB,cAAc,EAAE,IAAI;EACpB,aAAa,EAAE,IAAI;EACnB,eAAe,EAAE,IAAI;EACrB;EACA,kBAAkB,EAAE,IAAI;EACxB,kBAAkB,EAAE;AACtB,CAAC","ignoreList":[]}
@@ -0,0 +1,24 @@
1
+ export let EventType = /*#__PURE__*/function (EventType) {
2
+ EventType["PAGE"] = "page";
3
+ EventType["SCREEN"] = "screen";
4
+ EventType["IDENTIFY"] = "identify";
5
+ EventType["DETECT"] = "detect";
6
+ EventType["CONNECT"] = "connect";
7
+ EventType["DISCONNECT"] = "disconnect";
8
+ EventType["CHAIN"] = "chain";
9
+ EventType["SIGNATURE"] = "signature";
10
+ EventType["TRANSACTION"] = "transaction";
11
+ EventType["TRACK"] = "track";
12
+ return EventType;
13
+ }({});
14
+ export let EventChannel = /*#__PURE__*/function (EventChannel) {
15
+ EventChannel["WEB"] = "web";
16
+ EventChannel["MOBILE"] = "mobile";
17
+ EventChannel["SERVER"] = "server";
18
+ EventChannel["SOURCE"] = "source";
19
+ return EventChannel;
20
+ }({});
21
+ // React Native SDK uses mobile channel
22
+ export const CHANNEL = "mobile";
23
+ export const VERSION = "1";
24
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["EventType","EventChannel","CHANNEL","VERSION"],"sourceRoot":"../../../src","sources":["constants/events.ts"],"mappings":"AAAA,WAAYA,SAAS,0BAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAAA,OAATA,SAAS;AAAA;AAarB,WAAYC,YAAY,0BAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAA,OAAZA,YAAY;AAAA;AAUxB;AACA,OAAO,MAAMC,OAAsB,GAAG,QAAQ;AAC9C,OAAO,MAAMC,OAAO,GAAG,GAAG","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ export * from "./events";
2
+ export * from "./config";
3
+ export * from "./storage";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["constants/index.ts"],"mappings":"AAAA,cAAc,UAAU;AACxB,cAAc,UAAU;AACxB,cAAc,WAAW","ignoreList":[]}
@@ -0,0 +1,17 @@
1
+ // Storage keys for React Native SDK
2
+ export const STORAGE_PREFIX = "formo_rn_";
3
+
4
+ // Local storage keys (persistent)
5
+ export const LOCAL_ANONYMOUS_ID_KEY = "anonymous_id";
6
+ export const LOCAL_APP_VERSION_KEY = "app_version";
7
+ export const LOCAL_APP_BUILD_KEY = "app_build";
8
+
9
+ // Session storage keys (cleared on app restart)
10
+ export const SESSION_USER_ID_KEY = "user_id";
11
+ export const SESSION_TRAFFIC_SOURCE_KEY = "traffic_source";
12
+ export const SESSION_WALLET_DETECTED_KEY = "wallet_detected";
13
+ export const SESSION_WALLET_IDENTIFIED_KEY = "wallet_identified";
14
+
15
+ // Consent keys
16
+ export const CONSENT_OPT_OUT_KEY = "opt_out_tracking";
17
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["STORAGE_PREFIX","LOCAL_ANONYMOUS_ID_KEY","LOCAL_APP_VERSION_KEY","LOCAL_APP_BUILD_KEY","SESSION_USER_ID_KEY","SESSION_TRAFFIC_SOURCE_KEY","SESSION_WALLET_DETECTED_KEY","SESSION_WALLET_IDENTIFIED_KEY","CONSENT_OPT_OUT_KEY"],"sourceRoot":"../../../src","sources":["constants/storage.ts"],"mappings":"AAAA;AACA,OAAO,MAAMA,cAAc,GAAG,WAAW;;AAEzC;AACA,OAAO,MAAMC,sBAAsB,GAAG,cAAc;AACpD,OAAO,MAAMC,qBAAqB,GAAG,aAAa;AAClD,OAAO,MAAMC,mBAAmB,GAAG,WAAW;;AAE9C;AACA,OAAO,MAAMC,mBAAmB,GAAG,SAAS;AAC5C,OAAO,MAAMC,0BAA0B,GAAG,gBAAgB;AAC1D,OAAO,MAAMC,2BAA2B,GAAG,iBAAiB;AAC5D,OAAO,MAAMC,6BAA6B,GAAG,mBAAmB;;AAEhE;AACA,OAAO,MAAMC,mBAAmB,GAAG,kBAAkB","ignoreList":[]}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Formo Analytics SDK for React Native
3
+ *
4
+ * Track wallet events and user analytics in mobile dApps
5
+ *
6
+ * @example
7
+ * ```tsx
8
+ * import AsyncStorage from '@react-native-async-storage/async-storage';
9
+ * import { FormoAnalyticsProvider, useFormo } from '@formo/analytics-react-native';
10
+ *
11
+ * // Wrap your app with the provider
12
+ * function App() {
13
+ * return (
14
+ * <FormoAnalyticsProvider
15
+ * writeKey="your-write-key"
16
+ * asyncStorage={AsyncStorage}
17
+ * options={{
18
+ * wagmi: { config, queryClient },
19
+ * app: { name: 'MyApp', version: '1.0.0' },
20
+ * }}
21
+ * >
22
+ * <YourApp />
23
+ * </FormoAnalyticsProvider>
24
+ * );
25
+ * }
26
+ *
27
+ * // Use the hook in your components
28
+ * function MyScreen() {
29
+ * const formo = useFormo();
30
+ *
31
+ * useEffect(() => {
32
+ * formo.screen('Home');
33
+ * }, []);
34
+ *
35
+ * return <View>...</View>;
36
+ * }
37
+ * ```
38
+ */
39
+
40
+ // Main exports
41
+ export { FormoAnalytics } from "./FormoAnalytics";
42
+ export { FormoAnalyticsProvider, FormoAnalyticsContext, useFormo } from "./FormoAnalyticsProvider";
43
+
44
+ // Types
45
+ export * from "./types";
46
+
47
+ // Event types for manual event tracking
48
+ export { SignatureStatus, TransactionStatus } from "./types/events";
49
+
50
+ // Storage types for custom storage implementations
51
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["FormoAnalytics","FormoAnalyticsProvider","FormoAnalyticsContext","useFormo","SignatureStatus","TransactionStatus"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAASA,cAAc,QAAQ,kBAAkB;AACjD,SACEC,sBAAsB,EACtBC,qBAAqB,EACrBC,QAAQ,QACH,0BAA0B;;AAEjC;AACA,cAAc,SAAS;;AAEvB;AACA,SAASC,eAAe,EAAEC,iBAAiB,QAAQ,gBAAgB;;AAEnE","ignoreList":[]}
@@ -0,0 +1,49 @@
1
+ import { storage } from "../storage";
2
+ import { logger } from "../logger";
3
+
4
+ /**
5
+ * Get consent storage key
6
+ * Note: The storage adapter already prefixes keys with formo_rn_{writeKey}_
7
+ * so we just need a simple consent prefix here
8
+ */
9
+ function getConsentKey(_writeKey, key) {
10
+ return `consent_${key}`;
11
+ }
12
+
13
+ /**
14
+ * Set a consent flag
15
+ */
16
+ export function setConsentFlag(writeKey, key, value) {
17
+ try {
18
+ const consentKey = getConsentKey(writeKey, key);
19
+ storage().set(consentKey, value);
20
+ } catch (error) {
21
+ logger.error("Consent: Failed to set flag", error);
22
+ }
23
+ }
24
+
25
+ /**
26
+ * Get a consent flag
27
+ */
28
+ export function getConsentFlag(writeKey, key) {
29
+ try {
30
+ const consentKey = getConsentKey(writeKey, key);
31
+ return storage().get(consentKey);
32
+ } catch (error) {
33
+ logger.error("Consent: Failed to get flag", error);
34
+ return null;
35
+ }
36
+ }
37
+
38
+ /**
39
+ * Remove a consent flag
40
+ */
41
+ export function removeConsentFlag(writeKey, key) {
42
+ try {
43
+ const consentKey = getConsentKey(writeKey, key);
44
+ storage().remove(consentKey);
45
+ } catch (error) {
46
+ logger.error("Consent: Failed to remove flag", error);
47
+ }
48
+ }
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["storage","logger","getConsentKey","_writeKey","key","setConsentFlag","writeKey","value","consentKey","set","error","getConsentFlag","get","removeConsentFlag","remove"],"sourceRoot":"../../../../src","sources":["lib/consent/index.ts"],"mappings":"AAAA,SAASA,OAAO,QAAQ,YAAY;AACpC,SAASC,MAAM,QAAQ,WAAW;;AAElC;AACA;AACA;AACA;AACA;AACA,SAASC,aAAaA,CAACC,SAAiB,EAAEC,GAAW,EAAU;EAC7D,OAAO,WAAWA,GAAG,EAAE;AACzB;;AAEA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAC5BC,QAAgB,EAChBF,GAAW,EACXG,KAAa,EACP;EACN,IAAI;IACF,MAAMC,UAAU,GAAGN,aAAa,CAACI,QAAQ,EAAEF,GAAG,CAAC;IAC/CJ,OAAO,CAAC,CAAC,CAACS,GAAG,CAACD,UAAU,EAAED,KAAK,CAAC;EAClC,CAAC,CAAC,OAAOG,KAAK,EAAE;IACdT,MAAM,CAACS,KAAK,CAAC,6BAA6B,EAAEA,KAAK,CAAC;EACpD;AACF;;AAEA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAACL,QAAgB,EAAEF,GAAW,EAAiB;EAC3E,IAAI;IACF,MAAMI,UAAU,GAAGN,aAAa,CAACI,QAAQ,EAAEF,GAAG,CAAC;IAC/C,OAAOJ,OAAO,CAAC,CAAC,CAACY,GAAG,CAACJ,UAAU,CAAC;EAClC,CAAC,CAAC,OAAOE,KAAK,EAAE;IACdT,MAAM,CAACS,KAAK,CAAC,6BAA6B,EAAEA,KAAK,CAAC;IAClD,OAAO,IAAI;EACb;AACF;;AAEA;AACA;AACA;AACA,OAAO,SAASG,iBAAiBA,CAACP,QAAgB,EAAEF,GAAW,EAAQ;EACrE,IAAI;IACF,MAAMI,UAAU,GAAGN,aAAa,CAACI,QAAQ,EAAEF,GAAG,CAAC;IAC/CJ,OAAO,CAAC,CAAC,CAACc,MAAM,CAACN,UAAU,CAAC;EAC9B,CAAC,CAAC,OAAOE,KAAK,EAAE;IACdT,MAAM,CAACS,KAAK,CAAC,gCAAgC,EAAEA,KAAK,CAAC;EACvD;AACF","ignoreList":[]}