UNPKG

@navinc/base-react-components

Version:
74 lines 3.29 kB
import { jsx as _jsx } from "react/jsx-runtime"; import { useState, useEffect, useRef, createContext, useContext } from 'react'; import { initialize } from 'launchdarkly-js-client-sdk'; import isEqual from 'lodash.isequal'; const LaunchDarklyContext = createContext({ flags: {}, isLoading: true, isInitialized: false, trackMetric: undefined, whichVariation: undefined, ldclient: undefined, }); /** * @deprecated Use `launchdarkly-react-client-sdk` instead */ export const LaunchDarklyProvider = ({ clientSideID, context, options, children, LoadingContent, }) => { var _a, _b; const ldclient = useRef(null); const [flags, setFlags] = useState([]); const [isLoading, setIsLoading] = useState(true); const [isInitialized, setIsInitialized] = useState(false); const [lastContext, setLastContext] = useState(context); const trackMetric = (_a = ldclient.current) === null || _a === void 0 ? void 0 : _a.track; const whichVariation = (_b = ldclient.current) === null || _b === void 0 ? void 0 : _b.variation; useEffect(() => { if (context && clientSideID && !isInitialized) ldclient.current = initialize(clientSideID, context, options); // eslint-disable-next-line no-console -- throwing an exception is probably a better choice, but this was already setup this way else if (!isInitialized) console.warn('Please provide a user object and clientSideID'); }, [clientSideID, context, isInitialized, options]); useEffect(() => { if (ldclient.current && context && !isInitialized) // eslint-disable-next-line promise/catch-or-return -- TODO: add error handling ldclient.current.waitForInitialization().then(() => { setIsInitialized(true); setIsLoading(false); if (ldclient.current) { setFlags(ldclient.current.allFlags()); } }); }, [isInitialized, context]); // TODO Not sure this is being used useEffect(() => { if (!isEqual(context, lastContext) && isInitialized) { setLastContext(context); if (ldclient.current) { ldclient.current.identify(context); } } }, [context, lastContext, ldclient, isInitialized]); // TODO add listener for on change to update flags state return (_jsx(LaunchDarklyContext.Provider, { value: { flags, isLoading, isInitialized, trackMetric, whichVariation, ldclient: ldclient.current, }, children: isLoading && !!LoadingContent ? _jsx(LoadingContent, {}) : children })); }; /** * https://launchdarkly.github.io/js-client-sdk/index.html * https://docs.launchdarkly.com/sdk/client-side/javascript/ * https://docs.launchdarkly.com/home/getting-started * * @deprecated Use `launchdarkly-react-client-sdk` instead */ export const useLaunchDarkly = () => { const { flags, isLoading, isInitialized, trackMetric, whichVariation, ldclient } = useContext(LaunchDarklyContext); const hasProvider = !!ldclient; return { flags, isLoading, isInitialized, trackMetric, whichVariation, ldclient, hasProvider }; }; //# sourceMappingURL=use-launchdarkly.js.map