@enterprisestandard/react 0.0.20-beta.20260615.5 → 0.0.20-beta.20260619.3
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.
- package/dist/index.d.ts +1 -18
- package/dist/index.js +1 -1
- package/package.json +4 -4
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
export * from "@enterprisestandard/core";
|
|
2
|
-
import { generateULID } from "@enterprisestandard/core";
|
|
3
2
|
import { Customer, Logger } from "@enterprisestandard/core";
|
|
4
3
|
import { ReactNode as ReactNode2 } from "react";
|
|
5
4
|
type StorageType = "local" | "session" | "memory";
|
|
@@ -131,20 +130,4 @@ type TenantProviderProps = {
|
|
|
131
130
|
declare function createTenantUrls(id: string, strategy?: TenantRoutingStrategy): TenantUrls;
|
|
132
131
|
declare function TenantProvider({ id, strategy, children }: TenantProviderProps): React.ReactNode;
|
|
133
132
|
declare function useTenant(): TenantContextValue;
|
|
134
|
-
|
|
135
|
-
type UseTenantDirectoryOptions = {
|
|
136
|
-
tenantManagerBaseUrl?: string;
|
|
137
|
-
start?: number;
|
|
138
|
-
limit?: number;
|
|
139
|
-
order?: string;
|
|
140
|
-
};
|
|
141
|
-
declare function useTenantDirectory<TTenant extends TenantResponse = TenantResponse>(options?: UseTenantDirectoryOptions): {
|
|
142
|
-
directory: TenantDirectoryResponse<TTenant> | null;
|
|
143
|
-
tenants: Record<string, TTenant>;
|
|
144
|
-
ids: string[];
|
|
145
|
-
items: TTenant[];
|
|
146
|
-
isLoading: boolean;
|
|
147
|
-
error: Error | null;
|
|
148
|
-
refresh: () => Promise<void>;
|
|
149
|
-
};
|
|
150
|
-
export { useTenantDirectory, useTenant, useSSOContext, useOptionalSSOContext, useOptionalCIAMContext, useCIAMProviders, useCIAMContext, logoutCustomer, logout, getUser, getCustomer, generateULID, createTenantUrls, UseTenantDirectoryOptions, UseCIAMProvidersResult, TenantProvider, SignedOut, SignedIn, SignInLoading, SSOProvider, CIAMProviderListProps, CIAMProviderList, CIAMProvider };
|
|
133
|
+
export { useTenant, useSSOContext, useOptionalSSOContext, useOptionalCIAMContext, useCIAMProviders, useCIAMContext, logoutCustomer, logout, getUser, getCustomer, createTenantUrls, UseCIAMProvidersResult, TenantProvider, SignedOut, SignedIn, SignInLoading, SSOProvider, CIAMProviderListProps, CIAMProviderList, CIAMProvider };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export*from"@enterprisestandard/core";import{generateULID as Bi}from"@enterprisestandard/core";import{silentLogger as Y}from"@enterprisestandard/core";import{createContext as s,useCallback as J,useContext as b,useEffect as C,useState as L}from"react";import{jsx as Rn}from"react/jsx-runtime";var G=s(void 0),r=/^[a-zA-Z0-9._-]{1,1024}$/;function e(n){if(!n.trim())throw Error("CIAMProvider storageKey must be a non-empty string.");if(!r.test(n))throw Error("CIAMProvider storageKey must be 1-1024 characters and contain only letters, numbers, dots, underscores, and hyphens.")}var u=(n)=>{if(n===void 0||n==="")return"es.ciam.customer";return e(n),n};function Z(n,T,i=Y){if(typeof window>"u")return null;try{let P=(n==="local"?localStorage:sessionStorage).getItem(T);if(!P)return null;let R=JSON.parse(P);if(R.ciam?.expires)R.ciam.expires=new Date(R.ciam.expires);return R}catch(f){return i.error("Error loading customer from storage:",f),null}}async function F(n,T=Y){try{let i=await fetch(n);if(i.status===401)return null;if(!i.ok)throw Error(`Failed to fetch customer: ${i.status} ${i.statusText}`);let f=await i.json();if(f.ciam?.expires&&typeof f.ciam.expires==="string")f.ciam.expires=new Date(f.ciam.expires);return f}catch(i){return T.error("Error fetching customer from URL:",i),null}}function nn({storageKey:n,customerUrl:T,storage:i="memory",disableListener:f=!1,log:P=Y,children:R}){let[q,M]=L(null),[E,x]=L(!!T),A=u(n),N=J(()=>{if(i==="memory")return null;return Z(i,A,P)},[i,A,P]),W=J((c)=>{if(i==="memory"||typeof window>"u")return;try{let $=i==="local"?localStorage:sessionStorage;if(c===null)$.removeItem(A);else $.setItem(A,JSON.stringify(c))}catch($){P.error("Error saving customer to storage:",$)}},[i,A,P]),O=J((c)=>{M(c),W(c)},[W]),B=J(async()=>{if(!T)return;x(!0);try{let c=await F(T,P);M(c),W(c)}finally{x(!1)}},[T,W,P]);C(()=>{let c=N();if(c)M(c);if(T)B();else x(!1)},[N,T,B]),C(()=>{if(f||i==="memory")return;let c=(z)=>{if(z.key!==A)return;if(z.newValue===null)M(null);else try{let I=JSON.parse(z.newValue);if(I.ciam?.expires)I.ciam.expires=new Date(I.ciam.expires);M(I)}catch(I){P.error("Error parsing customer from storage event:",I)}},$=()=>{M(null)};return window.addEventListener("storage",c),window.addEventListener("es-ciam-logout",$),()=>{window.removeEventListener("storage",c),window.removeEventListener("es-ciam-logout",$)}},[f,i,A,P]);let w={customer:q,setCustomer:O,isLoading:E};return Rn(G.Provider,{value:w,children:R})}function Tn(){let n=b(G);if(n===void 0)throw Error("useCIAMContext must be used within a CIAMProvider");return n}function _(){return b(G)}async function fn(n,T){let i=u(T),f=Z("local",i);if(f)return f;let P=Z("session",i);if(P)return P;if(n){let R=await F(n);if(R)return R}return}async function Pn(n){try{let T=await fetch(n,{headers:{Accept:"application/json"}});if(!T.ok)return{success:!1,error:`HTTP ${T.status}`};let i=await T.json();if(!i.success)return{success:!1,error:i.message||"Logout failed"};if(typeof window<"u")localStorage.removeItem("es.ciam.customer"),sessionStorage.removeItem("es.ciam.customer"),window.dispatchEvent(new CustomEvent("es-ciam-logout"));return{success:!0}}catch(T){return{success:!1,error:T instanceof Error?T.message:"Network error"}}}import{silentLogger as y}from"@enterprisestandard/core";import{useCallback as An,useEffect as cn,useState as Q}from"react";import{jsx as p,jsxs as X}from"react/jsx-runtime";function S(n,T=y){let[i,f]=Q([]),[P,R]=Q(Boolean(n)),[q,M]=Q(null),E=An(()=>{if(!n)return;let x=!1;return R(!0),M(null),fetch(n,{headers:{Accept:"application/json"}}).then(async(A)=>{if(!A.ok)throw Error(`Failed to fetch CIAM providers: ${A.status} ${A.statusText}`);let N=await A.json();if(!x)f(Array.isArray(N.providers)?N.providers:[])}).catch((A)=>{let N=A instanceof Error?A:Error(String(A));if(T.error("Error fetching CIAM providers:",N),!x)M(N)}).finally(()=>{if(!x)R(!1)}),()=>{x=!0}},[n,T]);return cn(()=>{return E()},[E]),{providers:i,isLoading:P,error:q,refresh:E}}function Mn(n,T){return{display:"flex",alignItems:"center",gap:"0.5rem",width:"100%",padding:"0.625rem 0.875rem",border:"1px solid rgba(0,0,0,0.15)",borderRadius:"0.5rem",background:(T==="dark"?n.colors?.dark:n.colors?.light)??(T==="dark"?"#1f1f1f":"#ffffff"),color:T==="dark"?"#ffffff":"#111111",textDecoration:"none",font:"inherit",cursor:"pointer"}}function On({providersUrl:n,limit:T,theme:i="light",renderProvider:f,loadingFallback:P,emptyFallback:R,moreLabel:q="Show more",className:M,log:E=y}){let{providers:x,isLoading:A}=S(n,E),[N,W]=Q(!1);if(A)return P??null;if(x.length===0)return R??null;let O=!N&&typeof T==="number"&&T>0?x.slice(0,T):x,B=O.length<x.length;return X("div",{className:M,style:{display:"flex",flexDirection:"column",gap:"0.5rem"},"data-es-ciam-providers":"",children:[O.map((w)=>f?p("span",{children:f(w)},w.name):X("a",{href:w.loginUrl,style:Mn(w,i),"data-es-ciam-provider":w.name,children:[w.iconUrl?p("img",{src:w.iconUrl,alt:"",width:20,height:20,"aria-hidden":"true"}):null,X("span",{children:["Continue with ",w.displayName]})]},w.name)),B?p("button",{type:"button",onClick:()=>W(!0),"data-es-ciam-show-more":"",children:q}):null]})}import{silentLogger as h}from"@enterprisestandard/core";import{createContext as xn,useCallback as V,useContext as K,useEffect as t,useState as m}from"react";import{jsx as qn}from"react/jsx-runtime";var k=xn(void 0),Nn=/^[a-zA-Z0-9._-]{1,1024}$/;function $n(n){if(!n.trim())throw Error("SSOProvider storageKey must be a non-empty string.");if(!Nn.test(n))throw Error("SSOProvider storageKey must be 1-1024 characters and contain only letters, numbers, dots, underscores, and hyphens.")}var v=(n)=>{if(n===void 0||n==="")return"es.sso.user";return $n(n),n};function D(n,T,i=h){if(typeof window>"u")return null;try{let P=(n==="local"?localStorage:sessionStorage).getItem(T);if(!P)return null;let R=JSON.parse(P);if(R.sso?.expires)R.sso.expires=new Date(R.sso.expires);return R}catch(f){return i.error("Error loading user from storage:",f),null}}async function U(n,T=h){try{let i=await fetch(n);if(i.status===401)return null;if(!i.ok)throw Error(`Failed to fetch user: ${i.status} ${i.statusText}`);let f=await i.json();if(f.sso?.expires&&typeof f.sso.expires==="string")f.sso.expires=new Date(f.sso.expires);return f}catch(i){return T.error("Error fetching user from URL:",i),null}}function Wn({storageKey:n,userUrl:T,storage:i="memory",disableListener:f=!1,log:P=h,children:R}){let[q,M]=m(null),[E,x]=m(!!T),A=v(n),N=V(()=>{if(i==="memory")return null;return D(i,A,P)},[i,A,P]),W=V((c)=>{if(i==="memory"||typeof window>"u")return;try{let $=i==="local"?localStorage:sessionStorage;if(c===null)$.removeItem(A);else $.setItem(A,JSON.stringify(c))}catch($){P.error("Error saving user to storage:",$)}},[i,A,P]),O=V((c)=>{M(c),W(c)},[W]),B=V(async()=>{if(!T)return;x(!0);try{let c=await U(T,P);M(c),W(c)}finally{x(!1)}},[T,W,P]);t(()=>{let c=N();if(c)M(c);if(T)B();else x(!1)},[N,T,B]),t(()=>{if(f||i==="memory")return;let c=(z)=>{if(z.key!==A)return;if(z.newValue===null)M(null);else try{let I=JSON.parse(z.newValue);if(I.sso?.expires)I.sso.expires=new Date(I.sso.expires);M(I)}catch(I){P.error("Error parsing user from storage event:",I)}},$=()=>{M(null)};return window.addEventListener("storage",c),window.addEventListener("es-sso-logout",$),()=>{window.removeEventListener("storage",c),window.removeEventListener("es-sso-logout",$)}},[f,i,A,P]);let w={user:q,setUser:O,isLoading:E};return qn(k.Provider,{value:w,children:R})}function wn(){let n=K(k);if(n===void 0)throw Error("useSSOContext must be used within a SSOProvider");return n}function H(){return K(k)}async function In(n,T){let i=v(T),f=D("local",i);if(f)return f;let P=D("session",i);if(P)return P;if(n){let R=await U(n);if(R)return R}return}async function En(n){try{let T=await fetch(n,{headers:{Accept:"application/json"}});if(!T.ok)return{success:!1,error:`HTTP ${T.status}`};let i=await T.json();if(!i.success)return{success:!1,error:i.message||"Logout failed"};if(typeof window<"u")localStorage.removeItem("es.sso.user"),sessionStorage.removeItem("es.sso.user"),window.dispatchEvent(new CustomEvent("es-sso-logout"));return{success:!0}}catch(T){return{success:!1,error:T instanceof Error?T.message:"Network error"}}}import{jsx as _n,Fragment as zn}from"react/jsx-runtime";function Bn({complete:n=!1,audience:T="workforce",children:i}){let f=H(),P=_();if((T==="customer"?!!P?.isLoading:!!f?.isLoading)&&!n)return _n(zn,{children:i});return null}import{jsx as Qn,Fragment as Jn}from"react/jsx-runtime";function Hn({audience:n="workforce",children:T}){let i=H(),f=_();if(n==="customer"?!!f?.customer:!!i?.user)return Qn(Jn,{children:T});return null}import{jsx as Yn,Fragment as Zn}from"react/jsx-runtime";function Vn({audience:n="workforce",children:T}){let i=H(),f=_(),P=n==="customer"?!!f?.customer:!!i?.user,R=n==="customer"?!!f?.isLoading:!!i?.isLoading;if(P||R)return null;return Yn(Zn,{children:T})}import{buildTenantPath as d,DEFAULT_TENANT_API_NAMESPACE as Gn,DEFAULT_TENANT_UI_NAMESPACE as pn,normalizeTenantRoutingStrategy as a}from"@enterprisestandard/core";import{createContext as Xn,useContext as Dn,useMemo as hn}from"react";import{jsx as Cn}from"react/jsx-runtime";var g=Xn(null);function o(n,T){let i=a(T);if(i.type==="jwt"){let R=i.ui?.segments??[],q=i.api?.segments??["api"];return{ui:(M="/")=>l(R,M),api:(M="/")=>l(q,M)}}let f=i.ui??pn,P=i.api??Gn;return{ui:(R="/")=>d(n,R,f),api:(R="/")=>d(n,R,P)}}function l(n,T="/"){let i=n.join("/"),f=T.trim().replace(/^\/+/,"");if(!i&&!f)return"/";if(!i)return`/${f}`;if(!f)return`/${i}`;return`/${i}/${f}`}function kn({id:n,strategy:T,children:i}){let f=hn(()=>{let P=a(T);return{id:n,strategy:P,urls:o(n,P)}},[T,n]);return Cn(g.Provider,{value:f,children:i})}function jn(){let n=Dn(g);if(!n)throw Error("useTenant() must be used within a TenantProvider");return n}import{useCallback as Ln,useEffect as bn,useMemo as un,useState as j}from"react";function Fn(n={}){let T=n.tenantManagerBaseUrl??"/api/tenants/mine",[i,f]=j(null),[P,R]=j(!0),[q,M]=j(null),E=un(()=>{let O=new URL(T,"http://localhost");if(n.start!=null)O.searchParams.set("start",String(n.start));if(n.limit!=null)O.searchParams.set("limit",String(n.limit));if(n.order)O.searchParams.set("order",n.order);return`${O.pathname}${O.search}`},[n.limit,n.order,n.start,T]),x=Ln(async()=>{R(!0),M(null);try{let O=await fetch(E);if(!O.ok){f(null),M(Error(`Tenant directory request failed with status ${O.status}`));return}let B=await O.json();f(B)}catch(O){f(null),M(O instanceof Error?O:Error("Failed to load tenant directory"))}finally{R(!1)}},[E]);bn(()=>{x()},[x]);let A=i?.tenants??{},N=i?.ids??[],W=N.map((O)=>A[O]).filter((O)=>!!O);return{directory:i,tenants:A,ids:N,items:W,isLoading:P,error:q,refresh:x}}export{Fn as useTenantDirectory,jn as useTenant,wn as useSSOContext,H as useOptionalSSOContext,_ as useOptionalCIAMContext,S as useCIAMProviders,Tn as useCIAMContext,Pn as logoutCustomer,En as logout,In as getUser,fn as getCustomer,Bi as generateULID,o as createTenantUrls,kn as TenantProvider,Vn as SignedOut,Hn as SignedIn,Bn as SignInLoading,Wn as SSOProvider,On as CIAMProviderList,nn as CIAMProvider};
|
|
1
|
+
export*from"@enterprisestandard/core";import{silentLogger as X}from"@enterprisestandard/core";import{createContext as a,useCallback as w,useContext as L,useEffect as p,useState as F}from"react";import{jsx as Pn}from"react/jsx-runtime";var k=a(void 0),o=/^[a-zA-Z0-9._-]{1,1024}$/;function s(n){if(!n.trim())throw Error("CIAMProvider storageKey must be a non-empty string.");if(!o.test(n))throw Error("CIAMProvider storageKey must be 1-1024 characters and contain only letters, numbers, dots, underscores, and hyphens.")}var b=(n)=>{if(n===void 0||n==="")return"es.ciam.customer";return s(n),n};function E(n,P,A=X){if(typeof window>"u")return null;try{let R=(n==="local"?localStorage:sessionStorage).getItem(P);if(!R)return null;let M=JSON.parse(R);if(M.ciam?.expires)M.ciam.expires=new Date(M.ciam.expires);return M}catch(T){return A.error("Error loading customer from storage:",T),null}}async function c(n,P=X){try{let A=await fetch(n);if(A.status===401)return null;if(!A.ok)throw Error(`Failed to fetch customer: ${A.status} ${A.statusText}`);let T=await A.json();if(T.ciam?.expires&&typeof T.ciam.expires==="string")T.ciam.expires=new Date(T.ciam.expires);return T}catch(A){return P.error("Error fetching customer from URL:",A),null}}function r({storageKey:n,customerUrl:P,storage:A="memory",disableListener:T=!1,log:R=X,children:M}){let[Q,W]=F(null),[J,x]=F(!!P),O=b(n),z=w(()=>{if(A==="memory")return null;return E(A,O,R)},[A,O,R]),H=w((N)=>{if(A==="memory"||typeof window>"u")return;try{let I=A==="local"?localStorage:sessionStorage;if(N===null)I.removeItem(O);else I.setItem(O,JSON.stringify(N))}catch(I){R.error("Error saving customer to storage:",I)}},[A,O,R]),B=w((N)=>{W(N),H(N)},[H]),V=w(async()=>{if(!P)return;x(!0);try{let N=await c(P,R);W(N),H(N)}finally{x(!1)}},[P,H,R]);p(()=>{let N=z();if(N)W(N);if(P)V();else x(!1)},[z,P,V]),p(()=>{if(T||A==="memory")return;let N=(Z)=>{if(Z.key!==O)return;if(Z.newValue===null)W(null);else try{let q=JSON.parse(Z.newValue);if(q.ciam?.expires)q.ciam.expires=new Date(q.ciam.expires);W(q)}catch(q){R.error("Error parsing customer from storage event:",q)}},I=()=>{W(null)};return window.addEventListener("storage",N),window.addEventListener("es-ciam-logout",I),()=>{window.removeEventListener("storage",N),window.removeEventListener("es-ciam-logout",I)}},[T,A,O,R]);let _={customer:Q,setCustomer:B,isLoading:J};return Pn(k.Provider,{value:_,children:M})}function e(){let n=L(k);if(n===void 0)throw Error("useCIAMContext must be used within a CIAMProvider");return n}function $(){return L(k)}async function nn(n,P){let A=b(P),T=E("local",A);if(T)return T;let R=E("session",A);if(R)return R;if(n){let M=await c(n);if(M)return M}return}async function An(n){try{let P=await fetch(n,{headers:{Accept:"application/json"}});if(!P.ok)return{success:!1,error:`HTTP ${P.status}`};let A=await P.json();if(!A.success)return{success:!1,error:A.message||"Logout failed"};if(typeof window<"u")localStorage.removeItem("es.ciam.customer"),sessionStorage.removeItem("es.ciam.customer"),window.dispatchEvent(new CustomEvent("es-ciam-logout"));return{success:!0}}catch(P){return{success:!1,error:P instanceof Error?P.message:"Network error"}}}import{silentLogger as S}from"@enterprisestandard/core";import{useCallback as Tn,useEffect as Rn,useState as Y}from"react";import{jsx as D,jsxs as j}from"react/jsx-runtime";function y(n,P=S){let[A,T]=Y([]),[R,M]=Y(Boolean(n)),[Q,W]=Y(null),J=Tn(()=>{if(!n)return;let x=!1;return M(!0),W(null),fetch(n,{headers:{Accept:"application/json"}}).then(async(O)=>{if(!O.ok)throw Error(`Failed to fetch CIAM providers: ${O.status} ${O.statusText}`);let z=await O.json();if(!x)T(Array.isArray(z.providers)?z.providers:[])}).catch((O)=>{let z=O instanceof Error?O:Error(String(O));if(P.error("Error fetching CIAM providers:",z),!x)W(z)}).finally(()=>{if(!x)M(!1)}),()=>{x=!0}},[n,P]);return Rn(()=>{return J()},[J]),{providers:A,isLoading:R,error:Q,refresh:J}}function Mn(n,P){return{display:"flex",alignItems:"center",gap:"0.5rem",width:"100%",padding:"0.625rem 0.875rem",border:"1px solid rgba(0,0,0,0.15)",borderRadius:"0.5rem",background:(P==="dark"?n.colors?.dark:n.colors?.light)??(P==="dark"?"#1f1f1f":"#ffffff"),color:P==="dark"?"#ffffff":"#111111",textDecoration:"none",font:"inherit",cursor:"pointer"}}function Nn({providersUrl:n,limit:P,theme:A="light",renderProvider:T,loadingFallback:R,emptyFallback:M,moreLabel:Q="Show more",className:W,log:J=S}){let{providers:x,isLoading:O}=y(n,J),[z,H]=Y(!1);if(O)return R??null;if(x.length===0)return M??null;let B=!z&&typeof P==="number"&&P>0?x.slice(0,P):x,V=B.length<x.length;return j("div",{className:W,style:{display:"flex",flexDirection:"column",gap:"0.5rem"},"data-es-ciam-providers":"",children:[B.map((_)=>T?D("span",{children:T(_)},_.name):j("a",{href:_.loginUrl,style:Mn(_,A),"data-es-ciam-provider":_.name,children:[_.iconUrl?D("img",{src:_.iconUrl,alt:"",width:20,height:20,"aria-hidden":"true"}):null,j("span",{children:["Continue with ",_.displayName]})]},_.name)),V?D("button",{type:"button",onClick:()=>H(!0),"data-es-ciam-show-more":"",children:Q}):null]})}import{silentLogger as i}from"@enterprisestandard/core";import{createContext as On,useCallback as G,useContext as v,useEffect as K,useState as u}from"react";import{jsx as Hn}from"react/jsx-runtime";var h=On(void 0),Wn=/^[a-zA-Z0-9._-]{1,1024}$/;function xn(n){if(!n.trim())throw Error("SSOProvider storageKey must be a non-empty string.");if(!Wn.test(n))throw Error("SSOProvider storageKey must be 1-1024 characters and contain only letters, numbers, dots, underscores, and hyphens.")}var U=(n)=>{if(n===void 0||n==="")return"es.sso.user";return xn(n),n};function C(n,P,A=i){if(typeof window>"u")return null;try{let R=(n==="local"?localStorage:sessionStorage).getItem(P);if(!R)return null;let M=JSON.parse(R);if(M.sso?.expires)M.sso.expires=new Date(M.sso.expires);return M}catch(T){return A.error("Error loading user from storage:",T),null}}async function m(n,P=i){try{let A=await fetch(n);if(A.status===401)return null;if(!A.ok)throw Error(`Failed to fetch user: ${A.status} ${A.statusText}`);let T=await A.json();if(T.sso?.expires&&typeof T.sso.expires==="string")T.sso.expires=new Date(T.sso.expires);return T}catch(A){return P.error("Error fetching user from URL:",A),null}}function In({storageKey:n,userUrl:P,storage:A="memory",disableListener:T=!1,log:R=i,children:M}){let[Q,W]=u(null),[J,x]=u(!!P),O=U(n),z=G(()=>{if(A==="memory")return null;return C(A,O,R)},[A,O,R]),H=G((N)=>{if(A==="memory"||typeof window>"u")return;try{let I=A==="local"?localStorage:sessionStorage;if(N===null)I.removeItem(O);else I.setItem(O,JSON.stringify(N))}catch(I){R.error("Error saving user to storage:",I)}},[A,O,R]),B=G((N)=>{W(N),H(N)},[H]),V=G(async()=>{if(!P)return;x(!0);try{let N=await m(P,R);W(N),H(N)}finally{x(!1)}},[P,H,R]);K(()=>{let N=z();if(N)W(N);if(P)V();else x(!1)},[z,P,V]),K(()=>{if(T||A==="memory")return;let N=(Z)=>{if(Z.key!==O)return;if(Z.newValue===null)W(null);else try{let q=JSON.parse(Z.newValue);if(q.sso?.expires)q.sso.expires=new Date(q.sso.expires);W(q)}catch(q){R.error("Error parsing user from storage event:",q)}},I=()=>{W(null)};return window.addEventListener("storage",N),window.addEventListener("es-sso-logout",I),()=>{window.removeEventListener("storage",N),window.removeEventListener("es-sso-logout",I)}},[T,A,O,R]);let _={user:Q,setUser:B,isLoading:J};return Hn(h.Provider,{value:_,children:M})}function zn(){let n=v(h);if(n===void 0)throw Error("useSSOContext must be used within a SSOProvider");return n}function f(){return v(h)}async function _n(n,P){let A=U(P),T=C("local",A);if(T)return T;let R=C("session",A);if(R)return R;if(n){let M=await m(n);if(M)return M}return}async function qn(n){try{let P=await fetch(n,{headers:{Accept:"application/json"}});if(!P.ok)return{success:!1,error:`HTTP ${P.status}`};let A=await P.json();if(!A.success)return{success:!1,error:A.message||"Logout failed"};if(typeof window<"u")localStorage.removeItem("es.sso.user"),sessionStorage.removeItem("es.sso.user"),window.dispatchEvent(new CustomEvent("es-sso-logout"));return{success:!0}}catch(P){return{success:!1,error:P instanceof Error?P.message:"Network error"}}}import{jsx as Vn,Fragment as Qn}from"react/jsx-runtime";function Jn({complete:n=!1,audience:P="workforce",children:A}){let T=f(),R=$();if((P==="customer"?!!R?.isLoading:!!T?.isLoading)&&!n)return Vn(Qn,{children:A});return null}import{jsx as fn,Fragment as $n}from"react/jsx-runtime";function Zn({audience:n="workforce",children:P}){let A=f(),T=$();if(n==="customer"?!!T?.customer:!!A?.user)return fn($n,{children:P});return null}import{jsx as Yn,Fragment as wn}from"react/jsx-runtime";function Bn({audience:n="workforce",children:P}){let A=f(),T=$(),R=n==="customer"?!!T?.customer:!!A?.user,M=n==="customer"?!!T?.isLoading:!!A?.isLoading;if(R||M)return null;return Yn(wn,{children:P})}import{buildTenantPath as d,DEFAULT_TENANT_API_NAMESPACE as Gn,DEFAULT_TENANT_UI_NAMESPACE as En,normalizeTenantRoutingStrategy as l}from"@enterprisestandard/core";import{createContext as Xn,useContext as kn,useMemo as Dn}from"react";import{jsx as hn}from"react/jsx-runtime";var g=Xn(null);function t(n,P){let A=l(P),T=A.ui??En,R=A.api??Gn;return{ui:(M="/")=>d(n,M,T),api:(M="/")=>d(n,M,R)}}function jn({id:n,strategy:P,children:A}){let T=Dn(()=>{let R=l(P);return{id:n,strategy:R,urls:t(n,R)}},[P,n]);return hn(g.Provider,{value:T,children:A})}function Cn(){let n=kn(g);if(!n)throw Error("useTenant() must be used within a TenantProvider");return n}export{Cn as useTenant,zn as useSSOContext,f as useOptionalSSOContext,$ as useOptionalCIAMContext,y as useCIAMProviders,e as useCIAMContext,An as logoutCustomer,qn as logout,_n as getUser,nn as getCustomer,t as createTenantUrls,jn as TenantProvider,Bn as SignedOut,Zn as SignedIn,Jn as SignInLoading,In as SSOProvider,Nn as CIAMProviderList,r as CIAMProvider};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enterprisestandard/react",
|
|
3
|
-
"version": "0.0.20-beta.
|
|
3
|
+
"version": "0.0.20-beta.20260619.3",
|
|
4
4
|
"description": "Enterprise Standard React Components",
|
|
5
5
|
"private": false,
|
|
6
6
|
"author": "enterprisestandard",
|
|
@@ -22,10 +22,10 @@
|
|
|
22
22
|
"./package.json": "./package.json"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@enterprisestandard/core": "0.0.20-beta.
|
|
25
|
+
"@enterprisestandard/core": "0.0.20-beta.20260619.3"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
|
-
"react": "^
|
|
29
|
-
"react-dom": "^
|
|
28
|
+
"react": "^19.2.7",
|
|
29
|
+
"react-dom": "^19.2.7"
|
|
30
30
|
}
|
|
31
31
|
}
|