UNPKG

@navinc/base-react-components

Version:
99 lines 4.74 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)({ flags: {}, isLoading: true, isInitialized: false, trackMetric: undefined, whichVariation: undefined, trackOfferReferral: undefined, ldclient: undefined, }); const LaunchDarklyProvider = ({ clientSideID, context, options, 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 [lastContext, setLastContext] = (0, react_1.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; 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(() => { var _a; return (_a = ldclient.current) === null || _a === void 0 ? void 0 : _a.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 (context && clientSideID && !isInitialized && !hasTimedOut) ldclient.current = (0, launchdarkly_js_client_sdk_1.initialize)(clientSideID, context, options); else if (!isInitialized) console.warn('Please provide a user object and clientSideID'); }, [clientSideID, context, isInitialized, hasTimedOut, options]); (0, react_1.useEffect)(() => { if (ldclient.current && context && !isInitialized) ldclient.current.waitForInitialization().then(() => { setIsInitialized(true); setIsLoading(false); if (ldclient.current) { setFlags(ldclient.current.allFlags()); } }); }, [isInitialized, context]); // TODO Not sure this is being used (0, react_1.useEffect)(() => { if (!(0, lodash_isequal_1.default)(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 ((0, jsx_runtime_1.jsx)(LaunchDarklyContext.Provider, { 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