humanbehavior-js 0.2.0 → 0.2.2

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 (31) hide show
  1. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/api.js +312 -0
  2. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/api.js.map +1 -0
  3. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/index.js +19 -0
  4. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/index.js.map +1 -0
  5. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/react/index.js +222 -0
  6. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/react/index.js.map +1 -0
  7. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/redact.js +416 -0
  8. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/redact.js.map +1 -0
  9. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/tracker.js +950 -0
  10. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/tracker.js.map +1 -0
  11. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/utils/logger.js +117 -0
  12. package/.rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist/utils/logger.js.map +1 -0
  13. package/dist/cjs/index.js +2 -6
  14. package/dist/cjs/index.js.map +1 -1
  15. package/dist/cjs/react/index.js +26 -451
  16. package/dist/cjs/react/index.js.map +1 -1
  17. package/dist/esm/index.js +2 -6
  18. package/dist/esm/index.js.map +1 -1
  19. package/dist/esm/react/index.js +5 -430
  20. package/dist/esm/react/index.js.map +1 -1
  21. package/dist/index.min.js +15 -1
  22. package/dist/index.min.js.map +1 -1
  23. package/dist/types/index.d.ts +0 -4
  24. package/dist/types/react/index.d.ts +2 -3
  25. package/package.json +10 -32
  26. package/rollup.config.js +106 -0
  27. package/simple-demo.html +26 -0
  28. package/simple-spa.html +658 -0
  29. package/src/index.ts +2 -2
  30. package/tsconfig.json +24 -0
  31. /package/{dist → .rollup.cache/Users/hudsonch/Desktop/HumanBehaviorInternship/humanbehavior-js/dist}/.tsbuildinfo +0 -0
