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