@navinc/base-react-components
Version:
Nav's Pattern Library
74 lines • 3.29 kB
JavaScript
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