UNPKG

@unleash/proxy-client-react

Version:
5 lines (4 loc) 4.82 kB
(function(s,f){typeof exports=="object"&&typeof module<"u"?f(exports,require("unleash-proxy-client"),require("react")):typeof define=="function"&&define.amd?define(["exports","unleash-proxy-client","react"],f):(s=typeof globalThis<"u"?globalThis:s||self,f(s.UnleashReact={},s.unleashProxyClient,s.react))})(this,function(s,f,l){"use strict";const p=l.createContext(null),A={bootstrap:[],disableRefresh:!0,disableMetrics:!0,url:"http://localhost",appName:"offline",clientKey:"not-used"},C=l["startTransition"]||(e=>e()),E=({config:e,children:t,unleashClient:r,startClient:u=!0,stopClient:i=!0,startTransition:a=C})=>{var x,T,U;const c=e||A,n=l.useRef(r||new f.UnleashClient(c)),[o,P]=l.useState(!!(r?e!=null&&e.bootstrap&&(e==null?void 0:e.bootstrapOverride)!==!1||(x=r.isReady)!=null&&x.call(r):c.bootstrap&&c.bootstrapOverride!==!1)),[S,F]=l.useState(((U=(T=n.current).getError)==null?void 0:U.call(T))||null);l.useEffect(()=>{!c&&!r&&console.error(`You must provide either a config or an unleash client to the flag provider. If you are initializing the client in useEffect, you can avoid this warning by checking if the client exists before rendering.`);const d=h=>{a(()=>{F(B=>B||h)})},b=h=>{a(()=>{F(null)})};let y=null;const k=()=>{y=setTimeout(()=>{a(()=>{P(!0)})},0)};return n.current.on("ready",k),n.current.on("error",d),n.current.on("recovered",b),u&&(n.current.stop(),n.current.start()),function(){n.current&&(n.current.off("error",d),n.current.off("ready",k),n.current.off("recovered",b),i&&n.current.stop()),y&&clearTimeout(y)}},[]);const z=l.useMemo(()=>({on:(d,b,y)=>n.current.on(d,b,y),off:(d,b)=>n.current.off(d,b),updateContext:async d=>await n.current.updateContext(d),isEnabled:d=>n.current.isEnabled(d),getVariant:d=>n.current.getVariant(d),client:n.current,flagsReady:o,flagsError:S,setFlagsReady:P,setFlagsError:F}),[o,S]);return l.createElement(p.Provider,{value:z},t)},m={on:(e,t,r)=>(console.error("on() must be used within a FlagProvider"),v),off:(e,t)=>(console.error("off() must be used within a FlagProvider"),v),updateContext:async()=>{console.error("updateContext() must be used within a FlagProvider")},isEnabled:()=>(console.error("isEnabled() must be used within a FlagProvider"),!1),getVariant:()=>(console.error("getVariant() must be used within a FlagProvider"),{name:"disabled",enabled:!1})},v={...m,toggles:[],impressionDataAll:{},context:{},storage:{},start:()=>{},stop:()=>{},isReady:()=>!1,getError:()=>null,getAllToggles:()=>[]},M={...m,client:v,flagsReady:!1,setFlagsReady:()=>{console.error("setFlagsReady() must be used within a FlagProvider")},flagsError:null,setFlagsError:()=>{console.error("setFlagsError() must be used within a FlagProvider")}};function g(){const e=l.useContext(p);return e||(console.error("useFlagContext() must be used within a FlagProvider"),M)}const O=e=>{const{isEnabled:t,client:r}=g(),[u,i]=l.useState(!!t(e)),a=l.useRef();return a.current=u,l.useEffect(()=>{if(!r)return;const c=()=>{const o=t(e);o!==a.current&&(a.current=o,i(!!o))},n=()=>{const o=t(e);a.current=o,i(o)};return r.on("update",c),r.on("ready",n),()=>{r.off("update",c),r.off("ready",n)}},[r]),u},_=()=>{const{client:e}=g(),[t,r]=l.useState(e.getAllToggles());return l.useEffect(()=>{const u=()=>{r(e.getAllToggles())};return e.on("update",u),()=>{e.off("update",u)}},[]),t},j=()=>{const{flagsReady:e,flagsError:t}=g();return{flagsReady:e,flagsError:t}},H=(e,t)=>{var u,i,a,c;return!(e.name===(t==null?void 0:t.name)&&e.enabled===(t==null?void 0:t.enabled)&&e.feature_enabled===(t==null?void 0:t.feature_enabled)&&((u=e.payload)==null?void 0:u.type)===((i=t==null?void 0:t.payload)==null?void 0:i.type)&&((a=e.payload)==null?void 0:a.value)===((c=t==null?void 0:t.payload)==null?void 0:c.value))},q=e=>{const{getVariant:t,client:r}=g(),[u,i]=l.useState(t(e)),a=l.useRef({name:u.name,enabled:u.enabled});return a.current=u,l.useEffect(()=>{if(!r)return;const c=()=>{const o=t(e);H(a.current,o)&&(i(o),a.current=o)},n=()=>{const o=t(e);a.current.name=o==null?void 0:o.name,a.current.enabled=o==null?void 0:o.enabled,i(o)};return r.on("update",c),r.on("ready",n),()=>{r.off("update",c),r.off("ready",n)}},[r]),u||{}},I=()=>{const{updateContext:e}=g();return e},L=()=>{const{client:e}=g();return e};Object.defineProperty(s,"InMemoryStorageProvider",{enumerable:!0,get:()=>f.InMemoryStorageProvider}),Object.defineProperty(s,"LocalStorageProvider",{enumerable:!0,get:()=>f.LocalStorageProvider}),Object.defineProperty(s,"UnleashClient",{enumerable:!0,get:()=>f.UnleashClient}),s.FlagContext=p,s.FlagProvider=E,s.default=E,s.useFlag=O,s.useFlags=_,s.useFlagsStatus=j,s.useUnleashClient=L,s.useUnleashContext=I,s.useVariant=q,Object.defineProperties(s,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}); //# sourceMappingURL=unleash-react.umd.cjs.map