import { createContext, FC, useCallback, useContext, useEffect, useRef, useState } from "react"; import { Analytics, IAnalyticsConfig } from "./sdk"; import { IAbstractProvider, IAnalyticsProvider, IAppProps, IMonitoringProvider, IProvider } from "./types"; export interface IAnalyticsContext extends Pick, IAnalyticsProvider, IMonitoringProvider {} export interface IAnaliticsProviderProps { config: IAnalyticsConfig; appProps: IAppProps; children?: any; } /* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function */ export const AnalyticsContext = createContext({ identify: (identifier: string | number, email?: string, props?: object): void => {}, send: (event: string, data?: object): void => {}, capture: (exception: Error, fingerprint?: string[], tags?: object, extra?: object): void => {} }); /* eslint-enable @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function */ export const AnalyticsProvider: FC = ({ config, appProps, children }) => { const [sdk, setSDK] = useState(null); const configRef = useRef(config); const appPropsRef = useRef(appProps); const send = useCallback( (event: string, data?: object): void => { sdk?.send?.(event, data); }, [sdk] ); const capture = useCallback( (exception: Error, fingerprint?: string[], tags?: object, extra?: object): void => { sdk?.capture?.(exception, fingerprint, tags, extra); }, [sdk] ); const identify = useCallback( (identifier: string | number, email?: string, props?: object): void => { sdk?.identify?.(identifier, email, props); }, [sdk] ); useEffect(() => { const sdk = new Analytics(configRef.current); sdk .initialize(appPropsRef.current) .then(() => setSDK(sdk)) .catch(e => console.error(e)); }, [setSDK]); return !sdk ? null : ( {children} ); }; export const useAnalytics = (): IAnalyticsContext => useContext(AnalyticsContext); export interface IAnalyticsData { action: string; [key: string]: string | number | [string | undefined, string | undefined] | undefined; } export const useSendAnalytics = (): { track: IAnalyticsContext["send"] } => { const { send } = useAnalytics(); // eslint-disable-line @typescript-eslint/unbound-method return { track: send }; };