JSFiddle - React, Tailwind, and code Playground
by kpulkit29
JavaScript
// returns the state of *all* features for current user
function fetchAllFeatures() {
// in reality, this would have been a `fetch` call:
// `fetch("/api/features/all")`
return new Promise(resolve => {
const sampleFeatures = {
"extended-summary": false,
"feedback-dialog": false,
"home-carousel": "old"
};
setTimeout(resolve, 100, sampleFeatures);
});
}
let globalOverrides = {};
let cacheHolder = {};
// {
/* start: time,
value: ''
} */
function addDevOverrideForFeature(featName, featValue) {
globalOverrides[featName] = featValue;
}
function checkAndAddToCache(featName, featValue, mode = "check") {
if(cacheHolder[featName] !== undefined && mode !== "check") {
let start = cacheHolder[featName].start;
let currentTime = +(new Date());
if(currentTime - start < 2) {
console.log("here");
return cacheHolder[featName].value;
} else {
cacheHolder[featName] = {
start: +(new Date()),
value: featValue
}
return;
}
} else {
cacheHolder[featName] = {
start: +(new Date()),
value: featValue
}
return;
}
}
function getFeatureState(featureName, fallback) {
function checkOverride(resolve) {
if(globalOverrides[featureName]) {
resolve(globalOverrides[featureName]);
return;
}
}
return new Promise((resolve, reject) => {
//top Priority
let value = checkAndAddToCache(featureName, "check");
if(value) {
resolve(value);
return;
}
if(globalOverrides[featureName]) {
checkOverride(resolve);
return;
} else {
fetchAllFeatures().then(result => {
checkOverride(resolve);
checkAndAddToCache(featureName, result, "setter");
if(globalOverrides[featureName]) {
resolve(globalOverrides[featureName]);
}
if (result[featureName] !== undefined) {
resolve(result[featureName]);
...