@formo/analytics 1.11.10 → 1.11.12

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 (82) hide show
  1. package/README.md +1 -1
  2. package/package.json +2 -2
  3. package/src/FormoAnalytics.ts +70 -133
  4. package/src/types/base.ts +1 -1
  5. package/dist/223.index.umd.min.js +0 -125
  6. package/dist/223.index.umd.min.js.map +0 -1
  7. package/dist/cjs/src/FormoAnalytics.d.ts +0 -96
  8. package/dist/cjs/src/FormoAnalytics.d.ts.map +0 -1
  9. package/dist/cjs/src/FormoAnalytics.js +0 -580
  10. package/dist/cjs/src/FormoAnalytics.js.map +0 -1
  11. package/dist/cjs/src/FormoAnalyticsProvider.d.ts +0 -7
  12. package/dist/cjs/src/FormoAnalyticsProvider.d.ts.map +0 -1
  13. package/dist/cjs/src/FormoAnalyticsProvider.js +0 -127
  14. package/dist/cjs/src/FormoAnalyticsProvider.js.map +0 -1
  15. package/dist/cjs/src/constants/config.d.ts +0 -559
  16. package/dist/cjs/src/constants/config.d.ts.map +0 -1
  17. package/dist/cjs/src/constants/config.js +0 -570
  18. package/dist/cjs/src/constants/config.js.map +0 -1
  19. package/dist/cjs/src/constants/events.d.ts +0 -8
  20. package/dist/cjs/src/constants/events.d.ts.map +0 -1
  21. package/dist/cjs/src/constants/events.js +0 -12
  22. package/dist/cjs/src/constants/events.js.map +0 -1
  23. package/dist/cjs/src/constants/index.d.ts +0 -3
  24. package/dist/cjs/src/constants/index.d.ts.map +0 -1
  25. package/dist/cjs/src/constants/index.js +0 -19
  26. package/dist/cjs/src/constants/index.js.map +0 -1
  27. package/dist/cjs/src/index.d.ts +0 -4
  28. package/dist/cjs/src/index.d.ts.map +0 -1
  29. package/dist/cjs/src/index.js.map +0 -1
  30. package/dist/cjs/src/types/base.d.ts +0 -12
  31. package/dist/cjs/src/types/base.d.ts.map +0 -1
  32. package/dist/cjs/src/types/base.js +0 -3
  33. package/dist/cjs/src/types/base.js.map +0 -1
  34. package/dist/cjs/src/types/index.d.ts +0 -3
  35. package/dist/cjs/src/types/index.d.ts.map +0 -1
  36. package/dist/cjs/src/types/index.js +0 -19
  37. package/dist/cjs/src/types/index.js.map +0 -1
  38. package/dist/cjs/src/types/wallet.d.ts +0 -11
  39. package/dist/cjs/src/types/wallet.d.ts.map +0 -1
  40. package/dist/cjs/src/types/wallet.js +0 -3
  41. package/dist/cjs/src/types/wallet.js.map +0 -1
  42. package/dist/cjs/tsconfig.tsbuildinfo +0 -1
  43. package/dist/esm/src/FormoAnalytics.d.ts +0 -96
  44. package/dist/esm/src/FormoAnalytics.d.ts.map +0 -1
  45. package/dist/esm/src/FormoAnalytics.js +0 -574
  46. package/dist/esm/src/FormoAnalytics.js.map +0 -1
  47. package/dist/esm/src/FormoAnalyticsProvider.d.ts +0 -7
  48. package/dist/esm/src/FormoAnalyticsProvider.d.ts.map +0 -1
  49. package/dist/esm/src/FormoAnalyticsProvider.js +0 -122
  50. package/dist/esm/src/FormoAnalyticsProvider.js.map +0 -1
  51. package/dist/esm/src/constants/config.d.ts +0 -559
  52. package/dist/esm/src/constants/config.d.ts.map +0 -1
  53. package/dist/esm/src/constants/config.js +0 -567
  54. package/dist/esm/src/constants/config.js.map +0 -1
  55. package/dist/esm/src/constants/events.d.ts +0 -8
  56. package/dist/esm/src/constants/events.d.ts.map +0 -1
  57. package/dist/esm/src/constants/events.js +0 -9
  58. package/dist/esm/src/constants/events.js.map +0 -1
  59. package/dist/esm/src/constants/index.d.ts +0 -3
  60. package/dist/esm/src/constants/index.d.ts.map +0 -1
  61. package/dist/esm/src/constants/index.js +0 -3
  62. package/dist/esm/src/constants/index.js.map +0 -1
  63. package/dist/esm/src/index.d.ts +0 -4
  64. package/dist/esm/src/index.d.ts.map +0 -1
  65. package/dist/esm/src/index.js +0 -4
  66. package/dist/esm/src/index.js.map +0 -1
  67. package/dist/esm/src/types/base.d.ts +0 -12
  68. package/dist/esm/src/types/base.d.ts.map +0 -1
  69. package/dist/esm/src/types/base.js +0 -2
  70. package/dist/esm/src/types/base.js.map +0 -1
  71. package/dist/esm/src/types/index.d.ts +0 -3
  72. package/dist/esm/src/types/index.d.ts.map +0 -1
  73. package/dist/esm/src/types/index.js +0 -3
  74. package/dist/esm/src/types/index.js.map +0 -1
  75. package/dist/esm/src/types/wallet.d.ts +0 -11
  76. package/dist/esm/src/types/wallet.d.ts.map +0 -1
  77. package/dist/esm/src/types/wallet.js +0 -2
  78. package/dist/esm/src/types/wallet.js.map +0 -1
  79. package/dist/esm/tsconfig.tsbuildinfo +0 -1
  80. package/dist/index.umd.min.js +0 -3
  81. package/dist/index.umd.min.js.LICENSE.txt +0 -31
  82. package/dist/index.umd.min.js.map +0 -1
