{"version":3,"file":"FeatureProvider.mjs","sources":["../../../../src/components/FeatureProvider/FeatureProvider.tsx"],"sourcesContent":["'use client'\n\nimport { useMemo, useState } from 'react'\n\nimport { useIsomorphicLayoutEffect } from '~/src/hooks/useIsomorphicLayoutEffect'\nimport { createContext } from '~/src/utils/react'\nimport { isEmpty } from '~/src/utils/type'\n\nimport {\n  type FeatureFlag,\n  type FeatureProviderProps,\n  FeatureType,\n} from './FeatureProvider.types'\n\nconst initialFeatureFlag: FeatureFlag = {\n  [FeatureType.SmoothCorners]: false,\n}\n\nconst [FeatureFlagContextProvider, useFeatureFlagContext] =\n  createContext<FeatureFlag>(initialFeatureFlag)\n\n/**\n * `FeatureProvider` is a component that activates features and provides.\n * @example\n *\n * ```tsx\n * <FeatureProvider features={[SmoothCornersFeature]}>\n *   <App />\n * </FeatureProvider>\n * ```\n */\nexport function FeatureProvider({ children, features }: FeatureProviderProps) {\n  const [featureFlag, setFeatureFlag] =\n    useState<FeatureFlag>(initialFeatureFlag)\n\n  useIsomorphicLayoutEffect(\n    function activateFeatures() {\n      if (isEmpty(features)) {\n        return\n      }\n\n      const promises = features.map((feature) =>\n        feature.activate().then((activated) => ({ [feature.name]: activated }))\n      )\n\n      Promise.all(promises).then((flags) => {\n        setFeatureFlag((prev) => ({\n          ...prev,\n          ...flags.reduce((acc, cur) => ({ ...acc, ...cur }), {}),\n        }))\n      })\n    },\n    [features]\n  )\n\n  return (\n    <FeatureFlagContextProvider value={featureFlag}>\n      {children}\n    </FeatureFlagContextProvider>\n  )\n}\n\nexport function useFeatureFlag(featureType: FeatureType) {\n  const contextValue = useFeatureFlagContext()\n\n  return useMemo(() => contextValue[featureType], [contextValue, featureType])\n}\n"],"names":["initialFeatureFlag","FeatureType","SmoothCorners","FeatureFlagContextProvider","useFeatureFlagContext","createContext","FeatureProvider","children","features","featureFlag","setFeatureFlag","useState","useIsomorphicLayoutEffect","activateFeatures","isEmpty","promises","map","feature","activate","then","activated","name","Promise","all","flags","prev","reduce","acc","cur","_jsx","value","useFeatureFlag","featureType","contextValue","useMemo"],"mappings":";;;;;;;AAcA,MAAMA,kBAA+B,GAAG;EACtC,CAACC,WAAW,CAACC,aAAa,GAAG;AAC/B,CAAC;AAED,MAAM,CAACC,0BAA0B,EAAEC,qBAAqB,CAAC,GACvDC,aAAa,CAAcL,kBAAkB,CAAC;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASM,eAAeA,CAAC;EAAEC,QAAQ;AAAEC,EAAAA;AAA+B,CAAC,EAAE;EAC5E,MAAM,CAACC,WAAW,EAAEC,cAAc,CAAC,GACjCC,QAAQ,CAAcX,kBAAkB,CAAC;AAE3CY,EAAAA,yBAAyB,CACvB,SAASC,gBAAgBA,GAAG;AAC1B,IAAA,IAAIC,OAAO,CAACN,QAAQ,CAAC,EAAE;AACrB,MAAA;AACF;AAEA,IAAA,MAAMO,QAAQ,GAAGP,QAAQ,CAACQ,GAAG,CAAEC,OAAO,IACpCA,OAAO,CAACC,QAAQ,EAAE,CAACC,IAAI,CAAEC,SAAS,KAAM;MAAE,CAACH,OAAO,CAACI,IAAI,GAAGD;KAAW,CAAC,CACxE,CAAC;IAEDE,OAAO,CAACC,GAAG,CAACR,QAAQ,CAAC,CAACI,IAAI,CAAEK,KAAK,IAAK;MACpCd,cAAc,CAAEe,IAAI,KAAM;AACxB,QAAA,GAAGA,IAAI;QACP,GAAGD,KAAK,CAACE,MAAM,CAAC,CAACC,GAAG,EAAEC,GAAG,MAAM;AAAE,UAAA,GAAGD,GAAG;UAAE,GAAGC;SAAK,CAAC,EAAE,EAAE;AACxD,OAAC,CAAC,CAAC;AACL,KAAC,CAAC;AACJ,GAAC,EACD,CAACpB,QAAQ,CACX,CAAC;EAED,oBACEqB,GAAA,CAAC1B,0BAA0B,EAAA;AAAC2B,IAAAA,KAAK,EAAErB,WAAY;AAAAF,IAAAA,QAAA,EAC5CA;AAAQ,GACiB,CAAC;AAEjC;AAEO,SAASwB,cAAcA,CAACC,WAAwB,EAAE;AACvD,EAAA,MAAMC,YAAY,GAAG7B,qBAAqB,EAAE;AAE5C,EAAA,OAAO8B,OAAO,CAAC,MAAMD,YAAY,CAACD,WAAW,CAAC,EAAE,CAACC,YAAY,EAAED,WAAW,CAAC,CAAC;AAC9E;;;;"}