@@ -0,0 +1,312 @@
1
+ import { __awaiter } from "tslib";
2
+ import { logError, logInfo, logDebug } from './utils/logger';
3
+ export const MAX_CHUNK_SIZE_BYTES = 1024 * 1024; // 1MB chunk size - more conservative
4
+ export function isChunkSizeExceeded(currentChunk, newEvent, sessionId) {
5
+ const nextChunkSize = new TextEncoder().encode(JSON.stringify({
6
+ sessionId,
7
+ events: [...currentChunk, newEvent]
8
+ })).length;
9
+ return nextChunkSize > MAX_CHUNK_SIZE_BYTES;
10
+ }
11
+ export function validateSingleEventSize(event, sessionId) {
12
+ const singleEventSize = new TextEncoder().encode(JSON.stringify({
13
+ sessionId,
14
+ events: [event]
15
+ })).length;
16
+ if (singleEventSize > MAX_CHUNK_SIZE_BYTES) {
17
+ // Instead of throwing, log a warning and suggest reducing event size
18
+ console.warn(`Single event size (${singleEventSize} bytes) exceeds maximum chunk size (${MAX_CHUNK_SIZE_BYTES} bytes). Consider reducing event data size.`);
19
+ }
20
+ }
21
+ export function splitLargeEvent(event, sessionId) {
22
+ const eventSize = new TextEncoder().encode(JSON.stringify({
23
+ sessionId,
24
+ events: [event]
25
+ })).length;
26
+ if (eventSize <= MAX_CHUNK_SIZE_BYTES) {
27
+ return [event];
28
+ }
29
+ // If event is too large, try to split it by removing large properties
30
+ const simplifiedEvent = Object.assign({}, event);
31
+ // Remove potentially large properties
32
+ const largeProperties = ['screenshot', 'html', 'dom', 'fullText', 'innerHTML', 'outerHTML'];
33
+ largeProperties.forEach(prop => {
34
+ if (simplifiedEvent[prop]) {
35
+ delete simplifiedEvent[prop];
36
+ }
37
+ });
38
+ // Check if simplified event is now small enough
39
+ const simplifiedSize = new TextEncoder().encode(JSON.stringify({
40
+ sessionId,
41
+ events: [simplifiedEvent]
42
+ })).length;
43
+ if (simplifiedSize <= MAX_CHUNK_SIZE_BYTES) {
44
+ return [simplifiedEvent];
45
+ }
46
+ // If still too large, create a minimal event
47
+ const minimalEvent = Object.assign({ type: event.type, timestamp: event.timestamp, url: event.url, pathname: event.pathname }, Object.fromEntries(Object.entries(event).filter(([key, value]) => !largeProperties.includes(key) &&
48
+ typeof value !== 'object' &&
49
+ typeof value !== 'string' ||
50
+ (typeof value === 'string' && value.length < 1000))));
51
+ return [minimalEvent];
52
+ }
53
+ export class HumanBehaviorAPI {
54
+ constructor({ apiKey, ingestionUrl }) {
55
+ this.apiKey = apiKey;
56
+ this.baseUrl = ingestionUrl;
57
+ }
58
+ init(sessionId, userId) {
59
+ return __awaiter(this, void 0, void 0, function* () {
60
+ // Get current page URL and referrer if in browser environment
61
+ let entryURL = null;
62
+ let referrer = null;
63
+ if (typeof window !== 'undefined') {
64
+ entryURL = window.location.href;
65
+ referrer = document.referrer;
66
+ }
67
+ console.log('API init called with:', { sessionId, userId, entryURL, referrer, baseUrl: this.baseUrl });
68
+ try {
69
+ const response = yield fetch(`${this.baseUrl}/api/ingestion/init`, {
70
+ method: 'POST',
71
+ headers: {
72
+ 'Content-Type': 'application/json',
73
+ 'Authorization': `Bearer ${this.apiKey}`,
74
+ 'Referer': referrer || ''
75
+ },
76
+ body: JSON.stringify({
77
+ sessionId: sessionId,
78
+ endUserId: userId,
79
+ entryURL: entryURL,
80
+ referrer: referrer
81
+ })
82
+ });
83
+ console.log('API init response status:', response.status);
84
+ if (!response.ok) {
85
+ const errorText = yield response.text();
86
+ console.error('API init failed:', response.status, errorText);
87
+ throw new Error(`Failed to initialize ingestion: ${response.statusText} - ${errorText}`);
88
+ }
89
+ const responseJson = yield response.json();
90
+ console.log('API init success:', responseJson);
91
+ return {
92
+ sessionId: responseJson.sessionId,
93
+ endUserId: responseJson.endUserId
94
+ };
95
+ }
96
+ catch (error) {
97
+ console.error('API init error:', error);
98
+ throw error;
99
+ }
100
+ });
101
+ }
102
+ sendEvents(events, sessionId, userId) {
103
+ return __awaiter(this, void 0, void 0, function* () {
104
+ const response = yield fetch(`${this.baseUrl}/api/ingestion/events`, {
105
+ method: 'POST',
106
+ headers: {
107
+ 'Content-Type': 'application/json',
108
+ 'Authorization': `Bearer ${this.apiKey}`
109
+ },
110
+ body: JSON.stringify({
111
+ sessionId,
112
+ events: events,
113
+ endUserId: userId
114
+ })
115
+ });
116
+ if (!response.ok) {
117
+ throw new Error(`Failed to send events: ${response.statusText}`);
118
+ }
119
+ });
120
+ }
121
+ sendEventsChunked(events, sessionId, userId) {
122
+ return __awaiter(this, void 0, void 0, function* () {
123
+ try {
124
+ const results = [];
125
+ let currentChunk = [];
126
+ for (const event of events) {
127
+ if (isChunkSizeExceeded(currentChunk, event, sessionId)) {
128
+ // If current chunk is not empty, send it first
129
+ if (currentChunk.length > 0) {
130
+ const response = yield fetch(`${this.baseUrl}/api/ingestion/events`, {
131
+ method: 'POST',
132
+ headers: {
133
+ 'Content-Type': 'application/json',
134
+ 'Authorization': `Bearer ${this.apiKey}`
135
+ },
136
+ body: JSON.stringify({
137
+ sessionId,
138
+ events: currentChunk,
139
+ endUserId: userId
140
+ })
141
+ });
142
+ if (!response.ok) {
143
+ throw new Error(`Failed to send events: ${response.statusText}`);
144
+ }
145
+ results.push(yield response.json());
146
+ currentChunk = [];
147
+ }
148
+ // Handle large events by splitting them
149
+ const splitEvents = splitLargeEvent(event, sessionId);
150
+ // Start new chunk with the split events
151
+ currentChunk = splitEvents;
152
+ }
153
+ else {
154
+ // Add event to current chunk
155
+ currentChunk.push(event);
156
+ }
157
+ }
158
+ // Send any remaining events
159
+ if (currentChunk.length > 0) {
160
+ const response = yield fetch(`${this.baseUrl}/api/ingestion/events`, {
161
+ method: 'POST',
162
+ headers: {
163
+ 'Content-Type': 'application/json',
164
+ 'Authorization': `Bearer ${this.apiKey}`
165
+ },
166
+ body: JSON.stringify({
167
+ sessionId,
168
+ events: currentChunk,
169
+ endUserId: userId
170
+ })
171
+ });
172
+ if (!response.ok) {
173
+ throw new Error(`Failed to send events: ${response.statusText}`);
174
+ }
175
+ results.push(yield response.json());
176
+ }
177
+ return results.flat();
178
+ }
179
+ catch (error) {
180
+ logError('Error sending events:', error);
181
+ throw error;
182
+ }
183
+ });
184
+ }
185
+ sendUserData(userId, userData, sessionId) {
186
+ return __awaiter(this, void 0, void 0, function* () {
187
+ try {
188
+ const response = yield fetch(`${this.baseUrl}/api/ingestion/user`, {
189
+ method: 'POST',
190
+ headers: {
191
+ 'Content-Type': 'application/json',
192
+ 'Authorization': `Bearer ${this.apiKey}`
193
+ },
194
+ body: JSON.stringify({
195
+ userId: userId,
196
+ userAttributes: userData,
197
+ sessionId: sessionId
198
+ })
199
+ });
200
+ if (!response.ok) {
201
+ throw new Error(`Failed to send user data: ${response.statusText} with API key: ${this.apiKey}`);
202
+ }
203
+ return yield response.json();
204
+ }
205
+ catch (error) {
206
+ logError('Error sending user data:', error);
207
+ throw error;
208
+ }
209
+ });
210
+ }
211
+ sendUserAuth(userId, userData, sessionId, authFields) {
212
+ return __awaiter(this, void 0, void 0, function* () {
213
+ try {
214
+ const response = yield fetch(`${this.baseUrl}/api/ingestion/user/auth`, {
215
+ method: 'POST',
216
+ headers: {
217
+ 'Content-Type': 'application/json',
218
+ 'Authorization': `Bearer ${this.apiKey}`
219
+ },
220
+ body: JSON.stringify({
221
+ userId: userId,
222
+ userAttributes: userData,
223
+ sessionId: sessionId,
224
+ authFields: authFields
225
+ })
226
+ });
227
+ if (!response.ok) {
228
+ throw new Error(`Failed to authenticate user: ${response.statusText} with API key: ${this.apiKey}`);
229
+ }
230
+ // Returns: { success: true, message: '...', userId: '...' }
231
+ return yield response.json();
232
+ }
233
+ catch (error) {
234
+ logError('Error authenticating user:', error);
235
+ throw error;
236
+ }
237
+ });
238
+ }
239
+ sendBeaconEvents(events, sessionId) {
240
+ // Create JSON payload that matches the server's expected format
241
+ const payload = {
242
+ sessionId: sessionId,
243
+ events: events,
244
+ endUserId: null, // Beacon doesn't have user context
245
+ apiKey: this.apiKey // Include API key in body since beacon can't use headers
246
+ };
247
+ // Convert to Blob for sendBeacon
248
+ const blob = new Blob([JSON.stringify(payload)], {
249
+ type: 'application/json'
250
+ });
251
+ const success = navigator.sendBeacon(`${this.baseUrl}/api/ingestion/events`, blob);
252
+ return success;
253
+ }
254
+ sendCustomEvent(sessionId, eventName, eventProperties) {
255
+ return __awaiter(this, void 0, void 0, function* () {
256
+ logInfo('[SDK] Sending custom event', { sessionId, eventName, eventProperties });
257
+ try {
258
+ const response = yield fetch(`${this.baseUrl}/api/ingestion/customEvent`, {
259
+ method: 'POST',
260
+ headers: {
261
+ 'Content-Type': 'application/json',
262
+ 'Authorization': `Bearer ${this.apiKey}`
263
+ },
264
+ body: JSON.stringify({
265
+ sessionId: sessionId,
266
+ eventName: eventName,
267
+ eventProperties: eventProperties || {}
268
+ })
269
+ });
270
+ logInfo('[SDK] Custom event response', { status: response.status, statusText: response.statusText });
271
+ if (!response.ok) {
272
+ const errorText = yield response.text();
273
+ logError('[SDK] Failed to send custom event', { status: response.status, statusText: response.statusText, errorText });
274
+ throw new Error(`Failed to send custom event: ${response.status} ${response.statusText} - ${errorText}`);
275
+ }
276
+ const json = yield response.json();
277
+ logDebug('[SDK] Custom event success', json);
278
+ return json;
279
+ }
280
+ catch (error) {
281
+ logError('[SDK] Error sending custom event', error, { sessionId, eventName, eventProperties });
282
+ throw error;
283
+ }
284
+ });
285
+ }
286
+ sendCustomEventBatch(sessionId, events) {
287
+ return __awaiter(this, void 0, void 0, function* () {
288
+ try {
289
+ const response = yield fetch(`${this.baseUrl}/api/ingestion/customEvent/batch`, {
290
+ method: 'POST',
291
+ headers: {
292
+ 'Content-Type': 'application/json',
293
+ 'Authorization': `Bearer ${this.apiKey}`
294
+ },
295
+ body: JSON.stringify({
296
+ sessionId: sessionId,
297
+ events: events
298
+ })
299
+ });
300
+ if (!response.ok) {
301
+ throw new Error(`Failed to send custom event batch: ${response.statusText}`);
302
+ }
303
+ return yield response.json();
304
+ }
305
+ catch (error) {
306
+ logError('Error sending custom event batch:', error);
307
+ throw error;
308
+ }
309
+ });
310
+ }
311
+ }
312
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Main entry point for the HumanBehavior SDK
3
+ */
4
+ import { HumanBehaviorTracker } from './tracker';
5
+ // Export everything from the tracker module
6
+ export * from './tracker';
7
+ // Export everything from the API module
8
+ export * from './api';
9
+ // Export redaction functionality
10
+ export * from './redact';
11
+ // Export logger functionality
12
+ export * from './utils/logger';
13
+ // Export the tracker as the default export
14
+ export default HumanBehaviorTracker;
15
+ // For UMD builds, expose the main class globally
16
+ if (typeof window !== 'undefined') {
17
+ window.HumanBehaviorTracker = HumanBehaviorTracker;
18
+ }
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEjD,4CAA4C;AAC5C,cAAc,WAAW,CAAC;AAE1B,wCAAwC;AACxC,cAAc,OAAO,CAAC;AAEtB,iCAAiC;AACjC,cAAc,UAAU,CAAC;AAEzB,8BAA8B;AAC9B,cAAc,gBAAgB,CAAC;AAE/B,2CAA2C;AAC3C,eAAe,oBAAoB,CAAC;AAEpC,iDAAiD;AACjD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IACjC,MAAc,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,222 @@
1
+ import { __awaiter } from "tslib";
2
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useState, createContext, useContext, useCallback, useMemo, useRef } from "react";
4
+ import { HumanBehaviorTracker } from "..";
5
+ import { logError, logWarn, logDebug } from "../utils/logger";
6
+ // Check if we're in a browser environment
7
+ const isBrowser = () => typeof window !== 'undefined';
8
+ // Default context to prevent unnecessary re-renders
9
+ const defaultContext = {
10
+ humanBehavior: null,
11
+ queueEvent: (event) => {
12
+ // In server-side, just no-op
13
+ if (typeof window === 'undefined') {
14
+ return;
15
+ }
16
+ logWarn('HumanBehavior not initialized yet, event queued:', event);
17
+ }
18
+ };
19
+ const HumanBehaviorContext = createContext(null);
20
+ export const HumanBehaviorProvider = ({ apiKey, client, children, options }) => {
21
+ const [humanBehavior, setHumanBehavior] = useState(client || null);
22
+ const [eventQueue, setEventQueue] = useState([]);
23
+ const [isMounted, setIsMounted] = useState(false);
24
+ const [isInitialized, setIsInitialized] = useState(false);
25
+ // Use refs to avoid dependency issues in useEffect
26
+ const apiKeyRef = useRef(apiKey);
27
+ const clientRef = useRef(client);
28
+ const eventQueueRef = useRef(eventQueue);
29
+ // Update refs when props change
30
+ useEffect(() => {
31
+ apiKeyRef.current = apiKey;
32
+ clientRef.current = client;
33
+ }, [apiKey, client]);
34
+ // Update eventQueue ref when queue changes
35
+ useEffect(() => {
36
+ eventQueueRef.current = eventQueue;
37
+ }, [eventQueue]);
38
+ // Memoized queueEvent function to prevent unnecessary re-renders
39
+ const queueEvent = useCallback((event) => {
40
+ setEventQueue(prev => [...prev, event]);
41
+ }, []);
42
+ // Handle mounting state
43
+ useEffect(() => {
44
+ setIsMounted(true);
45
+ }, []);
46
+ useEffect(() => {
47
+ var _a;
48
+ // Only run in browser
49
+ if (!(isBrowser())) {
50
+ return;
51
+ }
52
+ // Skip if not mounted yet (handles Next.js hydration)
53
+ if (!isMounted) {
54
+ return;
55
+ }
56
+ // If client is provided, use that
57
+ if (clientRef.current) {
58
+ setHumanBehavior(clientRef.current);
59
+ setIsInitialized(true);
60
+ return;
61
+ }
62
+ // If no client is provided, apiKey is required
63
+ if (!apiKeyRef.current || apiKeyRef.current.trim() === '') {
64
+ logError("An apiKey is required when no client is provided");
65
+ return;
66
+ }
67
+ if (humanBehavior !== null) {
68
+ return;
69
+ }
70
+ // Create new tracker instance with the validated apiKey
71
+ const tracker = new HumanBehaviorTracker(apiKeyRef.current.trim(), 'https://ingest.humanbehavior.co');
72
+ setHumanBehavior(tracker);
73
+ // Wait for initialization to complete
74
+ (_a = tracker.initializationPromise) === null || _a === void 0 ? void 0 : _a.then(() => __awaiter(void 0, void 0, void 0, function* () {
75
+ yield tracker.start();
76
+ setIsInitialized(true);
77
+ // Process any queued events
78
+ const currentQueue = eventQueueRef.current;
79
+ if (currentQueue.length > 0) {
80
+ for (const event of currentQueue) {
81
+ if (event.type === 'identify') {
82
+ logDebug('Processing queued identify event', event.userProperties);
83
+ try {
84
+ yield tracker.addUserInfo(event.userProperties);
85
+ }
86
+ catch (error) {
87
+ logError('Failed to process queued user info:', error);
88
+ }
89
+ }
90
+ else {
91
+ tracker.addEvent(event);
92
+ }
93
+ }
94
+ setEventQueue([]); // Clear the queue
95
+ }
96
+ })).catch(error => {
97
+ logError('Failed to initialize HumanBehaviorTracker:', error);
98
+ });
99
+ }, [isMounted, humanBehavior]); // Removed apiKey, client, eventQueue from dependencies
100
+ // Memoized context value to prevent unnecessary re-renders
101
+ const contextValue = useMemo(() => {
102
+ if (!isMounted) {
103
+ return null;
104
+ }
105
+ if (!isInitialized) {
106
+ return null;
107
+ }
108
+ return humanBehavior;
109
+ }, [isMounted, isInitialized, humanBehavior]);
110
+ // If not in browser, render children without context
111
+ if (!(isBrowser())) {
112
+ return _jsx(_Fragment, { children: children });
113
+ }
114
+ return (_jsxs(HumanBehaviorContext.Provider, { value: contextValue, children: [_jsx(HumanBehaviorPageView, {}), children] }));
115
+ };
116
+ // No-op implementation for server-side
117
+ const serverSideImplementation = {
118
+ addEvent: () => { },
119
+ addUserInfo: () => __awaiter(void 0, void 0, void 0, function* () { }),
120
+ start: () => { },
121
+ stop: () => { },
122
+ viewLogs: () => { },
123
+ };
124
+ // Memoized queuing implementation for initialization period
125
+ const createQueuingImplementation = (queueEvent) => ({
126
+ addEvent: (event) => {
127
+ queueEvent(event);
128
+ },
129
+ addUserInfo: (userProperties) => __awaiter(void 0, void 0, void 0, function* () {
130
+ queueEvent({
131
+ type: 'identify',
132
+ userProperties,
133
+ });
134
+ }),
135
+ start: () => {
136
+ // Start will be called automatically when initialized
137
+ },
138
+ stop: () => {
139
+ // Stop is a no-op when not initialized
140
+ },
141
+ viewLogs: () => {
142
+ logWarn('Logs are not available until HumanBehaviorTracker is initialized');
143
+ }
144
+ });
145
+ export const useHumanBehavior = () => {
146
+ const tracker = useContext(HumanBehaviorContext);
147
+ if (!tracker) {
148
+ throw new Error('useHumanBehavior must be used within a HumanBehaviorProvider');
149
+ }
150
+ return tracker;
151
+ };
152
+ // Custom hook for managing redaction fields dynamically
153
+ export const useRedaction = () => {
154
+ const tracker = useHumanBehavior();
155
+ const setRedactedFields = useCallback((fields) => {
156
+ tracker.setRedactedFields(fields);
157
+ }, [tracker]);
158
+ const isRedactionActive = useCallback(() => {
159
+ return tracker.isRedactionActive();
160
+ }, [tracker]);
161
+ const getRedactedFields = useCallback(() => {
162
+ return tracker.getRedactedFields();
163
+ }, [tracker]);
164
+ return {
165
+ setRedactedFields,
166
+ isRedactionActive,
167
+ getRedactedFields
168
+ };
169
+ };
170
+ // Custom hook for managing user info
171
+ export const useUserTracking = () => {
172
+ const tracker = useHumanBehavior();
173
+ const addUserInfo = useCallback((userId, userProperties) => __awaiter(void 0, void 0, void 0, function* () {
174
+ try {
175
+ yield tracker.addUserInfo({ userId, userProperties });
176
+ return { success: true };
177
+ }
178
+ catch (error) {
179
+ logError('Failed to add user info:', error);
180
+ return { success: false, error };
181
+ }
182
+ }), [tracker]);
183
+ return {
184
+ addUserInfo
185
+ };
186
+ };
187
+ // Automatic page tracking component (similar to PostHog's PostHogPageView)
188
+ function HumanBehaviorPageView() {
189
+ const tracker = useContext(HumanBehaviorContext);
190
+ useEffect(() => {
191
+ if (tracker && typeof window !== 'undefined') {
192
+ // Track initial page load
193
+ tracker.trackPageView();
194
+ // Listen for route changes (for SPAs)
195
+ const handleRouteChange = () => {
196
+ tracker.trackPageView();
197
+ };
198
+ // Listen for popstate (back/forward navigation)
199
+ window.addEventListener('popstate', handleRouteChange);
200
+ // Listen for pushstate/replacestate (programmatic navigation)
201
+ const originalPushState = history.pushState;
202
+ const originalReplaceState = history.replaceState;
203
+ history.pushState = function (...args) {
204
+ originalPushState.apply(this, args);
205
+ handleRouteChange();
206
+ };
207
+ history.replaceState = function (...args) {
208
+ originalReplaceState.apply(this, args);
209
+ handleRouteChange();
210
+ };
211
+ return () => {
212
+ window.removeEventListener('popstate', handleRouteChange);
213
+ history.pushState = originalPushState;
214
+ history.replaceState = originalReplaceState;
215
+ };
216
+ }
217
+ }, [tracker]);
218
+ return null;
219
+ }
220
+ // Export the tracker class for direct use
221
+ export { HumanBehaviorTracker };
222
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.tsx"],"names":[],"mappings":"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"}