@@ -1,96 +0,0 @@
1
- import { ChainID, EIP1193Provider, Options } from './types';
2
- interface IFormoAnalytics {
3
- /**
4
- * Initializes the FormoAnalytics instance with the provided API key and project ID.
5
- */
6
- init(apiKey: string, options?: Options): Promise<FormoAnalytics>;
7
- /**
8
- * Tracks page visit events.
9
- */
10
- page(): void;
11
- /**
12
- * Connects to a wallet with the specified chain ID and address.
13
- */
14
- connect(params: {
15
- chainId: ChainID;
16
- address: string;
17
- }): Promise<void>;
18
- /**
19
- * Disconnects the current wallet and clears the session information.
20
- */
21
- disconnect(params?: {
22
- chainId?: ChainID;
23
- address?: string;
24
- }): void;
25
- /**
26
- * Switches the blockchain chain context and optionally logs additional params.
27
- */
28
- chain(params: {
29
- chainId: ChainID;
30
- address?: string;
31
- }): void;
32
- /**
33
- * Tracks a specific event with a name and associated data.
34
- */
35
- track(eventName: string, eventData: Record<string, any>): void;
36
- }
37
- export declare class FormoAnalytics implements IFormoAnalytics {
38
- readonly apiKey: string;
39
- options: Options;
40
- private _provider?;
41
- private _registeredProviderListeners;
42
- private walletAddressSessionKey;
43
- private config;
44
- private sessionIdKey;
45
- private timezoneToCountry;
46
- currentChainId?: string | null;
47
- currentConnectedAddress?: string;
48
- private constructor();
49
- static init(apiKey: string, options?: Options): Promise<FormoAnalytics>;
50
- get provider(): EIP1193Provider | undefined;
51
- private getSessionId;
52
- private getOrigin;
53
- private setSessionCookie;
54
- private generateSessionId;
55
- private getCookieValue;
56
- private trackEvent;
57
- private trackPageHit;
58
- private trackProvider;
59
- private getAndStoreConnectedAddress;
60
- private getCurrentWallet;
61
- private fetchAccounts;
62
- private fetchChainId;
63
- private getCurrentChainId;
64
- private registerAddressChangedListener;
65
- private registerChainChangedListener;
66
- private onAddressChanged;
67
- private onAddressConnected;
68
- private onAddressDisconnected;
69
- private onChainChanged;
70
- /**
71
- * Stores the wallet address in session storage when connected.
72
- * @param address - The wallet address to store.
73
- */
74
- private storeWalletAddress;
75
- /**
76
- * Clears the wallet address from session storage when disconnected.
77
- */
78
- private clearWalletAddress;
79
- init(apiKey: string, options: Options): Promise<FormoAnalytics>;
80
- connect({ chainId, address }: {
81
- chainId: ChainID;
82
- address: string;
83
- }): Promise<void>;
84
- disconnect(params?: {
85
- chainId?: ChainID;
86
- address?: string;
87
- }): Promise<void> | undefined;
88
- chain({ chainId, address }: {
89
- chainId: ChainID;
90
- address?: string;
91
- }): Promise<void>;
92
- page(): void;
93
- track(eventName: string, eventData: any): void;
94
- }
95
- export {};
96
- //# sourceMappingURL=FormoAnalytics.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FormoAnalytics.d.ts","sourceRoot":"","sources":["../../../src/FormoAnalytics.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAE5D,UAAU,eAAe;IACvB;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEjE;;OAEG;IACH,IAAI,IAAI,IAAI,CAAC;IAEb;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtE;;OAEG;IACH,UAAU,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAEnE;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAE5D;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;CAChE;AAID,qBAAa,cAAe,YAAW,eAAe;aAgBlC,MAAM,EAAE,MAAM;IACvB,OAAO,EAAE,OAAO;IAhBzB,OAAO,CAAC,SAAS,CAAC,CAAkB;IACpC,OAAO,CAAC,4BAA4B,CAG7B;IAEP,OAAO,CAAC,uBAAuB,CAAmB;IAClD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,iBAAiB,CAAwC;IAEjE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC,OAAO;WAeM,IAAI,CACf,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,cAAc,CAAC;IAU1B,IAAI,QAAQ,IAAI,eAAe,GAAG,SAAS,CAE1C;IAED,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,cAAc;YAUR,UAAU;IA6DxB,OAAO,CAAC,YAAY;IAoCpB,OAAO,CAAC,aAAa;YA4BP,2BAA2B;YAiB3B,gBAAgB;YA2BhB,aAAa;YA0Bb,YAAY;YAsBZ,iBAAiB;IAgB/B,OAAO,CAAC,8BAA8B;IAYtC,OAAO,CAAC,4BAA4B;YAOtB,gBAAgB;YAWhB,kBAAkB;IAchC,OAAO,CAAC,qBAAqB;YAgBf,cAAc;IA2C5B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;IAK/D,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAiBnE,UAAU,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAkB3D,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAuBlE,IAAI;IAIJ,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG;CAGxC"}
@@ -1,580 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __generator = (this && this.__generator) || function (thisArg, body) {
12
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
13
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
- function verb(n) { return function (v) { return step([n, v]); }; }
15
- function step(op) {
16
- if (f) throw new TypeError("Generator is already executing.");
17
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
- if (y = 0, t) op = [op[0] & 2, t.value];
20
- switch (op[0]) {
21
- case 0: case 1: t = op; break;
22
- case 4: _.label++; return { value: op[1], done: false };
23
- case 5: _.label++; y = op[1]; op = [0]; continue;
24
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
- default:
26
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
- if (t[2]) _.ops.pop();
31
- _.trys.pop(); continue;
32
- }
33
- op = body.call(thisArg, _);
34
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
- }
37
- };
38
- var __importDefault = (this && this.__importDefault) || function (mod) {
39
- return (mod && mod.__esModule) ? mod : { "default": mod };
40
- };
41
- Object.defineProperty(exports, "__esModule", { value: true });
42
- exports.FormoAnalytics = void 0;
43
- var axios_1 = __importDefault(require("axios"));
44
- var constants_1 = require("./constants");
45
- var highlight_run_1 = require("highlight.run");
46
- var FormoAnalytics = /** @class */ (function () {
47
- function FormoAnalytics(apiKey, options) {
48
- if (options === void 0) { options = {}; }
49
- var _a;
50
- this.apiKey = apiKey;
51
- this.options = options;
52
- this._registeredProviderListeners = {};
53
- this.walletAddressSessionKey = 'walletAddress';
54
- this.sessionIdKey = constants_1.SESSION_STORAGE_ID_KEY;
55
- this.timezoneToCountry = constants_1.COUNTRY_LIST;
56
- this.config = {
57
- token: this.apiKey,
58
- };
59
- var provider = (window === null || window === void 0 ? void 0 : window.ethereum) || ((_a = window.web3) === null || _a === void 0 ? void 0 : _a.currentProvider) || (options === null || options === void 0 ? void 0 : options.provider);
60
- if (provider) {
61
- this.trackProvider(provider);
62
- }
63
- }
64
- FormoAnalytics.init = function (apiKey, options) {
65
- return __awaiter(this, void 0, void 0, function () {
66
- var config, instance;
67
- return __generator(this, function (_a) {
68
- config = {
69
- token: apiKey,
70
- };
71
- instance = new FormoAnalytics(apiKey, options);
72
- instance.config = config;
73
- return [2 /*return*/, instance];
74
- });
75
- });
76
- };
77
- Object.defineProperty(FormoAnalytics.prototype, "provider", {
78
- get: function () {
79
- return this._provider;
80
- },
81
- enumerable: false,
82
- configurable: true
83
- });
84
- FormoAnalytics.prototype.getSessionId = function () {
85
- var existingSessionId = this.getCookieValue(this.sessionIdKey);
86
- if (existingSessionId) {
87
- return existingSessionId;
88
- }
89
- var newSessionId = this.generateSessionId();
90
- return newSessionId;
91
- };
92
- FormoAnalytics.prototype.getOrigin = function () {
93
- return window.location.origin || 'ORIGIN_NOT_FOUND';
94
- };
95
- // Function to set the session cookie
96
- FormoAnalytics.prototype.setSessionCookie = function () {
97
- var sessionId = this.getSessionId();
98
- var cookieValue = "".concat(this.sessionIdKey, "=").concat(sessionId, "; Max-Age=1800; path=/; secure; domain=").concat(this.getOrigin());
99
- document.cookie = cookieValue;
100
- };
101
- // Function to generate a new session ID
102
- FormoAnalytics.prototype.generateSessionId = function () {
103
- return crypto.randomUUID();
104
- };
105
- // Function to get a cookie value by name
106
- FormoAnalytics.prototype.getCookieValue = function (name) {
107
- var cookies = document.cookie.split(';').reduce(function (acc, cookie) {
108
- var _a = cookie.split('='), key = _a[0], value = _a[1];
109
- acc[key.trim()] = value;
110
- return acc;
111
- }, {});
112
- return cookies[name];
113
- };
114
- // Function to send tracking data
115
- FormoAnalytics.prototype.trackEvent = function (action, payload) {
116
- return __awaiter(this, void 0, void 0, function () {
117
- var maxRetries, attempt, address, requestData, sendRequest;
118
- var _this = this;
119
- return __generator(this, function (_a) {
120
- switch (_a.label) {
121
- case 0:
122
- maxRetries = 3;
123
- attempt = 0;
124
- this.setSessionCookie();
125
- return [4 /*yield*/, this.getCurrentWallet()];
126
- case 1:
127
- address = _a.sent();
128
- requestData = {
129
- address: address,
130
- session_id: this.getSessionId(),
131
- timestamp: new Date().toISOString(),
132
- action: action,
133
- version: '1',
134
- payload: payload,
135
- };
136
- sendRequest = function () { return __awaiter(_this, void 0, void 0, function () {
137
- var response, error_1, retryDelay;
138
- return __generator(this, function (_a) {
139
- switch (_a.label) {
140
- case 0:
141
- _a.trys.push([0, 2, , 3]);
142
- return [4 /*yield*/, axios_1.default.post(constants_1.EVENTS_API_URL, JSON.stringify(requestData), {
143
- headers: {
144
- 'Content-Type': 'application/json',
145
- Authorization: "Bearer ".concat(this.apiKey),
146
- },
147
- })];
148
- case 1:
149
- response = _a.sent();
150
- if (response.status >= 200 && response.status < 300) {
151
- console.log('Event sent successfully:', action);
152
- }
153
- else {
154
- throw new Error("Failed with status: ".concat(response.status));
155
- }
156
- return [3 /*break*/, 3];
157
- case 2:
158
- error_1 = _a.sent();
159
- attempt++;
160
- if (attempt <= maxRetries) {
161
- retryDelay = Math.pow(2, attempt) * 1000;
162
- console.error("Attempt ".concat(attempt, ": Retrying event \"").concat(action, "\" in ").concat(retryDelay / 1000, " seconds..."));
163
- setTimeout(sendRequest, retryDelay);
164
- }
165
- else {
166
- highlight_run_1.H.consumeError(error_1, "Request data: ".concat(JSON.stringify(requestData)));
167
- console.error("Event \"".concat(action, "\" failed after ").concat(maxRetries, " attempts. Error: ").concat(error_1));
168
- }
169
- return [3 /*break*/, 3];
170
- case 3: return [2 /*return*/];
171
- }
172
- });
173
- }); };
174
- return [4 /*yield*/, sendRequest()];
175
- case 2:
176
- _a.sent();
177
- return [2 /*return*/];
178
- }
179
- });
180
- });
181
- };
182
- // Function to track page hits
183
- FormoAnalytics.prototype.trackPageHit = function () {
184
- var _this = this;
185
- if (window.__nightmare || window.navigator.webdriver || window.Cypress)
186
- return;
187
- var location;
188
- var language;
189
- try {
190
- var timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
191
- location = this.timezoneToCountry[timezone];
192
- language =
193
- navigator.languages && navigator.languages.length
194
- ? navigator.languages[0]
195
- : navigator.language || 'en';
196
- }
197
- catch (error) {
198
- console.error('Error resolving timezone or language:', error);
199
- }
200
- setTimeout(function () {
201
- var url = new URL(window.location.href);
202
- var params = new URLSearchParams(url.search);
203
- _this.trackEvent(constants_1.Event.PAGE, {
204
- 'user-agent': window.navigator.userAgent,
205
- address: _this.currentConnectedAddress,
206
- locale: language,
207
- location: location,
208
- referrer: document.referrer,
209
- pathname: window.location.pathname,
210
- href: window.location.href,
211
- utm_source: params.get('utm_source'),
212
- utm_medium: params.get('utm_medium'),
213
- utm_campaign: params.get('utm_campaign'),
214
- ref: params.get('ref'),
215
- });
216
- }, 300);
217
- };
218
- FormoAnalytics.prototype.trackProvider = function (provider) {
219
- if (provider === this._provider) {
220
- console.log('Provider already tracked.');
221
- return;
222
- }
223
- this.currentChainId = undefined;
224
- this.currentConnectedAddress = undefined;
225
- if (this._provider) {
226
- var eventNames = Object.keys(this._registeredProviderListeners);
227
- for (var _i = 0, eventNames_1 = eventNames; _i < eventNames_1.length; _i++) {
228
- var eventName = eventNames_1[_i];
229
- this._provider.removeListener(eventName, this._registeredProviderListeners[eventName]);
230
- delete this._registeredProviderListeners[eventName];
231
- }
232
- }
233
- console.log('Tracking new provider:', provider);
234
- this._provider = provider;
235
- this.getCurrentWallet();
236
- this.registerAddressChangedListener();
237
- this.registerChainChangedListener();
238
- };
239
- FormoAnalytics.prototype.getAndStoreConnectedAddress = function () {
240
- return __awaiter(this, void 0, void 0, function () {
241
- var accounts, address, err_1;
242
- return __generator(this, function (_a) {
243
- switch (_a.label) {
244
- case 0:
245
- console.warn('Session data missing. Attempting to fetch address from provider.');
246
- _a.label = 1;
247
- case 1:
248
- _a.trys.push([1, 3, , 4]);
249
- return [4 /*yield*/, this.fetchAccounts()];
250
- case 2:
251
- accounts = _a.sent();
252
- if (accounts && accounts.length > 0) {
253
- address = accounts[0];
254
- this.storeWalletAddress(address);
255
- return [2 /*return*/, address];
256
- }
257
- return [3 /*break*/, 4];
258
- case 3:
259
- err_1 = _a.sent();
260
- console.error('Failed to fetch accounts from provider:', err_1);
261
- return [3 /*break*/, 4];
262
- case 4: return [2 /*return*/, null];
263
- }
264
- });
265
- });
266
- };
267
- FormoAnalytics.prototype.getCurrentWallet = function () {
268
- return __awaiter(this, void 0, void 0, function () {
269
- var sessionData, parsedData, sessionExpiry, currentTime;
270
- return __generator(this, function (_a) {
271
- switch (_a.label) {
272
- case 0:
273
- if (!this.provider) {
274
- console.warn('FormoAnalytics::getCurrentWallet: the provider is not set');
275
- return [2 /*return*/];
276
- }
277
- sessionData = sessionStorage.getItem(this.walletAddressSessionKey);
278
- if (!!sessionData) return [3 /*break*/, 2];
279
- return [4 /*yield*/, this.getAndStoreConnectedAddress()];
280
- case 1: return [2 /*return*/, _a.sent()];
281
- case 2:
282
- parsedData = JSON.parse(sessionData);
283
- sessionExpiry = 30 * 60 * 1000;
284
- currentTime = Date.now();
285
- if (currentTime - parsedData.timestamp > sessionExpiry) {
286
- console.warn('Session expired. Ignoring wallet address.');
287
- sessionStorage.removeItem(this.walletAddressSessionKey); // Clear expired session data
288
- return [2 /*return*/, ''];
289
- }
290
- this.onAddressConnected(parsedData.address);
291
- return [2 /*return*/, parsedData.address || ''];
292
- }
293
- });
294
- });
295
- };
296
- // Utility to fetch accounts
297
- FormoAnalytics.prototype.fetchAccounts = function () {
298
- return __awaiter(this, void 0, void 0, function () {
299
- var res, err_2;
300
- var _a;
301
- return __generator(this, function (_b) {
302
- switch (_b.label) {
303
- case 0:
304
- _b.trys.push([0, 2, , 3]);
305
- return [4 /*yield*/, ((_a = this.provider) === null || _a === void 0 ? void 0 : _a.request({
306
- method: 'eth_accounts',
307
- }))];
308
- case 1:
309
- res = _b.sent();
310
- if (!res || res.length === 0) {
311
- console.error('error', 'FormoAnalytics::fetchAccounts: unable to get account. eth_accounts returned empty');
312
- return [2 /*return*/, null];
313
- }
314
- return [2 /*return*/, res];
315
- case 2:
316
- err_2 = _b.sent();
317
- if (err_2.code !== 4001) {
318
- console.error('error', 'FormoAnalytics::fetchAccounts: eth_accounts threw an error', err_2);
319
- }
320
- return [2 /*return*/, null];
321
- case 3: return [2 /*return*/];
322
- }
323
- });
324
- });
325
- };
326
- // Utility to fetch chain ID
327
- FormoAnalytics.prototype.fetchChainId = function () {
328
- return __awaiter(this, void 0, void 0, function () {
329
- var chainIdHex, err_3;
330
- var _a;
331
- return __generator(this, function (_b) {
332
- switch (_b.label) {
333
- case 0:
334
- _b.trys.push([0, 2, , 3]);
335
- return [4 /*yield*/, ((_a = this.provider) === null || _a === void 0 ? void 0 : _a.request({
336
- method: 'eth_chainId',
337
- }))];
338
- case 1:
339
- chainIdHex = _b.sent();
340
- if (!chainIdHex) {
341
- console.error('FormoAnalytics::fetchChainId: chainIdHex is null or undefined');
342
- return [2 /*return*/, null];
343
- }
344
- return [2 /*return*/, chainIdHex];
345
- case 2:
346
- err_3 = _b.sent();
347
- console.error('error', 'FormoAnalytics::fetchChainId: eth_chainId threw an error', err_3);
348
- return [2 /*return*/, null];
349
- case 3: return [2 /*return*/];
350
- }
351
- });
352
- });
353
- };
354
- FormoAnalytics.prototype.getCurrentChainId = function () {
355
- return __awaiter(this, void 0, void 0, function () {
356
- var chainIdHex;
357
- return __generator(this, function (_a) {
358
- switch (_a.label) {
359
- case 0:
360
- if (!this.provider) {
361
- console.error('FormoAnalytics::getCurrentChainId: provider not set');
362
- }
363
- return [4 /*yield*/, this.fetchChainId()];
364
- case 1:
365
- chainIdHex = _a.sent();
366
- // Because we're connected, the chainId cannot be null
367
- if (!chainIdHex) {
368
- console.error("FormoAnalytics::getCurrentChainId: chainIdHex is: ".concat(chainIdHex));
369
- }
370
- return [2 /*return*/, parseInt(chainIdHex, 16).toString()];
371
- }
372
- });
373
- });
374
- };
375
- FormoAnalytics.prototype.registerAddressChangedListener = function () {
376
- var _this = this;
377
- var _a, _b;
378
- var listener = function () {
379
- var args = [];
380
- for (var _i = 0; _i < arguments.length; _i++) {
381
- args[_i] = arguments[_i];
382
- }
383
- return _this.onAddressChanged(args[0]);
384
- };
385
- (_a = this._provider) === null || _a === void 0 ? void 0 : _a.on('accountsChanged', listener);
386
- this._registeredProviderListeners['accountsChanged'] = listener;
387
- var onAddressDisconnected = this.onAddressDisconnected.bind(this);
388
- (_b = this._provider) === null || _b === void 0 ? void 0 : _b.on('disconnect', onAddressDisconnected);
389
- this._registeredProviderListeners['disconnect'] = onAddressDisconnected;
390
- };
391
- FormoAnalytics.prototype.registerChainChangedListener = function () {
392
- var _this = this;
393
- var _a;
394
- var listener = function () {
395
- var args = [];
396
- for (var _i = 0; _i < arguments.length; _i++) {
397
- args[_i] = arguments[_i];
398
- }
399
- return _this.onChainChanged(args[0]);
400
- };
401
- (_a = this.provider) === null || _a === void 0 ? void 0 : _a.on('chainChanged', listener);
402
- this._registeredProviderListeners['chainChanged'] = listener;
403
- };
404
- FormoAnalytics.prototype.onAddressChanged = function (addresses) {
405
- return __awaiter(this, void 0, void 0, function () {
406
- var newAccount;
407
- return __generator(this, function (_a) {
408
- if (addresses.length > 0) {
409
- newAccount = addresses[0];
410
- if (newAccount !== this.currentConnectedAddress) {
411
- this.onAddressConnected(newAccount);
412
- }
413
- }
414
- else {
415
- this.onAddressDisconnected();
416
- }
417
- return [2 /*return*/];
418
- });
419
- });
420
- };
421
- FormoAnalytics.prototype.onAddressConnected = function (address) {
422
- return __awaiter(this, void 0, void 0, function () {
423
- var _a;
424
- return __generator(this, function (_b) {
425
- switch (_b.label) {
426
- case 0:
427
- if (address === this.currentConnectedAddress) {
428
- // We have already reported this address
429
- return [2 /*return*/];
430
- }
431
- else {
432
- this.currentConnectedAddress = address;
433
- }
434
- _a = this;
435
- return [4 /*yield*/, this.getCurrentChainId()];
436
- case 1:
437
- _a.currentChainId = _b.sent();
438
- this.connect({ chainId: this.currentChainId, address: address });
439
- this.storeWalletAddress(address);
440
- return [2 /*return*/];
441
- }
442
- });
443
- });
444
- };
445
- FormoAnalytics.prototype.onAddressDisconnected = function () {
446
- if (!this.currentConnectedAddress) {
447
- return;
448
- }
449
- var payload = {
450
- chain_id: this.currentChainId,
451
- address: this.currentConnectedAddress,
452
- };
453
- this.currentChainId = undefined;
454
- this.currentConnectedAddress = undefined;
455
- this.clearWalletAddress();
456
- return this.trackEvent(constants_1.Event.DISCONNECT, payload);
457
- };
458
- FormoAnalytics.prototype.onChainChanged = function (chainIdHex) {
459
- return __awaiter(this, void 0, void 0, function () {
460
- var res, err_4;
461
- return __generator(this, function (_a) {
462
- switch (_a.label) {
463
- case 0:
464
- this.currentChainId = parseInt(chainIdHex).toString();
465
- if (!!this.currentConnectedAddress) return [3 /*break*/, 4];
466
- if (!this.provider) {
467
- console.error('error', 'FormoAnalytics::onChainChanged: provider not found. CHAIN_CHANGED not reported');
468
- return [2 /*return*/];
469
- }
470
- _a.label = 1;
471
- case 1:
472
- _a.trys.push([1, 3, , 4]);
473
- return [4 /*yield*/, this.fetchAccounts()];
474
- case 2:
475
- res = _a.sent();
476
- if (!res || res.length === 0) {
477
- console.error('error', 'FormoAnalytics::onChainChanged: unable to get account. eth_accounts returned empty');
478
- return [2 /*return*/];
479
- }
480
- this.currentConnectedAddress = res[0];
481
- return [3 /*break*/, 4];
482
- case 3:
483
- err_4 = _a.sent();
484
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
485
- if (err_4.code !== 4001) {
486
- // 4001: The request is rejected by the user , see https://docs.metamask.io/wallet/reference/provider-api/#errors
487
- console.error('error', "FormoAnalytics::onChainChanged: unable to get account. eth_accounts threw an error", err_4);
488
- return [2 /*return*/];
489
- }
490
- return [3 /*break*/, 4];
491
- case 4: return [2 /*return*/, this.chain({
492
- chainId: this.currentChainId,
493
- address: this.currentConnectedAddress,
494
- })];
495
- }
496
- });
497
- });
498
- };
499
- /**
500
- * Stores the wallet address in session storage when connected.
501
- * @param address - The wallet address to store.
502
- */
503
- FormoAnalytics.prototype.storeWalletAddress = function (address) {
504
- if (!address) {
505
- console.error('No wallet address provided to store.');
506
- return;
507
- }
508
- var sessionData = {
509
- address: address,
510
- timestamp: Date.now(),
511
- };
512
- sessionStorage.setItem(this.walletAddressSessionKey, JSON.stringify(sessionData));
513
- };
514
- /**
515
- * Clears the wallet address from session storage when disconnected.
516
- */
517
- FormoAnalytics.prototype.clearWalletAddress = function () {
518
- sessionStorage.removeItem(this.walletAddressSessionKey);
519
- };
520
- FormoAnalytics.prototype.init = function (apiKey, options) {
521
- var instance = new FormoAnalytics(apiKey, options);
522
- return Promise.resolve(instance);
523
- };
524
- FormoAnalytics.prototype.connect = function (_a) {
525
- var chainId = _a.chainId, address = _a.address;
526
- if (!chainId) {
527
- throw new Error('FormoAnalytics::connect: chain ID cannot be empty');
528
- }
529
- if (!address) {
530
- throw new Error('FormoAnalytics::connect: address cannot be empty');
531
- }
532
- this.currentChainId = chainId.toString();
533
- this.currentConnectedAddress = address;
534
- return this.trackEvent(constants_1.Event.CONNECT, {
535
- chain_id: chainId,
536
- address: address,
537
- });
538
- };
539
- FormoAnalytics.prototype.disconnect = function (params) {
540
- var address = (params === null || params === void 0 ? void 0 : params.address) || this.currentConnectedAddress;
541
- if (!address) {
542
- // We have most likely already reported this disconnection with the automatic
543
- // `disconnect` detection
544
- return;
545
- }
546
- var payload = {
547
- chain_id: (params === null || params === void 0 ? void 0 : params.chainId) || this.currentChainId,
548
- address: address,
549
- };
550
- this.currentChainId = undefined;
551
- this.currentConnectedAddress = undefined;
552
- return this.trackEvent(constants_1.Event.DISCONNECT, payload);
553
- };
554
- FormoAnalytics.prototype.chain = function (_a) {
555
- var chainId = _a.chainId, address = _a.address;
556
- if (!chainId || Number(chainId) === 0) {
557
- throw new Error('FormoAnalytics::chain: chainId cannot be empty or 0');
558
- }
559
- if (!address && !this.currentConnectedAddress) {
560
- throw new Error('FormoAnalytics::chain: address was empty and no previous address has been recorded. You can either pass an address or call connect() first');
561
- }
562
- if (isNaN(Number(chainId))) {
563
- throw new Error('FormoAnalytics::chain: chainId must be a valid hex or decimal number');
564
- }
565
- this.currentChainId = chainId.toString();
566
- return this.trackEvent(constants_1.Event.CHAIN_CHANGED, {
567
- chain_id: chainId,
568
- address: address || this.currentConnectedAddress,
569
- });
570
- };
571
- FormoAnalytics.prototype.page = function () {
572
- this.trackPageHit();
573
- };
574
- FormoAnalytics.prototype.track = function (eventName, eventData) {
575
- this.trackEvent(eventName, eventData);
576
- };
577
- return FormoAnalytics;
578
- }());
579
- exports.FormoAnalytics = FormoAnalytics;
580
- //# sourceMappingURL=FormoAnalytics.js.map