import React, { PropsWithChildren, useState, useEffect } from 'react'; import { HackleContextProvider } from './Context'; import type { HackleContext } from './Context'; import type { ReactNativeSDKClient } from '../client'; import type { User } from '../models'; interface Props { hackleClient: ReactNativeSDKClient; timeout?: number; /** @deprecated Use `createInstance(sdkKey, config, user)` to inject user at SDK initialization instead. */ user?: User | null; } export function HackleProvider({ hackleClient, /** @deprecated Use `createInstance(sdkKey, config, user)` to inject user at SDK initialization instead. */ user: initialUser, timeout = 3000, children, }: PropsWithChildren) { const [ready, setReady] = useState(false); const [state, setState] = useState({ hackle: hackleClient, userVersion: 0, }); useEffect(() => { if (ready && initialUser) { hackleClient.setUser(initialUser); } }, [hackleClient, initialUser, ready]); useEffect(() => { const onUserUpdated = () => { setState((prev) => ({ ...prev, userVersion: prev.userVersion + 1 })); }; hackleClient.on('user-updated', onUserUpdated); return () => { hackleClient.off('user-updated', onUserUpdated); }; }, [hackleClient]); let resolveTimeoutPromise: any; const timeoutPromise: Promise<{ success: boolean }> = new Promise( (resolve) => { resolveTimeoutPromise = resolve; } ); const onReadyTimeout = () => { resolveTimeoutPromise({ success: false, }); }; const readyTimeout = setTimeout(onReadyTimeout, timeout); hackleClient.onReady().then(() => { clearTimeout(readyTimeout); resolveTimeoutPromise({ success: true, }); }); const race = Promise.race([hackleClient.onReady(), timeoutPromise]); race.then(() => { setReady(true); }); return ready ? ( {children} ) : null; }