UNPKG

@navinc/base-react-components

Version:
88 lines 4.5 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.withLaunchDarkly = exports.useLaunchDarkly = exports.LaunchDarklyProvider = void 0; const jsx_runtime_1 = require("react/jsx-runtime"); const react_1 = require("react"); const launchdarkly_js_client_sdk_1 = require("launchdarkly-js-client-sdk"); const lodash_isequal_1 = __importDefault(require("lodash.isequal")); const LaunchDarklyContext = (0, react_1.createContext)({}); const LaunchDarklyProvider = ({ clientSideID, user, children, LoadingContent, onTimeout = () => { } }) => { var _a, _b; const ldclient = (0, react_1.useRef)(); const [flags, setFlags] = (0, react_1.useState)([]); const [isLoading, setIsLoading] = (0, react_1.useState)(true); const [hasTimedOut, setHasTimedOut] = (0, react_1.useState)(false); const [isInitialized, setIsInitialized] = (0, react_1.useState)(false); const [lastUser, setLastUser] = (0, react_1.useState)(user); 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; const trackOfferReferral = (0, react_1.useCallback)((offer = {}, additionalInfo = {}) => { const { matchFactorScore, mfSource, offerCategory, offerId, rtid, order } = offer; const payload = Object.assign({ matchFactorScore, mfSource, offerCategory, offerId, rtid, order }, additionalInfo); if (ldclient.current) ldclient.current.waitForInitialization().then(() => ldclient.current.track('offer_referral', payload)); }, []); (0, react_1.useEffect)(() => { setTimeout(() => { if (isLoading) { setIsLoading(false); setHasTimedOut(true); // should be a bugsnag call onTimeout(); } }, 500); }); (0, react_1.useEffect)(() => { if (user.key && clientSideID && !isInitialized && !hasTimedOut) ldclient.current = (0, launchdarkly_js_client_sdk_1.initialize)(clientSideID, user); else if (!isInitialized) console.warn('Please provide a user object and clientSideID'); // eslint-disable-next-line react-hooks/exhaustive-deps }, [clientSideID, user.key, isInitialized, hasTimedOut]); // This is right, we only want it to re-run when the key changes if its the object it will re-run (0, react_1.useEffect)(() => { if (ldclient.current && user.key && !isInitialized) ldclient.current.waitForInitialization().then(() => { setIsInitialized(true); setIsLoading(false); setFlags(ldclient.current.allFlags()); }); }, [isInitialized, user.key]); (0, react_1.useEffect)(() => { if (!(0, lodash_isequal_1.default)(user, lastUser) && isInitialized) { setLastUser(user); ldclient.current.identify(user); ldclient.current.identify(user); } }, [user, lastUser, ldclient, isInitialized]); // TODO add listener for on change to update flags state return ((0, jsx_runtime_1.jsx)(LaunchDarklyContext.Provider, Object.assign({ value: { flags, isLoading, isInitialized, trackMetric, trackOfferReferral, whichVariation, ldclient: ldclient.current, } }, { children: isLoading && !!LoadingContent ? (0, jsx_runtime_1.jsx)(LoadingContent, {}) : children }))); }; exports.LaunchDarklyProvider = LaunchDarklyProvider; const useLaunchDarkly = () => { const { flags, isLoading, isInitialized, trackMetric, trackOfferReferral, whichVariation, ldclient } = (0, react_1.useContext)(LaunchDarklyContext); const hasProvider = !!ldclient; return { flags, isLoading, isInitialized, trackMetric, trackOfferReferral, whichVariation, ldclient, hasProvider }; }; exports.useLaunchDarkly = useLaunchDarkly; const withLaunchDarkly = (Component) => (props) => { const { whichVariation } = (0, exports.useLaunchDarkly)(); return (0, jsx_runtime_1.jsx)(Component, Object.assign({ whichVariation: whichVariation }, props)); }; exports.withLaunchDarkly = withLaunchDarkly; //# sourceMappingURL=use-launchdarkly.js.map