@formo/analytics 1.11.6 → 1.11.8
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.
- package/README.md +10 -14
- package/dist/cjs/src/FormoAnalytics.d.ts +7 -7
- package/dist/cjs/src/FormoAnalytics.d.ts.map +1 -1
- package/dist/cjs/src/FormoAnalytics.js +22 -36
- package/dist/cjs/src/FormoAnalytics.js.map +1 -1
- package/dist/cjs/src/FormoAnalyticsProvider.d.ts +1 -1
- package/dist/cjs/src/FormoAnalyticsProvider.d.ts.map +1 -1
- package/dist/cjs/src/FormoAnalyticsProvider.js +3 -3
- package/dist/cjs/src/FormoAnalyticsProvider.js.map +1 -1
- package/dist/cjs/src/constants/config.d.ts +1 -1
- package/dist/cjs/src/constants/config.d.ts.map +1 -1
- package/dist/cjs/src/constants/config.js +2 -2
- package/dist/cjs/src/constants/config.js.map +1 -1
- package/dist/cjs/src/types/base.d.ts +5 -1
- package/dist/cjs/src/types/base.d.ts.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/src/FormoAnalytics.d.ts +7 -7
- package/dist/esm/src/FormoAnalytics.d.ts.map +1 -1
- package/dist/esm/src/FormoAnalytics.js +23 -37
- package/dist/esm/src/FormoAnalytics.js.map +1 -1
- package/dist/esm/src/FormoAnalyticsProvider.d.ts +1 -1
- package/dist/esm/src/FormoAnalyticsProvider.d.ts.map +1 -1
- package/dist/esm/src/FormoAnalyticsProvider.js +3 -3
- package/dist/esm/src/FormoAnalyticsProvider.js.map +1 -1
- package/dist/esm/src/constants/config.d.ts +1 -1
- package/dist/esm/src/constants/config.d.ts.map +1 -1
- package/dist/esm/src/constants/config.js +1 -1
- package/dist/esm/src/constants/config.js.map +1 -1
- package/dist/esm/src/types/base.d.ts +5 -1
- package/dist/esm/src/types/base.d.ts.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/index.umd.min.js +1 -1
- package/dist/index.umd.min.js.map +1 -1
- package/package.json +1 -1
- package/src/FormoAnalytics.ts +27 -43
- package/src/FormoAnalyticsProvider.tsx +3 -3
- package/src/constants/config.ts +1 -1
- package/src/types/base.ts +7 -1
package/package.json
CHANGED
package/src/FormoAnalytics.ts
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
2
|
import {
|
|
3
3
|
COUNTRY_LIST,
|
|
4
|
-
|
|
4
|
+
EVENTS_API_URL,
|
|
5
5
|
SESSION_STORAGE_ID_KEY,
|
|
6
6
|
Event,
|
|
7
7
|
} from './constants';
|
|
8
8
|
import { isNotEmpty } from './utils';
|
|
9
9
|
import { H } from 'highlight.run';
|
|
10
|
-
import { ChainID, EIP1193Provider,
|
|
10
|
+
import { ChainID, EIP1193Provider, Options } from './types';
|
|
11
11
|
|
|
12
12
|
interface IFormoAnalytics {
|
|
13
13
|
/**
|
|
14
14
|
* Initializes the FormoAnalytics instance with the provided API key and project ID.
|
|
15
15
|
*/
|
|
16
|
-
init(apiKey: string,
|
|
16
|
+
init(apiKey: string, options: Options): Promise<FormoAnalytics>;
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
19
|
* Identifies the user with the provided user data.
|
|
@@ -45,6 +45,9 @@ interface IFormoAnalytics {
|
|
|
45
45
|
*/
|
|
46
46
|
chain(attributes: { chainId: ChainID; account?: string }): void;
|
|
47
47
|
}
|
|
48
|
+
interface Config {
|
|
49
|
+
token: string;
|
|
50
|
+
}
|
|
48
51
|
export class FormoAnalytics implements IFormoAnalytics {
|
|
49
52
|
private _provider?: EIP1193Provider;
|
|
50
53
|
private _registeredProviderListeners: Record<
|
|
@@ -52,8 +55,8 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
52
55
|
(...args: unknown[]) => void
|
|
53
56
|
> = {};
|
|
54
57
|
|
|
55
|
-
private
|
|
56
|
-
private config:
|
|
58
|
+
private walletAddressSessionKey = 'walletAddress';
|
|
59
|
+
private config: Config;
|
|
57
60
|
private sessionIdKey: string = SESSION_STORAGE_ID_KEY;
|
|
58
61
|
private timezoneToCountry: Record<string, string> = COUNTRY_LIST;
|
|
59
62
|
|
|
@@ -62,13 +65,13 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
62
65
|
|
|
63
66
|
private constructor(
|
|
64
67
|
public readonly apiKey: string,
|
|
65
|
-
public
|
|
68
|
+
public options: Options = {}
|
|
66
69
|
) {
|
|
67
70
|
this.config = {
|
|
68
71
|
token: this.apiKey,
|
|
69
72
|
};
|
|
70
73
|
|
|
71
|
-
const provider = window?.ethereum || window.web3?.currentProvider;
|
|
74
|
+
const provider = window?.ethereum || window.web3?.currentProvider || options?.provider;
|
|
72
75
|
if (provider) {
|
|
73
76
|
this.trackProvider(provider);
|
|
74
77
|
}
|
|
@@ -76,12 +79,12 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
76
79
|
|
|
77
80
|
static async init(
|
|
78
81
|
apiKey: string,
|
|
79
|
-
|
|
82
|
+
options: Options
|
|
80
83
|
): Promise<FormoAnalytics> {
|
|
81
84
|
const config = {
|
|
82
85
|
token: apiKey,
|
|
83
86
|
};
|
|
84
|
-
const instance = new FormoAnalytics(apiKey,
|
|
87
|
+
const instance = new FormoAnalytics(apiKey, options);
|
|
85
88
|
instance.config = config;
|
|
86
89
|
|
|
87
90
|
return instance;
|
|
@@ -106,13 +109,14 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
106
109
|
return newSessionId;
|
|
107
110
|
}
|
|
108
111
|
|
|
112
|
+
private getOrigin(): string {
|
|
113
|
+
return window.location.origin || 'ORIGIN_NOT_FOUND';
|
|
114
|
+
}
|
|
115
|
+
|
|
109
116
|
// Function to set the session cookie
|
|
110
|
-
private setSessionCookie(
|
|
117
|
+
private setSessionCookie(): void {
|
|
111
118
|
const sessionId = this.getSessionId();
|
|
112
|
-
let cookieValue = `${this.sessionIdKey}=${sessionId}; Max-Age=1800; path=/; secure`;
|
|
113
|
-
if (domain) {
|
|
114
|
-
cookieValue += `; domain=${domain}`;
|
|
115
|
-
}
|
|
119
|
+
let cookieValue = `${this.sessionIdKey}=${sessionId}; Max-Age=1800; path=/; secure; domain=${this.getOrigin()}`;
|
|
116
120
|
document.cookie = cookieValue;
|
|
117
121
|
}
|
|
118
122
|
|
|
@@ -136,12 +140,10 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
136
140
|
const maxRetries = 3;
|
|
137
141
|
let attempt = 0;
|
|
138
142
|
|
|
139
|
-
this.setSessionCookie(
|
|
140
|
-
const apiUrl = this.buildApiUrl();
|
|
143
|
+
this.setSessionCookie();
|
|
141
144
|
const address = await this.getCurrentWallet();
|
|
142
145
|
|
|
143
146
|
const requestData = {
|
|
144
|
-
project_id: this.projectId,
|
|
145
147
|
address: address,
|
|
146
148
|
session_id: this.getSessionId(),
|
|
147
149
|
timestamp: new Date().toISOString(),
|
|
@@ -152,9 +154,10 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
152
154
|
|
|
153
155
|
const sendRequest = async (): Promise<void> => {
|
|
154
156
|
try {
|
|
155
|
-
const response = await axios.post(
|
|
157
|
+
const response = await axios.post(EVENTS_API_URL, JSON.stringify(requestData), {
|
|
156
158
|
headers: {
|
|
157
159
|
'Content-Type': 'application/json',
|
|
160
|
+
Authorization: `Bearer ${this.apiKey}`
|
|
158
161
|
},
|
|
159
162
|
});
|
|
160
163
|
|
|
@@ -444,7 +447,7 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
444
447
|
console.warn('FormoAnalytics::getCurrentWallet: the provider is not set');
|
|
445
448
|
return;
|
|
446
449
|
}
|
|
447
|
-
const sessionData = sessionStorage.getItem(this.
|
|
450
|
+
const sessionData = sessionStorage.getItem(this.walletAddressSessionKey);
|
|
448
451
|
|
|
449
452
|
if (!sessionData) {
|
|
450
453
|
return null;
|
|
@@ -456,7 +459,7 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
456
459
|
|
|
457
460
|
if (currentTime - parsedData.timestamp > sessionExpiry) {
|
|
458
461
|
console.warn('Session expired. Ignoring wallet address.');
|
|
459
|
-
sessionStorage.removeItem(this.
|
|
462
|
+
sessionStorage.removeItem(this.walletAddressSessionKey); // Clear expired session data
|
|
460
463
|
return '';
|
|
461
464
|
}
|
|
462
465
|
|
|
@@ -479,32 +482,14 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
479
482
|
timestamp: Date.now(),
|
|
480
483
|
};
|
|
481
484
|
|
|
482
|
-
sessionStorage.setItem(this.
|
|
485
|
+
sessionStorage.setItem(this.walletAddressSessionKey, JSON.stringify(sessionData));
|
|
483
486
|
}
|
|
484
487
|
|
|
485
488
|
/**
|
|
486
489
|
* Clears the wallet address from session storage when disconnected.
|
|
487
490
|
*/
|
|
488
491
|
private clearWalletAddress(): void {
|
|
489
|
-
sessionStorage.removeItem(this.
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
// Function to build the API URL
|
|
493
|
-
private buildApiUrl(): string {
|
|
494
|
-
const { host, proxy, token, dataSource = 'analytics_events' } = this.config;
|
|
495
|
-
if (token) {
|
|
496
|
-
if (proxy) {
|
|
497
|
-
return `${proxy}/api/tracking`;
|
|
498
|
-
}
|
|
499
|
-
if (host) {
|
|
500
|
-
return `${host.replace(
|
|
501
|
-
/\/+$/,
|
|
502
|
-
''
|
|
503
|
-
)}/v0/events?name=${dataSource}&token=${token}`;
|
|
504
|
-
}
|
|
505
|
-
return `${EVENTS_API}?name=${dataSource}&token=${token}`;
|
|
506
|
-
}
|
|
507
|
-
return 'Error: No token provided';
|
|
492
|
+
sessionStorage.removeItem(this.walletAddressSessionKey);
|
|
508
493
|
}
|
|
509
494
|
|
|
510
495
|
connect({ account, chainId }: { account: string; chainId: ChainID }) {
|
|
@@ -569,9 +554,8 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
569
554
|
});
|
|
570
555
|
}
|
|
571
556
|
|
|
572
|
-
init(apiKey: string,
|
|
573
|
-
const instance = new FormoAnalytics(apiKey,
|
|
574
|
-
|
|
557
|
+
init(apiKey: string, options: Options): Promise<FormoAnalytics> {
|
|
558
|
+
const instance = new FormoAnalytics(apiKey, options);
|
|
575
559
|
return Promise.resolve(instance);
|
|
576
560
|
}
|
|
577
561
|
|
|
@@ -18,7 +18,7 @@ export const FormoAnalyticsContext = createContext<FormoAnalytics | undefined>(
|
|
|
18
18
|
|
|
19
19
|
export const FormoAnalyticsProvider = ({
|
|
20
20
|
apiKey,
|
|
21
|
-
|
|
21
|
+
options,
|
|
22
22
|
disabled,
|
|
23
23
|
children,
|
|
24
24
|
}: FormoAnalyticsProviderProps) => {
|
|
@@ -64,7 +64,7 @@ export const FormoAnalyticsProvider = ({
|
|
|
64
64
|
|
|
65
65
|
// Initialize FormoAnalytics
|
|
66
66
|
try {
|
|
67
|
-
const sdkInstance = await FormoAnalytics.init(apiKey,
|
|
67
|
+
const sdkInstance = await FormoAnalytics.init(apiKey, options);
|
|
68
68
|
setSdk(sdkInstance);
|
|
69
69
|
console.log('FormoAnalytics SDK initialized successfully');
|
|
70
70
|
} catch (error) {
|
|
@@ -75,7 +75,7 @@ export const FormoAnalyticsProvider = ({
|
|
|
75
75
|
};
|
|
76
76
|
|
|
77
77
|
initialize();
|
|
78
|
-
}, [apiKey, disabled,
|
|
78
|
+
}, [apiKey, disabled, options]);
|
|
79
79
|
|
|
80
80
|
if (!isInitialized) {
|
|
81
81
|
// Optionally show a loading state until initialization attempt finishes
|
package/src/constants/config.ts
CHANGED
package/src/types/base.ts
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
|
+
import { EIP1193Provider } from "./wallet";
|
|
2
|
+
|
|
1
3
|
export type ChainID = string | number
|
|
2
4
|
|
|
5
|
+
export interface Options {
|
|
6
|
+
provider?: EIP1193Provider;
|
|
7
|
+
}
|
|
8
|
+
|
|
3
9
|
export interface FormoAnalyticsProviderProps {
|
|
4
10
|
apiKey: string;
|
|
5
|
-
|
|
11
|
+
options: Options;
|
|
6
12
|
disabled?: boolean;
|
|
7
13
|
children: React.ReactNode;
|
|
8
14
|
}
|