@bodhiapp/bodhi-js-react-core 0.0.11 → 0.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -31,5 +31,5 @@ export interface BodhiContext {
31
31
  isDirect: boolean;
32
32
  }
33
33
  export declare const BodhiReactContext: import('react').Context<BodhiContext | null>;
34
- export declare function BodhiProvider({ children, client, modalHtmlPath, handleCallback, callbackPath, basePath, logLevel, }: BodhiProviderProps): import("react/jsx-runtime").JSX.Element;
34
+ export declare function BodhiProvider({ children, client, modalHtmlPath, handleCallback, callbackPath: userCallbackPath, basePath, logLevel, }: BodhiProviderProps): import("react/jsx-runtime").JSX.Element;
35
35
  export declare function useBodhi(): BodhiContext;
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const k=require("react/jsx-runtime"),s=require("@bodhiapp/bodhi-js-core"),r=require("react"),p={MODAL_READY:"modal:ready",MODAL_REFRESH:"modal:refresh",MODAL_CLOSE:"modal:close",MODAL_COMPLETE:"modal:complete",MODAL_LNA_CONNECT:"modal:lna:connect",MODAL_LNA_SKIP:"modal:lna:skip",MODAL_CONFIRM_SERVER_INSTALL:"modal:confirm-server-install",MODAL_SELECT_CONNECTION:"modal:select-connection"};function H({client:e,modalHtmlPath:i,hideSetup:L,onSetupReady:_,setupState:R,basePath:m="/",logLevel:A="warn"}){const y=R!=="ready",O=r.useMemo(()=>new s.Logger("SetupModalProcessor",A),[A]),l=r.useRef(null),u=r.useMemo(()=>new s.BodhiClientUserPrefsManager(s.createStoragePrefixWithBasePath(m,"bodhijs:")),[m]),C=r.useRef(null),E=r.useCallback(t=>t==="direct"?"lna":t==="extension"?"extension":null,[]),v=r.useCallback(t=>t.extension==="ready"?{status:"ready",version:"unknown",id:t.extensionId}:t.extension==="not-found"?{status:"not-installed",error:{message:"Extension not found",code:"ext-not-installed"}}:{status:"unreachable",error:{message:"Client not initialized",code:"ext-connection-failed"}},[]),b=r.useCallback(t=>{if(t.server.status==="pending-extension-ready")return{status:"pending-extension-ready",error:{message:"Extension not ready",code:"server-pending-ext-ready"}};const n=t.server;switch(n.status){case"ready":return{status:"ready",version:n.version||"unknown"};case"setup":return{status:"setup",version:n.version||"unknown",error:{message:n.error?.message||"Setup required",code:"server-in-setup-status"}};case"resource-admin":return{status:"resource-admin",version:n.version||"unknown",error:{message:n.error?.message||"Resource admin required",code:"server-in-admin-status"}};case"error":return{status:"error",error:{message:n.error?.message||"Unknown error",code:"server-unexpected-error"}};case"not-reachable":return{status:"unreachable",error:{message:n.error?.message||"Server not reachable",code:"server-conn-refused"}};default:return{status:"unreachable",error:{message:"Unknown server status",code:"server-unexpected-error"}}}},[]),g=r.useCallback(t=>{if(t.server.status==="not-connected")return{status:"pending-lna-ready"};const n=t.server;switch(n.status){case"ready":return{status:"ready",version:n.version||"unknown"};case"setup":return{status:"setup",version:n.version||"unknown"};case"resource-admin":return{status:"resource-admin",version:n.version||"unknown"};case"error":case"not-reachable":return{status:"error",error:{message:n.error?.message||"Connection error"}};default:return{status:"error",error:{message:"Unknown server status"}}}},[]),I=r.useCallback((t,n)=>{if(t.server.status!=="pending-extension-ready"){const o=t.server.status;if(o==="ready"||o==="setup"||o==="resource-admin")return!0}if(n.server.status!=="not-connected"){const o=n.server.status;if(o==="ready"||o==="setup"||o==="resource-admin")return!0}return!1},[]),h=r.useCallback((t,n,o)=>{if(n==="skipped")return{status:"skipped",serverUrl:o};if(t.server.status!=="not-connected"){const d=t.server;return d.status==="ready"||d.status==="setup"||d.status==="resource-admin"?{status:"granted",serverUrl:o}:{status:"unreachable",serverUrl:o,error:{message:d.error?.message||"Server unreachable",code:"lna-unreachable"}}}return n==="granted"?{status:"granted",serverUrl:o}:{status:"prompt",serverUrl:o}},[]),S=r.useCallback(async(t=!1)=>{const n=s.detectBrowser().type,o=s.detectOS().type;let d=await e.getExtensionState();(d.extension==="not-initialized"||t)&&(d=await e.testExtensionConnectivity());let a=await e.getDirectState();const c=u.getDirectStatus();c==="granted"&&(a.server.status==="not-connected"||t)&&(a=await e.testDirectConnectivity());const w=s.getServerUrl(a)||"http://localhost:1135",x=h(a,c,w);return e.getConnectionMode()===null&&(s.isDirectServerReady(a)?await e.setConnectionMode("direct"):s.isExtensionServerReady(d)&&await e.setConnectionMode("extension")),u.isServerInstallConfirmed()||I(d,a)&&u.setServerInstallConfirmed(!0),{extension:v(d),server:b(d),lna:x,lnaServer:g(a),env:{browser:n,os:o},browsers:s.BROWSER_CONFIGS,os:s.OS_CONFIGS,userConfirmations:{serverInstall:u.isServerInstallConfirmed()},selectedConnection:E(e.getConnectionMode())}},[e,u,v,b,g,E,h,I]),f=r.useCallback(()=>{if(!C.current)throw new Error("Cannot get state: currentStateRef is null");return{...C.current,userConfirmations:{serverInstall:u.isServerInstallConfirmed()},selectedConnection:E(e.getConnectionMode())}},[u,e,E]),T=r.useMemo(()=>({[p.MODAL_READY]:async()=>(O.info("MODAL_READY: building initial state"),{setupState:f()}),[p.MODAL_REFRESH]:async()=>{O.info("MODAL_REFRESH: refreshing state");const t=await S(!0);C.current=t;const n=f();return O.info(`MODAL_REFRESH: state refreshed
2
- `,JSON.stringify(n,null,2)),l.current?.updateState(f()),{setupState:n}},[p.MODAL_LNA_CONNECT]:async t=>{const n=t.payload.serverUrl;console.log("[SetupModalProcessor] LNA connect:",n);const o=await e.testDirectConnectivity(n);if(o.server.status!=="not-connected"){const a=o.server.status;if(a==="ready"||a==="setup"||a==="resource-admin"){u.setDirectStatus("granted"),e.getConnectionMode()===null&&await e.setConnectionMode("direct");const c=await S();return C.current=c,l.current?.updateState(f()),{success:!0}}}const d=await S();return C.current=d,l.current?.updateState(f()),{success:!1}},[p.MODAL_LNA_SKIP]:async()=>{u.setDirectStatus("skipped");const t=await S();return C.current=t,l.current?.updateState(f()),{success:!0}},[p.MODAL_CLOSE]:()=>{L()},[p.MODAL_COMPLETE]:()=>{L()},[p.MODAL_CONFIRM_SERVER_INSTALL]:t=>(u.setServerInstallConfirmed(t.payload.confirmed),l.current?.updateState(f()),{success:!0}),[p.MODAL_SELECT_CONNECTION]:async t=>{const o=t.payload.connection==="lna"?"direct":"extension";return await e.setConnectionMode(o),l.current?.updateState(f()),{success:!0}}}),[O,e,u,S,f,g,L]);return r.useEffect(()=>(l.current=new s.OnboardingModal({modalHtmlPath:i,handlers:T}),()=>{l.current?.destroy(),l.current=null}),[i,T]),r.useEffect(()=>{y&&l.current?S(!0).then(t=>{C.current=t,l.current?.show(t),_?.()}).catch(t=>{console.error("[SetupModalProcessor] buildSetupState failed:",t)}):!y&&l.current&&l.current.destroy()},[y,S,_]),null}const P={status:"not-initialized",mode:null,extensionId:null,url:null,server:s.BACKEND_SERVER_NOT_CONNECTED,error:null},z={status:"initializing",mode:null,extensionId:null,url:null,server:s.BACKEND_SERVER_NOT_CONNECTED,error:null};function B(e){return e.status==="not-initialized"}function j(e){return e.status==="initializing"}function U(e){return e.status!=="not-initialized"&&e.status!=="initializing"}function D(e){return e.status==="ready"}function F(e){return D(e)&&e.server.status==="ready"}function G(e){return s.isExtensionState(e)?{status:e.extension==="not-initialized"?"initializing":e.extension==="not-found"?"extension-not-found":"ready",mode:"extension",extensionId:e.extensionId,url:null,server:e.server,error:e.server.error}:{status:e.url===null?"direct-not-connected":"ready",mode:"direct",extensionId:null,url:e.url,server:e.server,error:e.server.error}}const K={isNotInitialized:B,isInitializing:j,isInitialized:U,isReady:D,isOverallReady:F},N=r.createContext(null);N.displayName="BodhiContext";function V({children:e,client:i,modalHtmlPath:L,handleCallback:_=!0,callbackPath:R="/callback",basePath:m="/",logLevel:A="warn"}){const y=r.useMemo(()=>new s.Logger("BodhiProvider",A),[A]),O=r.useRef(!1),l=r.useRef(!1),[u,C]=r.useState(P),[E,v]=r.useState(s.INITIAL_AUTH_STATE),[b,g]=r.useState(!1),[I,h]=r.useState("ready");r.useEffect(()=>{const a=c=>{switch(c.type){case"client-state":C(G(c.state));break;case"auth-state":v(c.state),g(!1);break}};return i.setStateCallback(a),()=>{i.setStateCallback(s.NOOP_STATE_CALLBACK)}},[i]);const S=r.useCallback(async()=>{h("loading")},[]),f=r.useCallback(()=>{h("ready")},[]),T=r.useCallback(()=>{h("loaded")},[]),t=r.useCallback(async a=>{C(z);try{await i.init(a||{})}catch(c){y.error("Init failed:",c)}},[i,y]);r.useEffect(()=>{if(l.current)return;l.current=!0,(async()=>{if(await t(),!_)return;const c=new URL(window.location.href);if(c.pathname!==R)return;const M=c.searchParams.get("code"),w=c.searchParams.get("state");!M||!w||O.current||(O.current=!0,s.isWebUIClient(i)&&(g(!0),i.handleOAuthCallback(M,w).then(()=>{window.history.replaceState({},"",m)}).catch(x=>{y.error("OAuth callback failed:",x),v({status:"error",user:null,accessToken:null,error:{message:x instanceof Error?x.message:"OAuth callback failed",code:"OAUTH_CALLBACK_FAILED"}}),g(!1),window.history.replaceState({},"",m)})))})()},[t,i,_,R,m]);const n=r.useCallback(async()=>{g(!0);try{await i.login()}catch(a){v({status:"error",user:null,accessToken:null,error:{message:a instanceof Error?a.message:"Login failed",code:"LOGIN_FAILED"}}),g(!1)}},[i]),o=r.useCallback(async()=>{try{await i.logout()}catch(a){v({status:"error",user:null,accessToken:null,error:{message:a instanceof Error?a.message:"Logout failed",code:"LOGOUT_FAILED"}})}},[i]),d=r.useMemo(()=>{const a=u.status==="ready",c=u.server.status==="ready";return{client:i,clientState:u,auth:E,isAuthLoading:b,login:n,logout:o,showSetup:S,hideSetup:f,setupState:I,isAuthenticated:E.status==="authenticated",canLogin:a&&!b,isReady:a,isServerReady:c,isOverallReady:a&&c,isInitializing:u.status==="initializing",isExtension:u.mode==="extension",isDirect:u.mode==="direct"}},[i,u,E,b,I,n,o,S,f]);return k.jsxs(N.Provider,{value:d,children:[k.jsx(H,{client:i,modalHtmlPath:L,hideSetup:f,onSetupReady:T,setupState:I,basePath:m,logLevel:A}),e]})}function W(){const e=r.useContext(N);if(!e)throw new Error("useBodhi must be used within BodhiProvider");return e}const q="production";Object.defineProperty(exports,"createApiError",{enumerable:!0,get:()=>s.createApiError});Object.defineProperty(exports,"createOperationError",{enumerable:!0,get:()=>s.createOperationError});Object.defineProperty(exports,"isApiResultError",{enumerable:!0,get:()=>s.isApiResultError});Object.defineProperty(exports,"isApiResultOperationError",{enumerable:!0,get:()=>s.isApiResultOperationError});Object.defineProperty(exports,"isApiResultSuccess",{enumerable:!0,get:()=>s.isApiResultSuccess});Object.defineProperty(exports,"isAuthError",{enumerable:!0,get:()=>s.isAuthError});Object.defineProperty(exports,"isAuthLoading",{enumerable:!0,get:()=>s.isAuthLoading});Object.defineProperty(exports,"isAuthenticated",{enumerable:!0,get:()=>s.isAuthenticated});Object.defineProperty(exports,"isClientReady",{enumerable:!0,get:()=>s.isClientReady});Object.defineProperty(exports,"isDirectState",{enumerable:!0,get:()=>s.isDirectState});Object.defineProperty(exports,"isExtensionState",{enumerable:!0,get:()=>s.isExtensionState});Object.defineProperty(exports,"isOperationError",{enumerable:!0,get:()=>s.isOperationError});Object.defineProperty(exports,"isWebUIClient",{enumerable:!0,get:()=>s.isWebUIClient});exports.BodhiProvider=V;exports.BodhiReactContext=N;exports.ClientCtxState=K;exports.INITIALIZING_CLIENT_CONTEXT_STATE=z;exports.INITIAL_CLIENT_CONTEXT_STATE=P;exports.REACT_CORE_BUILD_MODE=q;exports.clientStateToContextState=G;exports.isClientCtxInitialized=U;exports.isClientCtxInitializing=j;exports.isClientCtxNotInitialized=B;exports.isClientCtxReady=D;exports.isOverallReady=F;exports.useBodhi=W;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const z=require("react/jsx-runtime"),s=require("@bodhiapp/bodhi-js-core"),r=require("react"),O={MODAL_READY:"modal:ready",MODAL_REFRESH:"modal:refresh",MODAL_CLOSE:"modal:close",MODAL_COMPLETE:"modal:complete",MODAL_LNA_CONNECT:"modal:lna:connect",MODAL_LNA_SKIP:"modal:lna:skip",MODAL_CONFIRM_SERVER_INSTALL:"modal:confirm-server-install",MODAL_SELECT_CONNECTION:"modal:select-connection"};function V({client:e,modalHtmlPath:o,hideSetup:L,onSetupReady:_,setupState:M,basePath:p="/",logLevel:A="warn"}){const x=M!=="ready",v=r.useMemo(()=>new s.Logger("SetupModalProcessor",A),[A]),i=r.useRef(null),l=r.useMemo(()=>new s.BodhiClientUserPrefsManager(s.createStoragePrefixWithBasePath(p,"bodhijs:")),[p]),E=r.useRef(null),S=r.useCallback(t=>t==="direct"?"lna":t==="extension"?"extension":null,[]),R=r.useCallback(t=>t.extension==="ready"?{status:"ready",version:"unknown",id:t.extensionId}:t.extension==="not-found"?{status:"not-installed",error:{message:"Extension not found",code:"ext-not-installed"}}:{status:"unreachable",error:{message:"Client not initialized",code:"ext-connection-failed"}},[]),b=r.useCallback(t=>{if(t.server.status==="pending-extension-ready")return{status:"pending-extension-ready",error:{message:"Extension not ready",code:"server-pending-ext-ready"}};const n=t.server;switch(n.status){case"ready":return{status:"ready",version:n.version||"unknown"};case"setup":return{status:"setup",version:n.version||"unknown",error:{message:n.error?.message||"Setup required",code:"server-in-setup-status"}};case"resource-admin":return{status:"resource-admin",version:n.version||"unknown",error:{message:n.error?.message||"Resource admin required",code:"server-in-admin-status"}};case"error":return{status:"error",error:{message:n.error?.message||"Unknown error",code:"server-unexpected-error"}};case"not-reachable":return{status:"unreachable",error:{message:n.error?.message||"Server not reachable",code:"server-conn-refused"}};default:return{status:"unreachable",error:{message:"Unknown server status",code:"server-unexpected-error"}}}},[]),m=r.useCallback(t=>{if(t.server.status==="not-connected")return{status:"pending-lna-ready"};const n=t.server;switch(n.status){case"ready":return{status:"ready",version:n.version||"unknown"};case"setup":return{status:"setup",version:n.version||"unknown"};case"resource-admin":return{status:"resource-admin",version:n.version||"unknown"};case"error":case"not-reachable":return{status:"error",error:{message:n.error?.message||"Connection error"}};default:return{status:"error",error:{message:"Unknown server status"}}}},[]),I=r.useCallback((t,n)=>{if(t.server.status!=="pending-extension-ready"){const a=t.server.status;if(a==="ready"||a==="setup"||a==="resource-admin")return!0}if(n.server.status!=="not-connected"){const a=n.server.status;if(a==="ready"||a==="setup"||a==="resource-admin")return!0}return!1},[]),y=r.useCallback((t,n,a)=>{if(n==="skipped")return{status:"skipped",serverUrl:a};if(t.server.status!=="not-connected"){const u=t.server;return u.status==="ready"||u.status==="setup"||u.status==="resource-admin"?{status:"granted",serverUrl:a}:{status:"unreachable",serverUrl:a,error:{message:u.error?.message||"Server unreachable",code:"lna-unreachable"}}}return n==="granted"?{status:"granted",serverUrl:a}:{status:"prompt",serverUrl:a}},[]),g=r.useCallback(async(t=!1)=>{const n=s.detectBrowser().type,a=s.detectOS().type;let u=await e.getExtensionState();(u.extension==="not-initialized"||t)&&(u=await e.testExtensionConnectivity());let d=await e.getDirectState();const h=l.getDirectStatus();h==="granted"&&(d.server.status==="not-connected"||t)&&(d=await e.testDirectConnectivity());const f=s.getServerUrl(d)||"http://localhost:1135",w=y(d,h,f);return e.getConnectionMode()===null&&(s.isDirectServerReady(d)?await e.setConnectionMode("direct"):s.isExtensionServerReady(u)&&await e.setConnectionMode("extension")),l.isServerInstallConfirmed()||I(u,d)&&l.setServerInstallConfirmed(!0),{extension:R(u),server:b(u),lna:w,lnaServer:m(d),env:{browser:n,os:a},browsers:s.BROWSER_CONFIGS,os:s.OS_CONFIGS,userConfirmations:{serverInstall:l.isServerInstallConfirmed()},selectedConnection:S(e.getConnectionMode())}},[e,l,R,b,m,S,y,I]),C=r.useCallback(()=>{if(!E.current)throw new Error("Cannot get state: currentStateRef is null");return{...E.current,userConfirmations:{serverInstall:l.isServerInstallConfirmed()},selectedConnection:S(e.getConnectionMode())}},[l,e,S]),T=r.useMemo(()=>({[O.MODAL_READY]:async()=>(v.info("MODAL_READY: building initial state"),{setupState:C()}),[O.MODAL_REFRESH]:async()=>{v.info("MODAL_REFRESH: refreshing state");const t=await g(!0);E.current=t;const n=C();return v.info(`MODAL_REFRESH: state refreshed
2
+ `,JSON.stringify(n,null,2)),i.current?.updateState(C()),{setupState:n}},[O.MODAL_LNA_CONNECT]:async t=>{const n=t.payload.serverUrl;console.log("[SetupModalProcessor] LNA connect:",n);const a=await e.testDirectConnectivity(n);if(a.server.status!=="not-connected"){const d=a.server.status;if(d==="ready"||d==="setup"||d==="resource-admin"){l.setDirectStatus("granted"),e.getConnectionMode()===null&&await e.setConnectionMode("direct");const h=await g();return E.current=h,i.current?.updateState(C()),{success:!0}}}const u=await g();return E.current=u,i.current?.updateState(C()),{success:!1}},[O.MODAL_LNA_SKIP]:async()=>{l.setDirectStatus("skipped");const t=await g();return E.current=t,i.current?.updateState(C()),{success:!0}},[O.MODAL_CLOSE]:()=>{L()},[O.MODAL_COMPLETE]:()=>{L()},[O.MODAL_CONFIRM_SERVER_INSTALL]:t=>(l.setServerInstallConfirmed(t.payload.confirmed),i.current?.updateState(C()),{success:!0}),[O.MODAL_SELECT_CONNECTION]:async t=>{const a=t.payload.connection==="lna"?"direct":"extension";return await e.setConnectionMode(a),i.current?.updateState(C()),{success:!0}}}),[v,e,l,g,C,m,L]);return r.useEffect(()=>(i.current=new s.OnboardingModal({modalHtmlPath:o,handlers:T}),()=>{i.current?.destroy(),i.current=null}),[o,T]),r.useEffect(()=>{x&&i.current?g(!0).then(t=>{E.current=t,i.current?.show(t),_?.()}).catch(t=>{console.error("[SetupModalProcessor] buildSetupState failed:",t)}):!x&&i.current&&i.current.destroy()},[x,g,_]),null}const B={status:"not-initialized",mode:null,extensionId:null,url:null,server:s.BACKEND_SERVER_NOT_CONNECTED,error:null},j={status:"initializing",mode:null,extensionId:null,url:null,server:s.BACKEND_SERVER_NOT_CONNECTED,error:null};function U(e){return e.status==="not-initialized"}function F(e){return e.status==="initializing"}function G(e){return e.status!=="not-initialized"&&e.status!=="initializing"}function k(e){return e.status==="ready"}function H(e){return k(e)&&e.server.status==="ready"}function K(e){return s.isExtensionState(e)?{status:e.extension==="not-initialized"?"initializing":e.extension==="not-found"?"extension-not-found":"ready",mode:"extension",extensionId:e.extensionId,url:null,server:e.server,error:e.server.error}:{status:e.url===null?"direct-not-connected":"ready",mode:"direct",extensionId:null,url:e.url,server:e.server,error:e.server.error}}const W={isNotInitialized:U,isInitializing:F,isInitialized:G,isReady:k,isOverallReady:H},N=r.createContext(null);N.displayName="BodhiContext";function q({children:e,client:o,modalHtmlPath:L,handleCallback:_=!0,callbackPath:M,basePath:p="/",logLevel:A="warn"}){const x=p==="/"?"":p.replace(/\/$/,""),v=M??`${x}/callback`,i=r.useMemo(()=>new s.Logger("BodhiProvider",A),[A]),l=r.useRef(!1),E=r.useRef(!1),[S,R]=r.useState(B),[b,m]=r.useState(s.INITIAL_AUTH_STATE),[I,y]=r.useState(!1),[g,C]=r.useState("ready");r.useEffect(()=>{const c=f=>{switch(f.type){case"client-state":R(K(f.state));break;case"auth-state":m(f.state),y(!1);break}};return o.setStateCallback(c),()=>{o.setStateCallback(s.NOOP_STATE_CALLBACK)}},[o]);const T=r.useCallback(async()=>{C("loading")},[]),t=r.useCallback(()=>{C("ready")},[]),n=r.useCallback(()=>{C("loaded")},[]),a=r.useCallback(async c=>{R(j);try{await o.init(c||{})}catch(f){i.error("Init failed:",f)}},[o,i]);r.useEffect(()=>{if(E.current)return;E.current=!0,(async()=>{if(await a(),!_)return;const f=new URL(window.location.href);if(f.pathname!==v)return;const w=f.searchParams.get("code"),P=f.searchParams.get("state");!w||!P||l.current||(l.current=!0,s.isWebUIClient(o)&&(y(!0),o.handleOAuthCallback(w,P).then(()=>{window.history.replaceState({},"",p)}).catch(D=>{i.error("OAuth callback failed:",D),m({status:"error",user:null,accessToken:null,error:{message:D instanceof Error?D.message:"OAuth callback failed",code:"OAUTH_CALLBACK_FAILED"}}),y(!1),window.history.replaceState({},"",p)})))})()},[a,o,_,v,p]);const u=r.useCallback(async()=>{y(!0);try{await o.login()}catch(c){m({status:"error",user:null,accessToken:null,error:{message:c instanceof Error?c.message:"Login failed",code:"LOGIN_FAILED"}}),y(!1)}},[o]),d=r.useCallback(async()=>{try{await o.logout()}catch(c){m({status:"error",user:null,accessToken:null,error:{message:c instanceof Error?c.message:"Logout failed",code:"LOGOUT_FAILED"}})}},[o]),h=r.useMemo(()=>{const c=S.status==="ready",f=S.server.status==="ready";return{client:o,clientState:S,auth:b,isAuthLoading:I,login:u,logout:d,showSetup:T,hideSetup:t,setupState:g,isAuthenticated:b.status==="authenticated",canLogin:c&&!I,isReady:c,isServerReady:f,isOverallReady:c&&f,isInitializing:S.status==="initializing",isExtension:S.mode==="extension",isDirect:S.mode==="direct"}},[o,S,b,I,g,u,d,T,t]);return z.jsxs(N.Provider,{value:h,children:[z.jsx(V,{client:o,modalHtmlPath:L,hideSetup:t,onSetupReady:n,setupState:g,basePath:p,logLevel:A}),e]})}function X(){const e=r.useContext(N);if(!e)throw new Error("useBodhi must be used within BodhiProvider");return e}const Y="production";Object.defineProperty(exports,"createApiError",{enumerable:!0,get:()=>s.createApiError});Object.defineProperty(exports,"createOperationError",{enumerable:!0,get:()=>s.createOperationError});Object.defineProperty(exports,"isApiResultError",{enumerable:!0,get:()=>s.isApiResultError});Object.defineProperty(exports,"isApiResultOperationError",{enumerable:!0,get:()=>s.isApiResultOperationError});Object.defineProperty(exports,"isApiResultSuccess",{enumerable:!0,get:()=>s.isApiResultSuccess});Object.defineProperty(exports,"isAuthError",{enumerable:!0,get:()=>s.isAuthError});Object.defineProperty(exports,"isAuthLoading",{enumerable:!0,get:()=>s.isAuthLoading});Object.defineProperty(exports,"isAuthenticated",{enumerable:!0,get:()=>s.isAuthenticated});Object.defineProperty(exports,"isClientReady",{enumerable:!0,get:()=>s.isClientReady});Object.defineProperty(exports,"isDirectState",{enumerable:!0,get:()=>s.isDirectState});Object.defineProperty(exports,"isExtensionState",{enumerable:!0,get:()=>s.isExtensionState});Object.defineProperty(exports,"isOperationError",{enumerable:!0,get:()=>s.isOperationError});Object.defineProperty(exports,"isWebUIClient",{enumerable:!0,get:()=>s.isWebUIClient});exports.BodhiProvider=q;exports.BodhiReactContext=N;exports.ClientCtxState=W;exports.INITIALIZING_CLIENT_CONTEXT_STATE=j;exports.INITIAL_CLIENT_CONTEXT_STATE=B;exports.REACT_CORE_BUILD_MODE=Y;exports.clientStateToContextState=K;exports.isClientCtxInitialized=G;exports.isClientCtxInitializing=F;exports.isClientCtxNotInitialized=U;exports.isClientCtxReady=k;exports.isOverallReady=H;exports.useBodhi=X;
@@ -1,8 +1,8 @@
1
- import { jsxs as F, jsx as H } from "react/jsx-runtime";
2
- import { Logger as B, BodhiClientUserPrefsManager as G, createStoragePrefixWithBasePath as K, detectBrowser as V, detectOS as W, getServerUrl as j, isDirectServerReady as Y, isExtensionServerReady as q, OS_CONFIGS as X, BROWSER_CONFIGS as J, OnboardingModal as Z, BACKEND_SERVER_NOT_CONNECTED as P, isExtensionState as Q, INITIAL_AUTH_STATE as $, NOOP_STATE_CALLBACK as ee, isWebUIClient as te } from "@bodhiapp/bodhi-js-core";
3
- import { createApiError as Ae, createOperationError as Oe, isApiResultError as Le, isApiResultOperationError as he, isApiResultSuccess as we, isAuthError as xe, isAuthLoading as Ie, isAuthenticated as _e, isClientReady as Re, isDirectState as De, isExtensionState as Me, isOperationError as Ne, isWebUIClient as Te } from "@bodhiapp/bodhi-js-core";
4
- import { useMemo as _, useRef as T, useCallback as d, useEffect as b, createContext as re, useState as N, useContext as ne } from "react";
5
- const m = {
1
+ import { jsxs as G, jsx as K } from "react/jsx-runtime";
2
+ import { Logger as U, BodhiClientUserPrefsManager as V, createStoragePrefixWithBasePath as W, detectBrowser as j, detectOS as Y, getServerUrl as q, isDirectServerReady as X, isExtensionServerReady as $, OS_CONFIGS as J, BROWSER_CONFIGS as Z, OnboardingModal as Q, BACKEND_SERVER_NOT_CONNECTED as F, isExtensionState as ee, INITIAL_AUTH_STATE as te, NOOP_STATE_CALLBACK as re, isWebUIClient as ne } from "@bodhiapp/bodhi-js-core";
3
+ import { createApiError as he, createOperationError as Le, isApiResultError as we, isApiResultOperationError as xe, isApiResultSuccess as Ie, isAuthError as _e, isAuthLoading as Re, isAuthenticated as De, isClientReady as Me, isDirectState as Ne, isExtensionState as Te, isOperationError as ke, isWebUIClient as be } from "@bodhiapp/bodhi-js-core";
4
+ import { useMemo as D, useRef as T, useCallback as l, useEffect as k, createContext as se, useState as N, useContext as oe } from "react";
5
+ const E = {
6
6
  // Modal lifecycle
7
7
  MODAL_READY: "modal:ready",
8
8
  MODAL_REFRESH: "modal:refresh",
@@ -16,22 +16,22 @@ const m = {
16
16
  // Connection selection
17
17
  MODAL_SELECT_CONNECTION: "modal:select-connection"
18
18
  };
19
- function se({
19
+ function ae({
20
20
  client: e,
21
- modalHtmlPath: o,
21
+ modalHtmlPath: s,
22
22
  hideSetup: w,
23
23
  onSetupReady: x,
24
- setupState: R,
25
- basePath: g = "/",
24
+ setupState: b,
25
+ basePath: m = "/",
26
26
  logLevel: A = "warn"
27
27
  }) {
28
- const p = R !== "ready", E = _(() => new B("SetupModalProcessor", A), [A]), u = T(null), a = _(
29
- () => new G(K(g, "bodhijs:")),
30
- [g]
31
- ), f = T(null), v = d(
28
+ const I = b !== "ready", y = D(() => new U("SetupModalProcessor", A), [A]), o = T(null), u = D(
29
+ () => new V(W(m, "bodhijs:")),
30
+ [m]
31
+ ), v = T(null), S = l(
32
32
  (t) => t === "direct" ? "lna" : t === "extension" ? "extension" : null,
33
33
  []
34
- ), y = d((t) => t.extension === "ready" ? {
34
+ ), _ = l((t) => t.extension === "ready" ? {
35
35
  status: "ready",
36
36
  version: "unknown",
37
37
  // TODO: have ExtensionState also get extension version
@@ -42,7 +42,7 @@ function se({
42
42
  } : {
43
43
  status: "unreachable",
44
44
  error: { message: "Client not initialized", code: "ext-connection-failed" }
45
- }, []), O = d((t) => {
45
+ }, []), O = l((t) => {
46
46
  if (t.server.status === "pending-extension-ready")
47
47
  return {
48
48
  status: "pending-extension-ready",
@@ -95,7 +95,7 @@ function se({
95
95
  }
96
96
  };
97
97
  }
98
- }, []), C = d((t) => {
98
+ }, []), p = l((t) => {
99
99
  if (t.server.status === "not-connected")
100
100
  return { status: "pending-lna-ready" };
101
101
  const r = t.server;
@@ -118,169 +118,169 @@ function se({
118
118
  error: { message: "Unknown server status" }
119
119
  };
120
120
  }
121
- }, []), L = d(
121
+ }, []), h = l(
122
122
  (t, r) => {
123
123
  if (t.server.status !== "pending-extension-ready") {
124
- const s = t.server.status;
125
- if (s === "ready" || s === "setup" || s === "resource-admin")
124
+ const n = t.server.status;
125
+ if (n === "ready" || n === "setup" || n === "resource-admin")
126
126
  return !0;
127
127
  }
128
128
  if (r.server.status !== "not-connected") {
129
- const s = r.server.status;
130
- if (s === "ready" || s === "setup" || s === "resource-admin")
129
+ const n = r.server.status;
130
+ if (n === "ready" || n === "setup" || n === "resource-admin")
131
131
  return !0;
132
132
  }
133
133
  return !1;
134
134
  },
135
135
  []
136
- ), h = d(
137
- (t, r, s) => {
136
+ ), g = l(
137
+ (t, r, n) => {
138
138
  if (r === "skipped")
139
- return { status: "skipped", serverUrl: s };
139
+ return { status: "skipped", serverUrl: n };
140
140
  if (t.server.status !== "not-connected") {
141
- const c = t.server;
142
- return c.status === "ready" || c.status === "setup" || c.status === "resource-admin" ? { status: "granted", serverUrl: s } : {
141
+ const a = t.server;
142
+ return a.status === "ready" || a.status === "setup" || a.status === "resource-admin" ? { status: "granted", serverUrl: n } : {
143
143
  status: "unreachable",
144
- serverUrl: s,
144
+ serverUrl: n,
145
145
  error: {
146
- message: c.error?.message || "Server unreachable",
146
+ message: a.error?.message || "Server unreachable",
147
147
  code: "lna-unreachable"
148
148
  }
149
149
  };
150
150
  }
151
- return r === "granted" ? { status: "granted", serverUrl: s } : { status: "prompt", serverUrl: s };
151
+ return r === "granted" ? { status: "granted", serverUrl: n } : { status: "prompt", serverUrl: n };
152
152
  },
153
153
  []
154
- ), S = d(
154
+ ), C = l(
155
155
  async (t = !1) => {
156
- const r = V().type, s = W().type;
157
- let c = await e.getExtensionState();
158
- (c.extension === "not-initialized" || t) && (c = await e.testExtensionConnectivity());
159
- let n = await e.getDirectState();
160
- const i = a.getDirectStatus();
161
- i === "granted" && (n.server.status === "not-connected" || t) && (n = await e.testDirectConnectivity());
162
- const M = j(n) || "http://localhost:1135", I = h(n, i, M);
163
- return e.getConnectionMode() === null && (Y(n) ? await e.setConnectionMode("direct") : q(c) && await e.setConnectionMode("extension")), a.isServerInstallConfirmed() || L(c, n) && a.setServerInstallConfirmed(!0), {
164
- extension: y(c),
165
- server: O(c),
166
- lna: I,
167
- lnaServer: C(n),
168
- env: { browser: r, os: s },
169
- browsers: J,
170
- os: X,
171
- userConfirmations: { serverInstall: a.isServerInstallConfirmed() },
172
- selectedConnection: v(e.getConnectionMode())
156
+ const r = j().type, n = Y().type;
157
+ let a = await e.getExtensionState();
158
+ (a.extension === "not-initialized" || t) && (a = await e.testExtensionConnectivity());
159
+ let c = await e.getDirectState();
160
+ const L = u.getDirectStatus();
161
+ L === "granted" && (c.server.status === "not-connected" || t) && (c = await e.testDirectConnectivity());
162
+ const d = q(c) || "http://localhost:1135", M = g(c, L, d);
163
+ return e.getConnectionMode() === null && (X(c) ? await e.setConnectionMode("direct") : $(a) && await e.setConnectionMode("extension")), u.isServerInstallConfirmed() || h(a, c) && u.setServerInstallConfirmed(!0), {
164
+ extension: _(a),
165
+ server: O(a),
166
+ lna: M,
167
+ lnaServer: p(c),
168
+ env: { browser: r, os: n },
169
+ browsers: Z,
170
+ os: J,
171
+ userConfirmations: { serverInstall: u.isServerInstallConfirmed() },
172
+ selectedConnection: S(e.getConnectionMode())
173
173
  };
174
174
  },
175
175
  [
176
176
  e,
177
- a,
178
- y,
177
+ u,
178
+ _,
179
179
  O,
180
- C,
181
- v,
182
- h,
183
- L
180
+ p,
181
+ S,
182
+ g,
183
+ h
184
184
  ]
185
- ), l = d(() => {
186
- if (!f.current)
185
+ ), f = l(() => {
186
+ if (!v.current)
187
187
  throw new Error("Cannot get state: currentStateRef is null");
188
188
  return {
189
- ...f.current,
189
+ ...v.current,
190
190
  // Override userConfirmations from storage (in case updated outside buildSetupState)
191
191
  userConfirmations: {
192
- serverInstall: a.isServerInstallConfirmed()
192
+ serverInstall: u.isServerInstallConfirmed()
193
193
  },
194
194
  // Override selectedConnection from client (in case changed via handler)
195
- selectedConnection: v(e.getConnectionMode())
195
+ selectedConnection: S(e.getConnectionMode())
196
196
  };
197
- }, [a, e, v]), D = _(
197
+ }, [u, e, S]), R = D(
198
198
  () => ({
199
- [m.MODAL_READY]: async () => (E.info("MODAL_READY: building initial state"), { setupState: l() }),
200
- [m.MODAL_REFRESH]: async () => {
201
- E.info("MODAL_REFRESH: refreshing state");
202
- const t = await S(!0);
203
- f.current = t;
204
- const r = l();
205
- return E.info(`MODAL_REFRESH: state refreshed
206
- `, JSON.stringify(r, null, 2)), u.current?.updateState(l()), { setupState: r };
199
+ [E.MODAL_READY]: async () => (y.info("MODAL_READY: building initial state"), { setupState: f() }),
200
+ [E.MODAL_REFRESH]: async () => {
201
+ y.info("MODAL_REFRESH: refreshing state");
202
+ const t = await C(!0);
203
+ v.current = t;
204
+ const r = f();
205
+ return y.info(`MODAL_REFRESH: state refreshed
206
+ `, JSON.stringify(r, null, 2)), o.current?.updateState(f()), { setupState: r };
207
207
  },
208
- [m.MODAL_LNA_CONNECT]: async (t) => {
208
+ [E.MODAL_LNA_CONNECT]: async (t) => {
209
209
  const r = t.payload.serverUrl;
210
210
  console.log("[SetupModalProcessor] LNA connect:", r);
211
- const s = await e.testDirectConnectivity(r);
212
- if (s.server.status !== "not-connected") {
213
- const n = s.server.status;
214
- if (n === "ready" || n === "setup" || n === "resource-admin") {
215
- a.setDirectStatus("granted"), e.getConnectionMode() === null && await e.setConnectionMode("direct");
216
- const i = await S();
217
- return f.current = i, u.current?.updateState(l()), { success: !0 };
211
+ const n = await e.testDirectConnectivity(r);
212
+ if (n.server.status !== "not-connected") {
213
+ const c = n.server.status;
214
+ if (c === "ready" || c === "setup" || c === "resource-admin") {
215
+ u.setDirectStatus("granted"), e.getConnectionMode() === null && await e.setConnectionMode("direct");
216
+ const L = await C();
217
+ return v.current = L, o.current?.updateState(f()), { success: !0 };
218
218
  }
219
219
  }
220
- const c = await S();
221
- return f.current = c, u.current?.updateState(l()), { success: !1 };
220
+ const a = await C();
221
+ return v.current = a, o.current?.updateState(f()), { success: !1 };
222
222
  },
223
- [m.MODAL_LNA_SKIP]: async () => {
224
- a.setDirectStatus("skipped");
225
- const t = await S();
226
- return f.current = t, u.current?.updateState(l()), { success: !0 };
223
+ [E.MODAL_LNA_SKIP]: async () => {
224
+ u.setDirectStatus("skipped");
225
+ const t = await C();
226
+ return v.current = t, o.current?.updateState(f()), { success: !0 };
227
227
  },
228
- [m.MODAL_CLOSE]: () => {
228
+ [E.MODAL_CLOSE]: () => {
229
229
  w();
230
230
  },
231
- [m.MODAL_COMPLETE]: () => {
231
+ [E.MODAL_COMPLETE]: () => {
232
232
  w();
233
233
  },
234
- [m.MODAL_CONFIRM_SERVER_INSTALL]: (t) => (a.setServerInstallConfirmed(t.payload.confirmed), u.current?.updateState(l()), { success: !0 }),
235
- [m.MODAL_SELECT_CONNECTION]: async (t) => {
236
- const s = t.payload.connection === "lna" ? "direct" : "extension";
237
- return await e.setConnectionMode(s), u.current?.updateState(l()), { success: !0 };
234
+ [E.MODAL_CONFIRM_SERVER_INSTALL]: (t) => (u.setServerInstallConfirmed(t.payload.confirmed), o.current?.updateState(f()), { success: !0 }),
235
+ [E.MODAL_SELECT_CONNECTION]: async (t) => {
236
+ const n = t.payload.connection === "lna" ? "direct" : "extension";
237
+ return await e.setConnectionMode(n), o.current?.updateState(f()), { success: !0 };
238
238
  }
239
239
  }),
240
- [E, e, a, S, l, C, w]
240
+ [y, e, u, C, f, p, w]
241
241
  );
242
- return b(() => (u.current = new Z({ modalHtmlPath: o, handlers: D }), () => {
243
- u.current?.destroy(), u.current = null;
244
- }), [o, D]), b(() => {
245
- p && u.current ? S(!0).then((t) => {
246
- f.current = t, u.current?.show(t), x?.();
242
+ return k(() => (o.current = new Q({ modalHtmlPath: s, handlers: R }), () => {
243
+ o.current?.destroy(), o.current = null;
244
+ }), [s, R]), k(() => {
245
+ I && o.current ? C(!0).then((t) => {
246
+ v.current = t, o.current?.show(t), x?.();
247
247
  }).catch((t) => {
248
248
  console.error("[SetupModalProcessor] buildSetupState failed:", t);
249
- }) : !p && u.current && u.current.destroy();
250
- }, [p, S, x]), null;
249
+ }) : !I && o.current && o.current.destroy();
250
+ }, [I, C, x]), null;
251
251
  }
252
- const oe = {
252
+ const ie = {
253
253
  status: "not-initialized",
254
254
  mode: null,
255
255
  extensionId: null,
256
256
  url: null,
257
- server: P,
257
+ server: F,
258
258
  error: null
259
- }, ae = {
259
+ }, ue = {
260
260
  status: "initializing",
261
261
  mode: null,
262
262
  extensionId: null,
263
263
  url: null,
264
- server: P,
264
+ server: F,
265
265
  error: null
266
266
  };
267
- function ie(e) {
267
+ function ce(e) {
268
268
  return e.status === "not-initialized";
269
269
  }
270
- function ue(e) {
270
+ function de(e) {
271
271
  return e.status === "initializing";
272
272
  }
273
- function ce(e) {
273
+ function le(e) {
274
274
  return e.status !== "not-initialized" && e.status !== "initializing";
275
275
  }
276
- function U(e) {
276
+ function H(e) {
277
277
  return e.status === "ready";
278
278
  }
279
- function de(e) {
280
- return U(e) && e.server.status === "ready";
279
+ function fe(e) {
280
+ return H(e) && e.server.status === "ready";
281
281
  }
282
- function le(e) {
283
- return Q(e) ? {
282
+ function Se(e) {
283
+ return ee(e) ? {
284
284
  status: e.extension === "not-initialized" ? "initializing" : e.extension === "not-found" ? "extension-not-found" : "ready",
285
285
  mode: "extension",
286
286
  extensionId: e.extensionId,
@@ -296,178 +296,178 @@ function le(e) {
296
296
  error: e.server.error
297
297
  };
298
298
  }
299
- const ve = {
300
- isNotInitialized: ie,
301
- isInitializing: ue,
302
- isInitialized: ce,
303
- isReady: U,
304
- isOverallReady: de
305
- }, z = re(null);
306
- z.displayName = "BodhiContext";
307
- function me({
299
+ const pe = {
300
+ isNotInitialized: ce,
301
+ isInitializing: de,
302
+ isInitialized: le,
303
+ isReady: H,
304
+ isOverallReady: fe
305
+ }, B = se(null);
306
+ B.displayName = "BodhiContext";
307
+ function ge({
308
308
  children: e,
309
- client: o,
309
+ client: s,
310
310
  modalHtmlPath: w,
311
311
  handleCallback: x = !0,
312
- callbackPath: R = "/callback",
313
- basePath: g = "/",
312
+ callbackPath: b,
313
+ basePath: m = "/",
314
314
  logLevel: A = "warn"
315
315
  }) {
316
- const p = _(() => new B("BodhiProvider", A), [A]), E = T(!1), u = T(!1), [a, f] = N(oe), [v, y] = N($), [O, C] = N(!1), [L, h] = N("ready");
317
- b(() => {
318
- const n = (i) => {
319
- switch (i.type) {
316
+ const I = m === "/" ? "" : m.replace(/\/$/, ""), y = b ?? `${I}/callback`, o = D(() => new U("BodhiProvider", A), [A]), u = T(!1), v = T(!1), [S, _] = N(ie), [O, p] = N(te), [h, g] = N(!1), [C, f] = N("ready");
317
+ k(() => {
318
+ const i = (d) => {
319
+ switch (d.type) {
320
320
  case "client-state":
321
- f(le(i.state));
321
+ _(Se(d.state));
322
322
  break;
323
323
  case "auth-state":
324
- y(i.state), C(!1);
324
+ p(d.state), g(!1);
325
325
  break;
326
326
  }
327
327
  };
328
- return o.setStateCallback(n), () => {
329
- o.setStateCallback(ee);
328
+ return s.setStateCallback(i), () => {
329
+ s.setStateCallback(re);
330
330
  };
331
- }, [o]);
332
- const S = d(async () => {
333
- h("loading");
334
- }, []), l = d(() => {
335
- h("ready");
336
- }, []), D = d(() => {
337
- h("loaded");
338
- }, []), t = d(
339
- async (n) => {
340
- f(ae);
331
+ }, [s]);
332
+ const R = l(async () => {
333
+ f("loading");
334
+ }, []), t = l(() => {
335
+ f("ready");
336
+ }, []), r = l(() => {
337
+ f("loaded");
338
+ }, []), n = l(
339
+ async (i) => {
340
+ _(ue);
341
341
  try {
342
- await o.init(n || {});
343
- } catch (i) {
344
- p.error("Init failed:", i);
342
+ await s.init(i || {});
343
+ } catch (d) {
344
+ o.error("Init failed:", d);
345
345
  }
346
346
  },
347
- [o, p]
347
+ [s, o]
348
348
  );
349
- b(() => {
350
- if (u.current) return;
351
- u.current = !0, (async () => {
352
- if (await t(), !x) return;
353
- const i = new URL(window.location.href);
354
- if (i.pathname !== R) return;
355
- const k = i.searchParams.get("code"), M = i.searchParams.get("state");
356
- !k || !M || E.current || (E.current = !0, te(o) && (C(!0), o.handleOAuthCallback(k, M).then(() => {
357
- window.history.replaceState({}, "", g);
358
- }).catch((I) => {
359
- p.error("OAuth callback failed:", I), y({
349
+ k(() => {
350
+ if (v.current) return;
351
+ v.current = !0, (async () => {
352
+ if (await n(), !x) return;
353
+ const d = new URL(window.location.href);
354
+ if (d.pathname !== y) return;
355
+ const M = d.searchParams.get("code"), P = d.searchParams.get("state");
356
+ !M || !P || u.current || (u.current = !0, ne(s) && (g(!0), s.handleOAuthCallback(M, P).then(() => {
357
+ window.history.replaceState({}, "", m);
358
+ }).catch((z) => {
359
+ o.error("OAuth callback failed:", z), p({
360
360
  status: "error",
361
361
  user: null,
362
362
  accessToken: null,
363
363
  error: {
364
- message: I instanceof Error ? I.message : "OAuth callback failed",
364
+ message: z instanceof Error ? z.message : "OAuth callback failed",
365
365
  code: "OAUTH_CALLBACK_FAILED"
366
366
  }
367
- }), C(!1), window.history.replaceState({}, "", g);
367
+ }), g(!1), window.history.replaceState({}, "", m);
368
368
  })));
369
369
  })();
370
- }, [t, o, x, R, g]);
371
- const r = d(async () => {
372
- C(!0);
370
+ }, [n, s, x, y, m]);
371
+ const a = l(async () => {
372
+ g(!0);
373
373
  try {
374
- await o.login();
375
- } catch (n) {
376
- y({
374
+ await s.login();
375
+ } catch (i) {
376
+ p({
377
377
  status: "error",
378
378
  user: null,
379
379
  accessToken: null,
380
380
  error: {
381
- message: n instanceof Error ? n.message : "Login failed",
381
+ message: i instanceof Error ? i.message : "Login failed",
382
382
  code: "LOGIN_FAILED"
383
383
  }
384
- }), C(!1);
384
+ }), g(!1);
385
385
  }
386
- }, [o]), s = d(async () => {
386
+ }, [s]), c = l(async () => {
387
387
  try {
388
- await o.logout();
389
- } catch (n) {
390
- y({
388
+ await s.logout();
389
+ } catch (i) {
390
+ p({
391
391
  status: "error",
392
392
  user: null,
393
393
  accessToken: null,
394
394
  error: {
395
- message: n instanceof Error ? n.message : "Logout failed",
395
+ message: i instanceof Error ? i.message : "Logout failed",
396
396
  code: "LOGOUT_FAILED"
397
397
  }
398
398
  });
399
399
  }
400
- }, [o]), c = _(() => {
401
- const n = a.status === "ready", i = a.server.status === "ready";
400
+ }, [s]), L = D(() => {
401
+ const i = S.status === "ready", d = S.server.status === "ready";
402
402
  return {
403
- client: o,
404
- clientState: a,
405
- auth: v,
406
- isAuthLoading: O,
407
- login: r,
408
- logout: s,
409
- showSetup: S,
410
- hideSetup: l,
411
- setupState: L,
403
+ client: s,
404
+ clientState: S,
405
+ auth: O,
406
+ isAuthLoading: h,
407
+ login: a,
408
+ logout: c,
409
+ showSetup: R,
410
+ hideSetup: t,
411
+ setupState: C,
412
412
  // Computed auth properties
413
- isAuthenticated: v.status === "authenticated",
414
- canLogin: n && !O,
413
+ isAuthenticated: O.status === "authenticated",
414
+ canLogin: i && !h,
415
415
  // Computed connection properties
416
- isReady: n,
417
- isServerReady: i,
418
- isOverallReady: n && i,
419
- isInitializing: a.status === "initializing",
420
- isExtension: a.mode === "extension",
421
- isDirect: a.mode === "direct"
416
+ isReady: i,
417
+ isServerReady: d,
418
+ isOverallReady: i && d,
419
+ isInitializing: S.status === "initializing",
420
+ isExtension: S.mode === "extension",
421
+ isDirect: S.mode === "direct"
422
422
  };
423
- }, [o, a, v, O, L, r, s, S, l]);
424
- return /* @__PURE__ */ F(z.Provider, { value: c, children: [
425
- /* @__PURE__ */ H(
426
- se,
423
+ }, [s, S, O, h, C, a, c, R, t]);
424
+ return /* @__PURE__ */ G(B.Provider, { value: L, children: [
425
+ /* @__PURE__ */ K(
426
+ ae,
427
427
  {
428
- client: o,
428
+ client: s,
429
429
  modalHtmlPath: w,
430
- hideSetup: l,
431
- onSetupReady: D,
432
- setupState: L,
433
- basePath: g,
430
+ hideSetup: t,
431
+ onSetupReady: r,
432
+ setupState: C,
433
+ basePath: m,
434
434
  logLevel: A
435
435
  }
436
436
  ),
437
437
  e
438
438
  ] });
439
439
  }
440
- function ge() {
441
- const e = ne(z);
440
+ function Ee() {
441
+ const e = oe(B);
442
442
  if (!e) throw new Error("useBodhi must be used within BodhiProvider");
443
443
  return e;
444
444
  }
445
- const pe = "production";
445
+ const ye = "production";
446
446
  export {
447
- me as BodhiProvider,
448
- z as BodhiReactContext,
449
- ve as ClientCtxState,
450
- ae as INITIALIZING_CLIENT_CONTEXT_STATE,
451
- oe as INITIAL_CLIENT_CONTEXT_STATE,
452
- pe as REACT_CORE_BUILD_MODE,
453
- le as clientStateToContextState,
454
- Ae as createApiError,
455
- Oe as createOperationError,
456
- Le as isApiResultError,
457
- he as isApiResultOperationError,
458
- we as isApiResultSuccess,
459
- xe as isAuthError,
460
- Ie as isAuthLoading,
461
- _e as isAuthenticated,
462
- ce as isClientCtxInitialized,
463
- ue as isClientCtxInitializing,
464
- ie as isClientCtxNotInitialized,
465
- U as isClientCtxReady,
466
- Re as isClientReady,
467
- De as isDirectState,
468
- Me as isExtensionState,
469
- Ne as isOperationError,
470
- de as isOverallReady,
471
- Te as isWebUIClient,
472
- ge as useBodhi
447
+ ge as BodhiProvider,
448
+ B as BodhiReactContext,
449
+ pe as ClientCtxState,
450
+ ue as INITIALIZING_CLIENT_CONTEXT_STATE,
451
+ ie as INITIAL_CLIENT_CONTEXT_STATE,
452
+ ye as REACT_CORE_BUILD_MODE,
453
+ Se as clientStateToContextState,
454
+ he as createApiError,
455
+ Le as createOperationError,
456
+ we as isApiResultError,
457
+ xe as isApiResultOperationError,
458
+ Ie as isApiResultSuccess,
459
+ _e as isAuthError,
460
+ Re as isAuthLoading,
461
+ De as isAuthenticated,
462
+ le as isClientCtxInitialized,
463
+ de as isClientCtxInitializing,
464
+ ce as isClientCtxNotInitialized,
465
+ H as isClientCtxReady,
466
+ Me as isClientReady,
467
+ Ne as isDirectState,
468
+ Te as isExtensionState,
469
+ ke as isOperationError,
470
+ fe as isOverallReady,
471
+ be as isWebUIClient,
472
+ Ee as useBodhi
473
473
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bodhiapp/bodhi-js-react-core",
3
- "version": "0.0.11",
3
+ "version": "0.0.12",
4
4
  "description": "Core React bindings for Bodhi Browser SDK (dependency injection)",
5
5
  "type": "module",
6
6
  "main": "dist/bodhi-react-core.cjs.js",
@@ -42,7 +42,7 @@
42
42
  "typecheck": "tsc --noEmit"
43
43
  },
44
44
  "dependencies": {
45
- "@bodhiapp/bodhi-js-core": "0.0.11",
45
+ "@bodhiapp/bodhi-js-core": "0.0.12",
46
46
  "@bodhiapp/ts-client": "0.1.9"
47
47
  },
48
48
  "peerDependencies": {