@grainql/analytics-web 1.7.4 → 2.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.
- package/README.md +71 -718
- package/dist/activity.d.ts +59 -0
- package/dist/activity.d.ts.map +1 -0
- package/dist/cjs/activity.d.ts +59 -0
- package/dist/cjs/activity.d.ts.map +1 -0
- package/dist/cjs/activity.js +131 -0
- package/dist/cjs/activity.js.map +1 -0
- package/dist/cjs/consent.d.ts +68 -0
- package/dist/cjs/consent.d.ts.map +1 -0
- package/dist/cjs/consent.js +191 -0
- package/dist/cjs/consent.js.map +1 -0
- package/dist/cjs/cookies.d.ts +28 -0
- package/dist/cjs/cookies.d.ts.map +1 -0
- package/dist/cjs/cookies.js +95 -0
- package/dist/cjs/cookies.js.map +1 -0
- package/dist/cjs/heartbeat.d.ts +42 -0
- package/dist/cjs/heartbeat.d.ts.map +1 -0
- package/dist/cjs/heartbeat.js +92 -0
- package/dist/cjs/heartbeat.js.map +1 -0
- package/dist/cjs/index.d.ts +100 -3
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/page-tracking.d.ts +60 -0
- package/dist/cjs/page-tracking.d.ts.map +1 -0
- package/dist/cjs/page-tracking.js +180 -0
- package/dist/cjs/page-tracking.js.map +1 -0
- package/dist/cjs/react/GrainProvider.d.ts +11 -0
- package/dist/cjs/react/GrainProvider.d.ts.map +1 -0
- package/dist/cjs/react/GrainProvider.js +79 -0
- package/dist/cjs/react/GrainProvider.js.map +1 -0
- package/dist/cjs/react/components/ConsentBanner.d.ts +16 -0
- package/dist/cjs/react/components/ConsentBanner.d.ts.map +1 -0
- package/dist/cjs/react/components/ConsentBanner.js +112 -0
- package/dist/cjs/react/components/ConsentBanner.js.map +1 -0
- package/dist/cjs/react/components/CookieNotice.d.ts +12 -0
- package/dist/cjs/react/components/CookieNotice.d.ts.map +1 -0
- package/dist/cjs/react/components/CookieNotice.js +62 -0
- package/dist/cjs/react/components/CookieNotice.js.map +1 -0
- package/dist/cjs/react/components/PrivacyPreferenceCenter.d.ts +12 -0
- package/dist/cjs/react/components/PrivacyPreferenceCenter.d.ts.map +1 -0
- package/dist/cjs/react/components/PrivacyPreferenceCenter.js +120 -0
- package/dist/cjs/react/components/PrivacyPreferenceCenter.js.map +1 -0
- package/dist/cjs/react/context.d.ts +11 -0
- package/dist/cjs/react/context.d.ts.map +1 -0
- package/dist/cjs/react/context.js +43 -0
- package/dist/cjs/react/context.js.map +1 -0
- package/dist/cjs/react/hooks/useAllConfigs.d.ts +8 -0
- package/dist/cjs/react/hooks/useAllConfigs.d.ts.map +1 -0
- package/dist/cjs/react/hooks/useAllConfigs.js +112 -0
- package/dist/cjs/react/hooks/useAllConfigs.js.map +1 -0
- package/dist/cjs/react/hooks/useConfig.d.ts +9 -0
- package/dist/cjs/react/hooks/useConfig.d.ts.map +1 -0
- package/dist/cjs/react/hooks/useConfig.js +116 -0
- package/dist/cjs/react/hooks/useConfig.js.map +1 -0
- package/dist/cjs/react/hooks/useConsent.d.ts +13 -0
- package/dist/cjs/react/hooks/useConsent.d.ts.map +1 -0
- package/dist/cjs/react/hooks/useConsent.js +84 -0
- package/dist/cjs/react/hooks/useConsent.js.map +1 -0
- package/dist/cjs/react/hooks/useDataDeletion.d.ts +17 -0
- package/dist/cjs/react/hooks/useDataDeletion.d.ts.map +1 -0
- package/dist/cjs/react/hooks/useDataDeletion.js +117 -0
- package/dist/cjs/react/hooks/useDataDeletion.js.map +1 -0
- package/dist/cjs/react/hooks/useGrainAnalytics.d.ts +6 -0
- package/dist/cjs/react/hooks/useGrainAnalytics.d.ts.map +1 -0
- package/dist/cjs/react/hooks/useGrainAnalytics.js +50 -0
- package/dist/cjs/react/hooks/useGrainAnalytics.js.map +1 -0
- package/dist/cjs/react/hooks/usePrivacyPreferences.d.ts +15 -0
- package/dist/cjs/react/hooks/usePrivacyPreferences.d.ts.map +1 -0
- package/dist/cjs/react/hooks/usePrivacyPreferences.js +82 -0
- package/dist/cjs/react/hooks/usePrivacyPreferences.js.map +1 -0
- package/dist/cjs/react/hooks/useTrack.d.ts +9 -0
- package/dist/cjs/react/hooks/useTrack.d.ts.map +1 -0
- package/dist/cjs/react/hooks/useTrack.js +53 -0
- package/dist/cjs/react/hooks/useTrack.js.map +1 -0
- package/dist/cjs/react/index.d.ts +47 -0
- package/dist/cjs/react/index.d.ts.map +1 -0
- package/dist/cjs/react/index.js +59 -0
- package/dist/cjs/react/index.js.map +1 -0
- package/dist/cjs/react/types.d.ts +33 -0
- package/dist/cjs/react/types.d.ts.map +1 -0
- package/dist/cjs/react/types.js +6 -0
- package/dist/cjs/react/types.js.map +1 -0
- package/dist/consent.d.ts +68 -0
- package/dist/consent.d.ts.map +1 -0
- package/dist/cookies.d.ts +28 -0
- package/dist/cookies.d.ts.map +1 -0
- package/dist/esm/activity.d.ts +59 -0
- package/dist/esm/activity.d.ts.map +1 -0
- package/dist/esm/activity.js +127 -0
- package/dist/esm/activity.js.map +1 -0
- package/dist/esm/consent.d.ts +68 -0
- package/dist/esm/consent.d.ts.map +1 -0
- package/dist/esm/consent.js +187 -0
- package/dist/esm/consent.js.map +1 -0
- package/dist/esm/cookies.d.ts +28 -0
- package/dist/esm/cookies.d.ts.map +1 -0
- package/dist/esm/cookies.js +89 -0
- package/dist/esm/cookies.js.map +1 -0
- package/dist/esm/heartbeat.d.ts +42 -0
- package/dist/esm/heartbeat.d.ts.map +1 -0
- package/dist/esm/heartbeat.js +88 -0
- package/dist/esm/heartbeat.js.map +1 -0
- package/dist/esm/index.d.ts +100 -3
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/page-tracking.d.ts +60 -0
- package/dist/esm/page-tracking.d.ts.map +1 -0
- package/dist/esm/page-tracking.js +176 -0
- package/dist/esm/page-tracking.js.map +1 -0
- package/dist/esm/react/GrainProvider.d.ts +11 -0
- package/dist/esm/react/GrainProvider.d.ts.map +1 -0
- package/dist/esm/react/GrainProvider.js +43 -0
- package/dist/esm/react/GrainProvider.js.map +1 -0
- package/dist/esm/react/components/ConsentBanner.d.ts +16 -0
- package/dist/esm/react/components/ConsentBanner.d.ts.map +1 -0
- package/dist/esm/react/components/ConsentBanner.js +76 -0
- package/dist/esm/react/components/ConsentBanner.js.map +1 -0
- package/dist/esm/react/components/CookieNotice.d.ts +12 -0
- package/dist/esm/react/components/CookieNotice.d.ts.map +1 -0
- package/dist/esm/react/components/CookieNotice.js +26 -0
- package/dist/esm/react/components/CookieNotice.js.map +1 -0
- package/dist/esm/react/components/PrivacyPreferenceCenter.d.ts +12 -0
- package/dist/esm/react/components/PrivacyPreferenceCenter.d.ts.map +1 -0
- package/dist/esm/react/components/PrivacyPreferenceCenter.js +84 -0
- package/dist/esm/react/components/PrivacyPreferenceCenter.js.map +1 -0
- package/dist/esm/react/context.d.ts +11 -0
- package/dist/esm/react/context.d.ts.map +1 -0
- package/dist/esm/react/context.js +7 -0
- package/dist/esm/react/context.js.map +1 -0
- package/dist/esm/react/hooks/useAllConfigs.d.ts +8 -0
- package/dist/esm/react/hooks/useAllConfigs.d.ts.map +1 -0
- package/dist/esm/react/hooks/useAllConfigs.js +76 -0
- package/dist/esm/react/hooks/useAllConfigs.js.map +1 -0
- package/dist/esm/react/hooks/useConfig.d.ts +9 -0
- package/dist/esm/react/hooks/useConfig.d.ts.map +1 -0
- package/dist/esm/react/hooks/useConfig.js +80 -0
- package/dist/esm/react/hooks/useConfig.js.map +1 -0
- package/dist/esm/react/hooks/useConsent.d.ts +13 -0
- package/dist/esm/react/hooks/useConsent.d.ts.map +1 -0
- package/dist/esm/react/hooks/useConsent.js +48 -0
- package/dist/esm/react/hooks/useConsent.js.map +1 -0
- package/dist/esm/react/hooks/useDataDeletion.d.ts +17 -0
- package/dist/esm/react/hooks/useDataDeletion.d.ts.map +1 -0
- package/dist/esm/react/hooks/useDataDeletion.js +81 -0
- package/dist/esm/react/hooks/useDataDeletion.js.map +1 -0
- package/dist/esm/react/hooks/useGrainAnalytics.d.ts +6 -0
- package/dist/esm/react/hooks/useGrainAnalytics.d.ts.map +1 -0
- package/dist/esm/react/hooks/useGrainAnalytics.js +14 -0
- package/dist/esm/react/hooks/useGrainAnalytics.js.map +1 -0
- package/dist/esm/react/hooks/usePrivacyPreferences.d.ts +15 -0
- package/dist/esm/react/hooks/usePrivacyPreferences.d.ts.map +1 -0
- package/dist/esm/react/hooks/usePrivacyPreferences.js +46 -0
- package/dist/esm/react/hooks/usePrivacyPreferences.js.map +1 -0
- package/dist/esm/react/hooks/useTrack.d.ts +9 -0
- package/dist/esm/react/hooks/useTrack.d.ts.map +1 -0
- package/dist/esm/react/hooks/useTrack.js +17 -0
- package/dist/esm/react/hooks/useTrack.js.map +1 -0
- package/dist/esm/react/index.d.ts +47 -0
- package/dist/esm/react/index.d.ts.map +1 -0
- package/dist/esm/react/index.js +45 -0
- package/dist/esm/react/index.js.map +1 -0
- package/dist/esm/react/types.d.ts +33 -0
- package/dist/esm/react/types.d.ts.map +1 -0
- package/dist/esm/react/types.js +5 -0
- package/dist/esm/react/types.js.map +1 -0
- package/dist/heartbeat.d.ts +42 -0
- package/dist/heartbeat.d.ts.map +1 -0
- package/dist/index.d.ts +100 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.global.dev.js +903 -12
- package/dist/index.global.dev.js.map +3 -3
- package/dist/index.global.js +2 -2
- package/dist/index.global.js.map +4 -4
- package/dist/index.js +321 -11
- package/dist/index.mjs +321 -11
- package/dist/page-tracking.d.ts +60 -0
- package/dist/page-tracking.d.ts.map +1 -0
- package/dist/react/activity.d.ts +59 -0
- package/dist/react/activity.d.ts.map +1 -0
- package/dist/react/activity.js +130 -0
- package/dist/react/activity.mjs +126 -0
- package/dist/react/consent.d.ts +68 -0
- package/dist/react/consent.d.ts.map +1 -0
- package/dist/react/consent.js +190 -0
- package/dist/react/consent.mjs +186 -0
- package/dist/react/cookies.d.ts +28 -0
- package/dist/react/cookies.d.ts.map +1 -0
- package/dist/react/cookies.js +94 -0
- package/dist/react/cookies.mjs +88 -0
- package/dist/react/heartbeat.d.ts +42 -0
- package/dist/react/heartbeat.d.ts.map +1 -0
- package/dist/react/heartbeat.js +91 -0
- package/dist/react/heartbeat.mjs +87 -0
- package/dist/react/index.d.ts +502 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +1491 -0
- package/dist/react/index.mjs +1486 -0
- package/dist/react/page-tracking.d.ts +60 -0
- package/dist/react/page-tracking.d.ts.map +1 -0
- package/dist/react/page-tracking.js +179 -0
- package/dist/react/page-tracking.mjs +175 -0
- package/dist/react/react/GrainProvider.d.ts +11 -0
- package/dist/react/react/GrainProvider.d.ts.map +1 -0
- package/dist/react/react/GrainProvider.js +45 -0
- package/dist/react/react/GrainProvider.mjs +42 -0
- package/dist/react/react/components/ConsentBanner.d.ts +16 -0
- package/dist/react/react/components/ConsentBanner.d.ts.map +1 -0
- package/dist/react/react/components/ConsentBanner.js +78 -0
- package/dist/react/react/components/ConsentBanner.mjs +75 -0
- package/dist/react/react/components/CookieNotice.d.ts +12 -0
- package/dist/react/react/components/CookieNotice.d.ts.map +1 -0
- package/dist/react/react/components/CookieNotice.js +28 -0
- package/dist/react/react/components/CookieNotice.mjs +25 -0
- package/dist/react/react/components/PrivacyPreferenceCenter.d.ts +12 -0
- package/dist/react/react/components/PrivacyPreferenceCenter.d.ts.map +1 -0
- package/dist/react/react/components/PrivacyPreferenceCenter.js +86 -0
- package/dist/react/react/components/PrivacyPreferenceCenter.mjs +83 -0
- package/dist/react/react/context.d.ts +11 -0
- package/dist/react/react/context.d.ts.map +1 -0
- package/dist/react/react/context.js +9 -0
- package/dist/react/react/context.mjs +6 -0
- package/dist/react/react/hooks/useAllConfigs.d.ts +8 -0
- package/dist/react/react/hooks/useAllConfigs.d.ts.map +1 -0
- package/dist/react/react/hooks/useAllConfigs.js +78 -0
- package/dist/react/react/hooks/useAllConfigs.mjs +75 -0
- package/dist/react/react/hooks/useConfig.d.ts +9 -0
- package/dist/react/react/hooks/useConfig.d.ts.map +1 -0
- package/dist/react/react/hooks/useConfig.js +82 -0
- package/dist/react/react/hooks/useConfig.mjs +79 -0
- package/dist/react/react/hooks/useConsent.d.ts +13 -0
- package/dist/react/react/hooks/useConsent.d.ts.map +1 -0
- package/dist/react/react/hooks/useConsent.js +50 -0
- package/dist/react/react/hooks/useConsent.mjs +47 -0
- package/dist/react/react/hooks/useDataDeletion.d.ts +17 -0
- package/dist/react/react/hooks/useDataDeletion.d.ts.map +1 -0
- package/dist/react/react/hooks/useDataDeletion.js +83 -0
- package/dist/react/react/hooks/useDataDeletion.mjs +80 -0
- package/dist/react/react/hooks/useGrainAnalytics.d.ts +6 -0
- package/dist/react/react/hooks/useGrainAnalytics.d.ts.map +1 -0
- package/dist/react/react/hooks/useGrainAnalytics.js +16 -0
- package/dist/react/react/hooks/useGrainAnalytics.mjs +13 -0
- package/dist/react/react/hooks/usePrivacyPreferences.d.ts +15 -0
- package/dist/react/react/hooks/usePrivacyPreferences.d.ts.map +1 -0
- package/dist/react/react/hooks/usePrivacyPreferences.js +48 -0
- package/dist/react/react/hooks/usePrivacyPreferences.mjs +45 -0
- package/dist/react/react/hooks/useTrack.d.ts +9 -0
- package/dist/react/react/hooks/useTrack.d.ts.map +1 -0
- package/dist/react/react/hooks/useTrack.js +19 -0
- package/dist/react/react/hooks/useTrack.mjs +16 -0
- package/dist/react/react/index.d.ts +47 -0
- package/dist/react/react/index.d.ts.map +1 -0
- package/dist/react/react/index.js +58 -0
- package/dist/react/react/index.mjs +44 -0
- package/dist/react/react/types.d.ts +33 -0
- package/dist/react/react/types.d.ts.map +1 -0
- package/dist/react/react/types.js +5 -0
- package/dist/react/react/types.mjs +4 -0
- package/package.json +20 -2
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useDataDeletion - Hook for triggering data deletion requests
|
|
3
|
+
* This is a client-side utility - actual deletion happens on the server
|
|
4
|
+
*/
|
|
5
|
+
export interface DataDeletionOptions {
|
|
6
|
+
apiUrl: string;
|
|
7
|
+
tenantId: string;
|
|
8
|
+
onSuccess?: (message: string) => void;
|
|
9
|
+
onError?: (error: string) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare function useDataDeletion(options: DataDeletionOptions): {
|
|
12
|
+
requestDeletion: (userId: string) => Promise<any>;
|
|
13
|
+
requestAnonymization: (userId: string) => Promise<any>;
|
|
14
|
+
loading: boolean;
|
|
15
|
+
error: string | null;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=useDataDeletion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDataDeletion.d.ts","sourceRoot":"","sources":["../../../../src/react/hooks/useDataDeletion.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,mBAAmB;8BAKzC,MAAM;mCAyCN,MAAM;;;EA6CxB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useDataDeletion - Hook for triggering data deletion requests
|
|
3
|
+
* This is a client-side utility - actual deletion happens on the server
|
|
4
|
+
*/
|
|
5
|
+
import * as React from 'react';
|
|
6
|
+
export function useDataDeletion(options) {
|
|
7
|
+
const [loading, setLoading] = React.useState(false);
|
|
8
|
+
const [error, setError] = React.useState(null);
|
|
9
|
+
const requestDeletion = React.useCallback(async (userId) => {
|
|
10
|
+
setLoading(true);
|
|
11
|
+
setError(null);
|
|
12
|
+
try {
|
|
13
|
+
const response = await fetch(`${options.apiUrl}/v1/privacy/${options.tenantId}/data-deletion`, {
|
|
14
|
+
method: 'POST',
|
|
15
|
+
headers: {
|
|
16
|
+
'Content-Type': 'application/json',
|
|
17
|
+
},
|
|
18
|
+
body: JSON.stringify({
|
|
19
|
+
userId,
|
|
20
|
+
deleteEvents: true,
|
|
21
|
+
deleteProperties: true,
|
|
22
|
+
deleteConsentAudit: false,
|
|
23
|
+
}),
|
|
24
|
+
});
|
|
25
|
+
if (!response.ok) {
|
|
26
|
+
throw new Error(`HTTP ${response.status}`);
|
|
27
|
+
}
|
|
28
|
+
const result = await response.json();
|
|
29
|
+
options.onSuccess?.(result.message);
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
const errorMessage = err instanceof Error ? err.message : 'Unknown error';
|
|
34
|
+
setError(errorMessage);
|
|
35
|
+
options.onError?.(errorMessage);
|
|
36
|
+
throw err;
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
setLoading(false);
|
|
40
|
+
}
|
|
41
|
+
}, [options]);
|
|
42
|
+
const requestAnonymization = React.useCallback(async (userId) => {
|
|
43
|
+
setLoading(true);
|
|
44
|
+
setError(null);
|
|
45
|
+
try {
|
|
46
|
+
const response = await fetch(`${options.apiUrl}/v1/privacy/${options.tenantId}/anonymize-user`, {
|
|
47
|
+
method: 'POST',
|
|
48
|
+
headers: {
|
|
49
|
+
'Content-Type': 'application/json',
|
|
50
|
+
},
|
|
51
|
+
body: JSON.stringify({
|
|
52
|
+
userId,
|
|
53
|
+
anonymizeEvents: true,
|
|
54
|
+
anonymizeProperties: true,
|
|
55
|
+
}),
|
|
56
|
+
});
|
|
57
|
+
if (!response.ok) {
|
|
58
|
+
throw new Error(`HTTP ${response.status}`);
|
|
59
|
+
}
|
|
60
|
+
const result = await response.json();
|
|
61
|
+
options.onSuccess?.(result.message);
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
const errorMessage = err instanceof Error ? err.message : 'Unknown error';
|
|
66
|
+
setError(errorMessage);
|
|
67
|
+
options.onError?.(errorMessage);
|
|
68
|
+
throw err;
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
setLoading(false);
|
|
72
|
+
}
|
|
73
|
+
}, [options]);
|
|
74
|
+
return {
|
|
75
|
+
requestDeletion,
|
|
76
|
+
requestAnonymization,
|
|
77
|
+
loading,
|
|
78
|
+
error,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=useDataDeletion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDataDeletion.js","sourceRoot":"","sources":["../../../../src/react/hooks/useDataDeletion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGrainAnalytics.d.ts","sourceRoot":"","sources":["../../../../src/react/hooks/useGrainAnalytics.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,wBAAgB,iBAAiB,IAAI,cAAc,CAWlD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useGrainAnalytics - Access the GrainAnalytics client from context
|
|
3
|
+
*/
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { GrainContext } from '../context';
|
|
6
|
+
export function useGrainAnalytics() {
|
|
7
|
+
const context = React.useContext(GrainContext);
|
|
8
|
+
if (!context) {
|
|
9
|
+
throw new Error('useGrainAnalytics must be used within a GrainProvider. ' +
|
|
10
|
+
'Wrap your component tree with <GrainProvider client={client}> or <GrainProvider config={{...}}>');
|
|
11
|
+
}
|
|
12
|
+
return context.client;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=useGrainAnalytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGrainAnalytics.js","sourceRoot":"","sources":["../../../../src/react/hooks/useGrainAnalytics.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAE/C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,yDAAyD;YACzD,iGAAiG,CAClG,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* usePrivacyPreferences - Hook for managing privacy preferences
|
|
3
|
+
*/
|
|
4
|
+
export interface PrivacyPreferences {
|
|
5
|
+
necessary: boolean;
|
|
6
|
+
analytics: boolean;
|
|
7
|
+
functional: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function usePrivacyPreferences(): {
|
|
10
|
+
preferences: PrivacyPreferences;
|
|
11
|
+
updatePreferences: (newPreferences: Partial<PrivacyPreferences>) => void;
|
|
12
|
+
acceptAll: () => void;
|
|
13
|
+
rejectAll: () => void;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=usePrivacyPreferences.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePrivacyPreferences.d.ts","sourceRoot":"","sources":["../../../../src/react/hooks/usePrivacyPreferences.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,qBAAqB;;wCAahB,OAAO,CAAC,kBAAkB,CAAC;;;EAqC/C"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* usePrivacyPreferences - Hook for managing privacy preferences
|
|
3
|
+
*/
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { useConsent } from './useConsent';
|
|
6
|
+
export function usePrivacyPreferences() {
|
|
7
|
+
const { consentState, grantConsent, revokeConsent } = useConsent();
|
|
8
|
+
const preferences = React.useMemo(() => {
|
|
9
|
+
const categories = consentState?.categories ?? [];
|
|
10
|
+
return {
|
|
11
|
+
necessary: categories.includes('necessary'),
|
|
12
|
+
analytics: categories.includes('analytics'),
|
|
13
|
+
functional: categories.includes('functional'),
|
|
14
|
+
};
|
|
15
|
+
}, [consentState]);
|
|
16
|
+
const updatePreferences = React.useCallback((newPreferences) => {
|
|
17
|
+
const categories = [];
|
|
18
|
+
// Necessary is always enabled
|
|
19
|
+
categories.push('necessary');
|
|
20
|
+
if (newPreferences.analytics ?? preferences.analytics) {
|
|
21
|
+
categories.push('analytics');
|
|
22
|
+
}
|
|
23
|
+
if (newPreferences.functional ?? preferences.functional) {
|
|
24
|
+
categories.push('functional');
|
|
25
|
+
}
|
|
26
|
+
if (categories.length > 0) {
|
|
27
|
+
grantConsent(categories);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
revokeConsent();
|
|
31
|
+
}
|
|
32
|
+
}, [preferences, grantConsent, revokeConsent]);
|
|
33
|
+
const acceptAll = React.useCallback(() => {
|
|
34
|
+
grantConsent(['necessary', 'analytics', 'functional']);
|
|
35
|
+
}, [grantConsent]);
|
|
36
|
+
const rejectAll = React.useCallback(() => {
|
|
37
|
+
grantConsent(['necessary']); // Keep only necessary
|
|
38
|
+
}, [grantConsent]);
|
|
39
|
+
return {
|
|
40
|
+
preferences,
|
|
41
|
+
updatePreferences,
|
|
42
|
+
acceptAll,
|
|
43
|
+
rejectAll,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=usePrivacyPreferences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePrivacyPreferences.js","sourceRoot":"","sources":["../../../../src/react/hooks/usePrivacyPreferences.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAQ1C,MAAM,UAAU,qBAAqB;IACnC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,UAAU,EAAE,CAAC;IAEnE,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAqB,GAAG,EAAE;QACzD,MAAM,UAAU,GAAG,YAAY,EAAE,UAAU,IAAI,EAAE,CAAC;QAClD,OAAO;YACL,SAAS,EAAE,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC3C,SAAS,EAAE,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC3C,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC;SAC9C,CAAC;IACJ,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,MAAM,iBAAiB,GAAG,KAAK,CAAC,WAAW,CACzC,CAAC,cAA2C,EAAE,EAAE;QAC9C,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,8BAA8B;QAC9B,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE7B,IAAI,cAAc,CAAC,SAAS,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;YACtD,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,cAAc,CAAC,UAAU,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;YACxD,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,YAAY,CAAC,UAAU,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,aAAa,EAAE,CAAC;QAClB,CAAC;IACH,CAAC,EACD,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,CAAC,CAC3C,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACvC,YAAY,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IACzD,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACvC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,sBAAsB;IACrD,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,OAAO;QACL,WAAW;QACX,iBAAiB;QACjB,SAAS;QACT,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useTrack - Get a stable, memoized track function
|
|
3
|
+
*
|
|
4
|
+
* Returns a track function that doesn't cause re-renders when passed to child components.
|
|
5
|
+
* Prevents unnecessary re-renders compared to using useCallback.
|
|
6
|
+
*/
|
|
7
|
+
import type { TrackFunction } from '../types';
|
|
8
|
+
export declare function useTrack(): TrackFunction;
|
|
9
|
+
//# sourceMappingURL=useTrack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTrack.d.ts","sourceRoot":"","sources":["../../../../src/react/hooks/useTrack.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,wBAAgB,QAAQ,IAAI,aAAa,CAYxC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useTrack - Get a stable, memoized track function
|
|
3
|
+
*
|
|
4
|
+
* Returns a track function that doesn't cause re-renders when passed to child components.
|
|
5
|
+
* Prevents unnecessary re-renders compared to using useCallback.
|
|
6
|
+
*/
|
|
7
|
+
import * as React from 'react';
|
|
8
|
+
import { useGrainAnalytics } from './useGrainAnalytics';
|
|
9
|
+
export function useTrack() {
|
|
10
|
+
const client = useGrainAnalytics();
|
|
11
|
+
// Create stable track function that won't change across renders
|
|
12
|
+
const track = React.useCallback(async (eventName, properties, options) => {
|
|
13
|
+
await client.track(eventName, properties, options);
|
|
14
|
+
}, [client]);
|
|
15
|
+
return track;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=useTrack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTrack.js","sourceRoot":"","sources":["../../../../src/react/hooks/useTrack.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,UAAU,QAAQ;IACtB,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IAEnC,gEAAgE;IAChE,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAC7B,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE;QACvC,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC,EACD,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grain Analytics React Hooks
|
|
3
|
+
*
|
|
4
|
+
* React integration for @grainql/analytics-web
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```tsx
|
|
8
|
+
* import { GrainProvider, useConfig, useTrack } from '@grainql/analytics-web/react';
|
|
9
|
+
*
|
|
10
|
+
* // Pattern 1: Provider-managed client
|
|
11
|
+
* <GrainProvider config={{ tenantId: 'xxx' }}>
|
|
12
|
+
* <App />
|
|
13
|
+
* </GrainProvider>
|
|
14
|
+
*
|
|
15
|
+
* // Pattern 2: External client
|
|
16
|
+
* const grain = new GrainAnalytics({ tenantId: 'xxx' });
|
|
17
|
+
* <GrainProvider client={grain}>
|
|
18
|
+
* <App />
|
|
19
|
+
* </GrainProvider>
|
|
20
|
+
*
|
|
21
|
+
* // Use hooks in components
|
|
22
|
+
* function MyComponent() {
|
|
23
|
+
* const { value } = useConfig('hero_variant');
|
|
24
|
+
* const track = useTrack();
|
|
25
|
+
*
|
|
26
|
+
* return <button onClick={() => track('clicked')}>Click</button>;
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export { GrainProvider } from './GrainProvider';
|
|
31
|
+
export { useGrainAnalytics } from './hooks/useGrainAnalytics';
|
|
32
|
+
export { useConfig } from './hooks/useConfig';
|
|
33
|
+
export { useAllConfigs } from './hooks/useAllConfigs';
|
|
34
|
+
export { useTrack } from './hooks/useTrack';
|
|
35
|
+
export { useConsent } from './hooks/useConsent';
|
|
36
|
+
export { usePrivacyPreferences } from './hooks/usePrivacyPreferences';
|
|
37
|
+
export { useDataDeletion } from './hooks/useDataDeletion';
|
|
38
|
+
export { ConsentBanner } from './components/ConsentBanner';
|
|
39
|
+
export { PrivacyPreferenceCenter } from './components/PrivacyPreferenceCenter';
|
|
40
|
+
export { CookieNotice } from './components/CookieNotice';
|
|
41
|
+
export type { GrainProviderProps, UseConfigOptions, UseConfigResult, UseAllConfigsOptions, UseAllConfigsResult, TrackFunction, } from './types';
|
|
42
|
+
export type { ConsentBannerProps } from './components/ConsentBanner';
|
|
43
|
+
export type { PrivacyPreferenceCenterProps } from './components/PrivacyPreferenceCenter';
|
|
44
|
+
export type { CookieNoticeProps } from './components/CookieNotice';
|
|
45
|
+
export type { PrivacyPreferences } from './hooks/usePrivacyPreferences';
|
|
46
|
+
export type { DataDeletionOptions } from './hooks/useDataDeletion';
|
|
47
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,aAAa,GACd,MAAM,SAAS,CAAC;AAGjB,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,YAAY,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AACzF,YAAY,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,YAAY,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxE,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grain Analytics React Hooks
|
|
3
|
+
*
|
|
4
|
+
* React integration for @grainql/analytics-web
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```tsx
|
|
8
|
+
* import { GrainProvider, useConfig, useTrack } from '@grainql/analytics-web/react';
|
|
9
|
+
*
|
|
10
|
+
* // Pattern 1: Provider-managed client
|
|
11
|
+
* <GrainProvider config={{ tenantId: 'xxx' }}>
|
|
12
|
+
* <App />
|
|
13
|
+
* </GrainProvider>
|
|
14
|
+
*
|
|
15
|
+
* // Pattern 2: External client
|
|
16
|
+
* const grain = new GrainAnalytics({ tenantId: 'xxx' });
|
|
17
|
+
* <GrainProvider client={grain}>
|
|
18
|
+
* <App />
|
|
19
|
+
* </GrainProvider>
|
|
20
|
+
*
|
|
21
|
+
* // Use hooks in components
|
|
22
|
+
* function MyComponent() {
|
|
23
|
+
* const { value } = useConfig('hero_variant');
|
|
24
|
+
* const track = useTrack();
|
|
25
|
+
*
|
|
26
|
+
* return <button onClick={() => track('clicked')}>Click</button>;
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
// Provider
|
|
31
|
+
export { GrainProvider } from './GrainProvider';
|
|
32
|
+
// Hooks
|
|
33
|
+
export { useGrainAnalytics } from './hooks/useGrainAnalytics';
|
|
34
|
+
export { useConfig } from './hooks/useConfig';
|
|
35
|
+
export { useAllConfigs } from './hooks/useAllConfigs';
|
|
36
|
+
export { useTrack } from './hooks/useTrack';
|
|
37
|
+
// Privacy hooks
|
|
38
|
+
export { useConsent } from './hooks/useConsent';
|
|
39
|
+
export { usePrivacyPreferences } from './hooks/usePrivacyPreferences';
|
|
40
|
+
export { useDataDeletion } from './hooks/useDataDeletion';
|
|
41
|
+
// Privacy components
|
|
42
|
+
export { ConsentBanner } from './components/ConsentBanner';
|
|
43
|
+
export { PrivacyPreferenceCenter } from './components/PrivacyPreferenceCenter';
|
|
44
|
+
export { CookieNotice } from './components/CookieNotice';
|
|
45
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,WAAW;AACX,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,QAAQ;AACR,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,gBAAgB;AAChB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,qBAAqB;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React-specific types for Grain Analytics
|
|
3
|
+
*/
|
|
4
|
+
import type { GrainAnalytics, GrainConfig, SendEventOptions } from '../index';
|
|
5
|
+
export interface GrainProviderProps {
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
client?: GrainAnalytics;
|
|
8
|
+
config?: GrainConfig;
|
|
9
|
+
}
|
|
10
|
+
export interface UseConfigOptions {
|
|
11
|
+
forceRefresh?: boolean;
|
|
12
|
+
immediateKeys?: string[];
|
|
13
|
+
properties?: Record<string, string>;
|
|
14
|
+
}
|
|
15
|
+
export interface UseConfigResult {
|
|
16
|
+
value: string | undefined;
|
|
17
|
+
isRefreshing: boolean;
|
|
18
|
+
error: Error | null;
|
|
19
|
+
refresh: () => Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export interface UseAllConfigsOptions {
|
|
22
|
+
forceRefresh?: boolean;
|
|
23
|
+
immediateKeys?: string[];
|
|
24
|
+
properties?: Record<string, string>;
|
|
25
|
+
}
|
|
26
|
+
export interface UseAllConfigsResult {
|
|
27
|
+
configs: Record<string, string>;
|
|
28
|
+
isRefreshing: boolean;
|
|
29
|
+
error: Error | null;
|
|
30
|
+
refresh: () => Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
export type TrackFunction = (eventName: string, properties?: Record<string, unknown>, options?: SendEventOptions) => Promise<void>;
|
|
33
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/react/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE9E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,MAAM,aAAa,GAAG,CAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,OAAO,CAAC,EAAE,gBAAgB,KACvB,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/react/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heartbeat Manager for Grain Analytics
|
|
3
|
+
* Tracks session activity with consent-aware behavior
|
|
4
|
+
*/
|
|
5
|
+
import type { ActivityDetector } from './activity';
|
|
6
|
+
export interface HeartbeatConfig {
|
|
7
|
+
activeInterval: number;
|
|
8
|
+
inactiveInterval: number;
|
|
9
|
+
debug?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface HeartbeatTracker {
|
|
12
|
+
trackSystemEvent(eventName: string, properties: Record<string, unknown>): void;
|
|
13
|
+
hasConsent(category?: string): boolean;
|
|
14
|
+
getEffectiveUserId(): string;
|
|
15
|
+
getEphemeralSessionId(): string;
|
|
16
|
+
getCurrentPage(): string | null;
|
|
17
|
+
getEventCountSinceLastHeartbeat(): number;
|
|
18
|
+
resetEventCountSinceLastHeartbeat(): void;
|
|
19
|
+
}
|
|
20
|
+
export declare class HeartbeatManager {
|
|
21
|
+
private config;
|
|
22
|
+
private tracker;
|
|
23
|
+
private activityDetector;
|
|
24
|
+
private heartbeatTimer;
|
|
25
|
+
private isDestroyed;
|
|
26
|
+
private lastHeartbeatTime;
|
|
27
|
+
private currentInterval;
|
|
28
|
+
constructor(tracker: HeartbeatTracker, activityDetector: ActivityDetector, config: HeartbeatConfig);
|
|
29
|
+
/**
|
|
30
|
+
* Schedule the next heartbeat based on current activity
|
|
31
|
+
*/
|
|
32
|
+
private scheduleNextHeartbeat;
|
|
33
|
+
/**
|
|
34
|
+
* Send heartbeat event
|
|
35
|
+
*/
|
|
36
|
+
private sendHeartbeat;
|
|
37
|
+
/**
|
|
38
|
+
* Destroy the heartbeat manager
|
|
39
|
+
*/
|
|
40
|
+
destroy(): void;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=heartbeat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/E,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACvC,kBAAkB,IAAI,MAAM,CAAC;IAC7B,qBAAqB,IAAI,MAAM,CAAC;IAChC,cAAc,IAAI,MAAM,GAAG,IAAI,CAAC;IAChC,+BAA+B,IAAI,MAAM,CAAC;IAC1C,iCAAiC,IAAI,IAAI,CAAC;CAC3C;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,eAAe,CAAS;gBAG9B,OAAO,EAAE,gBAAgB,EACzB,gBAAgB,EAAE,gBAAgB,EAClC,MAAM,EAAE,eAAe;IAYzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyB7B;;OAEG;IACH,OAAO,CAAC,aAAa;IAqCrB;;OAEG;IACH,OAAO,IAAI,IAAI;CAchB"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
* Grain Analytics Web SDK
|
|
3
3
|
* A lightweight, dependency-free TypeScript SDK for sending analytics events to Grain's REST API
|
|
4
4
|
*/
|
|
5
|
+
import { ConsentState, ConsentMode } from './consent';
|
|
6
|
+
import { CookieConfig } from './cookies';
|
|
7
|
+
import { type HeartbeatTracker } from './heartbeat';
|
|
8
|
+
import { type PageTracker } from './page-tracking';
|
|
5
9
|
export interface GrainEvent {
|
|
6
10
|
eventName: string;
|
|
7
11
|
userId?: string;
|
|
@@ -17,6 +21,7 @@ export type AuthStrategy = 'NONE' | 'SERVER_SIDE' | 'JWT';
|
|
|
17
21
|
export interface AuthProvider {
|
|
18
22
|
getToken(): Promise<string> | string;
|
|
19
23
|
}
|
|
24
|
+
export type { ConsentState, ConsentMode, CookieConfig };
|
|
20
25
|
export interface GrainConfig {
|
|
21
26
|
tenantId: string;
|
|
22
27
|
apiUrl?: string;
|
|
@@ -34,6 +39,18 @@ export interface GrainConfig {
|
|
|
34
39
|
configCacheKey?: string;
|
|
35
40
|
configRefreshInterval?: number;
|
|
36
41
|
enableConfigCache?: boolean;
|
|
42
|
+
consentMode?: ConsentMode;
|
|
43
|
+
waitForConsent?: boolean;
|
|
44
|
+
enableCookies?: boolean;
|
|
45
|
+
cookieOptions?: CookieConfig;
|
|
46
|
+
anonymizeIP?: boolean;
|
|
47
|
+
disableAutoProperties?: boolean;
|
|
48
|
+
allowedProperties?: string[];
|
|
49
|
+
enableHeartbeat?: boolean;
|
|
50
|
+
heartbeatActiveInterval?: number;
|
|
51
|
+
heartbeatInactiveInterval?: number;
|
|
52
|
+
enableAutoPageView?: boolean;
|
|
53
|
+
stripQueryParams?: boolean;
|
|
37
54
|
}
|
|
38
55
|
export interface SendEventOptions {
|
|
39
56
|
flush?: boolean;
|
|
@@ -177,9 +194,10 @@ export interface FormattedError {
|
|
|
177
194
|
context: string;
|
|
178
195
|
originalError?: unknown;
|
|
179
196
|
}
|
|
180
|
-
export declare class GrainAnalytics {
|
|
197
|
+
export declare class GrainAnalytics implements HeartbeatTracker, PageTracker {
|
|
181
198
|
private config;
|
|
182
199
|
private eventQueue;
|
|
200
|
+
private waitingForConsentQueue;
|
|
183
201
|
private flushTimer;
|
|
184
202
|
private isDestroyed;
|
|
185
203
|
private globalUserId;
|
|
@@ -188,6 +206,13 @@ export declare class GrainAnalytics {
|
|
|
188
206
|
private configRefreshTimer;
|
|
189
207
|
private configChangeListeners;
|
|
190
208
|
private configFetchPromise;
|
|
209
|
+
private consentManager;
|
|
210
|
+
private cookiesEnabled;
|
|
211
|
+
private activityDetector;
|
|
212
|
+
private heartbeatManager;
|
|
213
|
+
private pageTrackingManager;
|
|
214
|
+
private ephemeralSessionId;
|
|
215
|
+
private eventCountSinceLastHeartbeat;
|
|
191
216
|
constructor(config: GrainConfig);
|
|
192
217
|
private validateConfig;
|
|
193
218
|
/**
|
|
@@ -199,13 +224,18 @@ export declare class GrainAnalytics {
|
|
|
199
224
|
*/
|
|
200
225
|
private generateAnonymousUserId;
|
|
201
226
|
/**
|
|
202
|
-
* Initialize persistent anonymous user ID from
|
|
227
|
+
* Initialize persistent anonymous user ID from cookies or localStorage
|
|
228
|
+
* Priority: Cookie → localStorage → generate new
|
|
203
229
|
*/
|
|
204
230
|
private initializePersistentAnonymousUserId;
|
|
231
|
+
/**
|
|
232
|
+
* Save persistent anonymous user ID to cookie and/or localStorage
|
|
233
|
+
*/
|
|
234
|
+
private savePersistentAnonymousUserId;
|
|
205
235
|
/**
|
|
206
236
|
* Get the effective user ID (global userId or persistent anonymous ID)
|
|
207
237
|
*/
|
|
208
|
-
private
|
|
238
|
+
private getEffectiveUserIdInternal;
|
|
209
239
|
private log;
|
|
210
240
|
/**
|
|
211
241
|
* Create error digest from events
|
|
@@ -231,11 +261,51 @@ export declare class GrainAnalytics {
|
|
|
231
261
|
private sendEventsWithBeacon;
|
|
232
262
|
private startFlushTimer;
|
|
233
263
|
private setupBeforeUnload;
|
|
264
|
+
/**
|
|
265
|
+
* Initialize automatic tracking (heartbeat and page views)
|
|
266
|
+
*/
|
|
267
|
+
private initializeAutomaticTracking;
|
|
268
|
+
/**
|
|
269
|
+
* Handle consent granted - upgrade ephemeral session to persistent user
|
|
270
|
+
*/
|
|
271
|
+
private handleConsentGranted;
|
|
272
|
+
/**
|
|
273
|
+
* Track system events that bypass consent checks (for necessary/functional tracking)
|
|
274
|
+
*/
|
|
275
|
+
trackSystemEvent(eventName: string, properties: Record<string, unknown>): void;
|
|
276
|
+
/**
|
|
277
|
+
* Get ephemeral session ID (memory-only, not persisted)
|
|
278
|
+
*/
|
|
279
|
+
getEphemeralSessionId(): string;
|
|
280
|
+
/**
|
|
281
|
+
* Get the current page path from page tracker
|
|
282
|
+
*/
|
|
283
|
+
getCurrentPage(): string | null;
|
|
284
|
+
/**
|
|
285
|
+
* Get event count since last heartbeat
|
|
286
|
+
*/
|
|
287
|
+
getEventCountSinceLastHeartbeat(): number;
|
|
288
|
+
/**
|
|
289
|
+
* Reset event count since last heartbeat
|
|
290
|
+
*/
|
|
291
|
+
resetEventCountSinceLastHeartbeat(): void;
|
|
292
|
+
/**
|
|
293
|
+
* Get the effective user ID (public method)
|
|
294
|
+
*/
|
|
295
|
+
getEffectiveUserId(): string;
|
|
296
|
+
/**
|
|
297
|
+
* Get the session ID (ephemeral or persistent based on consent)
|
|
298
|
+
*/
|
|
299
|
+
getSessionId(): string;
|
|
234
300
|
/**
|
|
235
301
|
* Track an analytics event
|
|
236
302
|
*/
|
|
237
303
|
track(eventName: string, properties?: Record<string, unknown>, options?: SendEventOptions): Promise<void>;
|
|
238
304
|
track(event: GrainEvent, options?: SendEventOptions): Promise<void>;
|
|
305
|
+
/**
|
|
306
|
+
* Flush events that were waiting for consent
|
|
307
|
+
*/
|
|
308
|
+
private flushWaitingForConsentQueue;
|
|
239
309
|
/**
|
|
240
310
|
* Identify a user (sets userId for subsequent events)
|
|
241
311
|
*/
|
|
@@ -384,6 +454,33 @@ export declare class GrainAnalytics {
|
|
|
384
454
|
* Split events array into chunks of specified size
|
|
385
455
|
*/
|
|
386
456
|
private chunkEvents;
|
|
457
|
+
/**
|
|
458
|
+
* Grant consent for tracking
|
|
459
|
+
* @param categories - Optional array of consent categories (e.g., ['analytics', 'functional'])
|
|
460
|
+
*/
|
|
461
|
+
grantConsent(categories?: string[]): void;
|
|
462
|
+
/**
|
|
463
|
+
* Revoke consent for tracking (opt-out)
|
|
464
|
+
* @param categories - Optional array of categories to revoke (if not provided, revokes all)
|
|
465
|
+
*/
|
|
466
|
+
revokeConsent(categories?: string[]): void;
|
|
467
|
+
/**
|
|
468
|
+
* Get current consent state
|
|
469
|
+
*/
|
|
470
|
+
getConsentState(): ConsentState | null;
|
|
471
|
+
/**
|
|
472
|
+
* Check if user has granted consent
|
|
473
|
+
* @param category - Optional category to check (if not provided, checks general consent)
|
|
474
|
+
*/
|
|
475
|
+
hasConsent(category?: string): boolean;
|
|
476
|
+
/**
|
|
477
|
+
* Add listener for consent state changes
|
|
478
|
+
*/
|
|
479
|
+
onConsentChange(listener: (state: ConsentState) => void): void;
|
|
480
|
+
/**
|
|
481
|
+
* Remove consent change listener
|
|
482
|
+
*/
|
|
483
|
+
offConsentChange(listener: (state: ConsentState) => void): void;
|
|
387
484
|
/**
|
|
388
485
|
* Destroy the client and clean up resources
|
|
389
486
|
*/
|