@navinc/base-react-components
Version:
Nav's Pattern Library
88 lines • 4.5 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)({});
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