fix: send events tracked before init

This commit is contained in:
Bogdan Ivanov 2024-09-18 21:54:17 +03:00
parent f40989bc42
commit f782884579

View file

@ -1,6 +1,6 @@
'use client'; 'use client';
import { createContext, useContext, useEffect } from 'react'; import { createContext, useContext, useEffect, useState } from 'react';
import { getApiUrl, inMemorySessionId, sendEvent, validateAppKey, type AptabaseOptions } from '../../shared'; import { getApiUrl, inMemorySessionId, sendEvent, validateAppKey, type AptabaseOptions } from '../../shared';
// Session expires after 1 hour of inactivity // Session expires after 1 hour of inactivity
@ -10,10 +10,12 @@ const sdkVersion = `aptabase-react@${process.env.PKG_VERSION}`;
let _appKey = ''; let _appKey = '';
let _apiUrl: string | undefined; let _apiUrl: string | undefined;
let _options: AptabaseOptions | undefined; let _options: AptabaseOptions | undefined;
let _eventsBeforeInit: { [key: string]: Record<string, string | number | boolean> | undefined } = {};
type ContextProps = { type ContextProps = {
appKey?: string; appKey?: string;
options?: AptabaseOptions; options?: AptabaseOptions;
isInitialized: boolean;
}; };
function init(appKey: string, options?: AptabaseOptions) { function init(appKey: string, options?: AptabaseOptions) {
@ -22,6 +24,11 @@ function init(appKey: string, options?: AptabaseOptions) {
_apiUrl = options?.apiUrl ?? getApiUrl(appKey, options); _apiUrl = options?.apiUrl ?? getApiUrl(appKey, options);
_appKey = appKey; _appKey = appKey;
_options = options; _options = options;
Object.keys(_eventsBeforeInit).forEach((eventName) => {
trackEvent(eventName, _eventsBeforeInit[eventName]);
});
_eventsBeforeInit = {};
} }
async function trackEvent(eventName: string, props?: Record<string, string | number | boolean>): Promise<void> { async function trackEvent(eventName: string, props?: Record<string, string | number | boolean>): Promise<void> {
@ -41,7 +48,12 @@ async function trackEvent(eventName: string, props?: Record<string, string | num
}); });
} }
const AptabaseContext = createContext<ContextProps>({}); function trackEventBeforeInit(eventName: string, props?: Record<string, string | number | boolean>): Promise<void> {
_eventsBeforeInit[eventName] = props;
return Promise.resolve();
}
const AptabaseContext = createContext<ContextProps>({ isInitialized: false });
type Props = { type Props = {
appKey: string; appKey: string;
@ -56,11 +68,14 @@ export type AptabaseClient = {
}; };
export function AptabaseProvider({ appKey, options, children }: Props) { export function AptabaseProvider({ appKey, options, children }: Props) {
const [isInitialized, setIsInitialized] = useState(false);
useEffect(() => { useEffect(() => {
init(appKey, options); init(appKey, options);
setIsInitialized(true);
}, [appKey, options]); }, [appKey, options]);
return <AptabaseContext.Provider value={{ appKey, options }}>{children}</AptabaseContext.Provider>; return <AptabaseContext.Provider value={{ appKey, options, isInitialized }}>{children}</AptabaseContext.Provider>;
} }
export function useAptabase(): AptabaseClient { export function useAptabase(): AptabaseClient {
@ -77,6 +92,12 @@ export function useAptabase(): AptabaseClient {
}; };
} }
if (!ctx.isInitialized) {
return {
trackEvent: trackEventBeforeInit,
};
}
return { return {
trackEvent, trackEvent,
}; };