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]);
  ...