@enterprisestandard/react 0.0.7 → 0.0.8-beta.20260129.1
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 +10 -2
- package/dist/index.js +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -18,6 +18,8 @@ interface SSOProviderProps {
|
|
|
18
18
|
tokenUrl?: string;
|
|
19
19
|
refreshUrl?: string;
|
|
20
20
|
disableListener?: boolean;
|
|
21
|
+
/** Server-side: called with the Request to resolve user from cookies. Used by loaders when request is available. */
|
|
22
|
+
serverGetUser?: (request: Request) => Promise<User | undefined | null>;
|
|
21
23
|
children: ReactNode2;
|
|
22
24
|
}
|
|
23
25
|
interface SSOContext {
|
|
@@ -27,8 +29,14 @@ interface SSOContext {
|
|
|
27
29
|
tokenUrl?: string;
|
|
28
30
|
refreshUrl?: string;
|
|
29
31
|
}
|
|
30
|
-
declare function SSOProvider({ tenantId, storage, storageKey, userUrl, tokenUrl, refreshUrl, disableListener, children }: SSOProviderProps): React.ReactNode2;
|
|
32
|
+
declare function SSOProvider({ tenantId, storage, storageKey, userUrl, tokenUrl, refreshUrl, disableListener, serverGetUser, children }: SSOProviderProps): React.ReactNode2;
|
|
31
33
|
declare function useUser(): SSOContext;
|
|
34
|
+
/**
|
|
35
|
+
* Resolve the current user for use in loaders (server or browser).
|
|
36
|
+
* When request is provided, calls serverGetUser(request) if the app passed it to SSOProvider.
|
|
37
|
+
* When no request (e.g. client loader), reads from storage and optionally fetches userUrl.
|
|
38
|
+
*/
|
|
39
|
+
declare function getUser(request?: Request): Promise<User | null>;
|
|
32
40
|
interface UseTokenReturn {
|
|
33
41
|
token: string | null;
|
|
34
42
|
isLoading: boolean;
|
|
@@ -40,4 +48,4 @@ declare function logout(logoutUrl: string): Promise<{
|
|
|
40
48
|
success: boolean;
|
|
41
49
|
error?: string;
|
|
42
50
|
}>;
|
|
43
|
-
export { useUser, useToken, logout, X509Certificate, WorkloadValidators, WorkloadTokenStore, WorkloadTokenResponse, WorkloadIdentity, WorkloadConfig, Workload, Vault, UsersInboundHandlerConfig, UserStore, User2 as User, TokenValidationResult, TokenResponse, TenantWebhookPayload, TenantValidators, TenantStore, TenantStatus, TenantConfig, Tenant, StoredUser, StoredTenant, StoredGroup, SignedOut, SignedIn, SignInLoading, SessionStore, ServerOnlyWorkloadConfig, User3 as ScimUser, ScimResult, ScimListResponse, ScimError, SSOValidators, SSOProvider, SSOHandlerConfig, SSOConfig, SSO, Role, PhoneNumber, OidcCallbackParams, Name, JwtBearerWorkloadConfig, JWTAssertionClaims, IdTokenClaims, IAMValidators, IAMUsersInbound, IAMHandlerConfig, IAMGroupsOutbound, IAMGroupsInbound, IAMConfig, IAM, GroupsInboundHandlerConfig, GroupStore, GroupResource, GroupMember, Group, EnvironmentType, EnterpriseUser, EnterpriseStandard, EnterpriseExtension, Email, ESValidators, CreateUserOptions, CreateTenantResponse, CreateTenantRequest, CreateGroupOptions, ClientCredentialsWorkloadConfig, CachedWorkloadToken, BaseUser, Address };
|
|
51
|
+
export { useUser, useToken, logout, getUser, X509Certificate, WorkloadValidators, WorkloadTokenStore, WorkloadTokenResponse, WorkloadIdentity, WorkloadConfig, Workload, Vault, UsersInboundHandlerConfig, UserStore, User2 as User, TokenValidationResult, TokenResponse, TenantWebhookPayload, TenantValidators, TenantStore, TenantStatus, TenantConfig, Tenant, StoredUser, StoredTenant, StoredGroup, SignedOut, SignedIn, SignInLoading, SessionStore, ServerOnlyWorkloadConfig, User3 as ScimUser, ScimResult, ScimListResponse, ScimError, SSOValidators, SSOProvider, SSOHandlerConfig, SSOConfig, SSO, Role, PhoneNumber, OidcCallbackParams, Name, JwtBearerWorkloadConfig, JWTAssertionClaims, IdTokenClaims, IAMValidators, IAMUsersInbound, IAMHandlerConfig, IAMGroupsOutbound, IAMGroupsInbound, IAMConfig, IAM, GroupsInboundHandlerConfig, GroupStore, GroupResource, GroupMember, Group, EnvironmentType, EnterpriseUser, EnterpriseStandard, EnterpriseExtension, Email, ESValidators, CreateUserOptions, CreateTenantResponse, CreateTenantRequest, CreateGroupOptions, ClientCredentialsWorkloadConfig, CachedWorkloadToken, BaseUser, Address };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createContext as I,useCallback as
|
|
1
|
+
import{createContext as I,useCallback as m,useContext as F,useEffect as b,useState as V}from"react";import{jsx as l}from"react/jsx-runtime";var K=I(void 0),S=(W)=>{return`es-sso-user-${W.replace(/[^a-zA-Z0-9]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")}`};function E(W,P){if(!W||!P)return!0;return W.sso?.tenant?.id===P}async function c(W,P,H,R){if(typeof window>"u")return null;if(R!=="memory")try{let Q=(R==="local"?localStorage:sessionStorage).getItem(P);if(Q){let Y=JSON.parse(Q);if(Y.sso?.expires)Y.sso.expires=new Date(Y.sso.expires);if(E(Y,W))return Y}}catch(z){console.error("Error loading user from storage:",z)}if(H)try{let z=await fetch(H,{credentials:"include"});if(z.status===401)return null;if(!z.ok)return null;let Q=await z.json();if(Q.sso?.expires&&typeof Q.sso.expires==="string")Q.sso.expires=new Date(Q.sso.expires);if(E(Q,W))return Q}catch(z){console.error("Error fetching user from URL:",z)}return null}var w={current:null};function i({tenantId:W,storage:P="memory",storageKey:H,userUrl:R,tokenUrl:z,refreshUrl:Q,disableListener:Y=!1,serverGetUser:C,children:G}){let[j,Z]=V(null),[T,O]=V(!!R),M=H||(W?S(W):"es-sso-user");b(()=>{return w.current=(N)=>{if(N!=null&&C)return C(N).then((B)=>B??null);return c(W,M,R,P)},()=>{w.current=null}},[C,W,M,R,P]);let A=m((N)=>{if(!N||!W)return!0;return N.sso?.tenant?.id===W},[W]),_=m(()=>{if(P==="memory"||typeof window>"u")return null;try{let B=(P==="local"?localStorage:sessionStorage).getItem(M);if(!B)return null;let $=JSON.parse(B);if($.sso?.expires)$.sso.expires=new Date($.sso.expires);return A($)?$:null}catch(N){return console.error("Error loading user from storage:",N),null}},[P,M,A]),X=m((N)=>{if(P==="memory"||typeof window>"u")return;try{let B=P==="local"?localStorage:sessionStorage;if(N===null)B.removeItem(M);else B.setItem(M,JSON.stringify(N))}catch(B){console.error("Error saving user to storage:",B)}},[P,M]),p=m((N)=>{if(N&&!A(N))return;Z(N),X(N)},[A,X]),h=m(async()=>{if(!R)return;O(!0);try{let N=await fetch(R);if(N.status===401){Z(null),X(null),O(!1);return}if(!N.ok)throw Error(`Failed to fetch user: ${N.status} ${N.statusText}`);let B=await N.json();if(B.sso?.expires&&typeof B.sso.expires==="string")B.sso.expires=new Date(B.sso.expires);if(A(B))Z(B),X(B)}catch(N){console.error("Error fetching user from URL:",N)}finally{O(!1)}},[R,A,X]);b(()=>{let N=_();if(N)Z(N);if(R)h();else O(!1)},[_,R,h]),b(()=>{if(Y||P==="memory")return;let N=($)=>{if($.key!==M)return;if($.newValue===null)Z(null);else try{let J=JSON.parse($.newValue);if(J.sso?.expires)J.sso.expires=new Date(J.sso.expires);if(A(J))Z(J)}catch(J){console.error("Error parsing user from storage event:",J)}},B=()=>{Z(null)};return window.addEventListener("storage",N),window.addEventListener("es-sso-logout",B),()=>{window.removeEventListener("storage",N),window.removeEventListener("es-sso-logout",B)}},[Y,P,M,A]);let x={user:j,setUser:p,isLoading:T,tokenUrl:z,refreshUrl:Q};return l(K.Provider,{value:x,children:G})}function q(){let W=F(K);if(W===void 0)throw Error("useUser must be used within a SSOProvider");return W}async function d(W){let P=w.current;return P?P(W):Promise.resolve(null)}function g(){let W=F(K);if(W===void 0)throw Error("useToken must be used within a SSOProvider");let{tokenUrl:P,refreshUrl:H}=W;if(!P||!H)throw Error('useToken requires that a "tokenUrl" and "refreshUrl" be set in the SSOProvider');let[R,z]=V(null),[Q,Y]=V(null),[C,G]=V(!!P),[j,Z]=V(null),T=m(async(M)=>{G(!0),Z(null);try{let A=await fetch(M);if(A.status===401){W.setUser(null),z(null),Y(null),G(!1);return}if(!A.ok)throw Error(`Failed to fetch JWT: ${A.status} ${A.statusText}`);let _=await A.json();z(_.token),Y(new Date(_.expires))}catch(A){let _=A instanceof Error?A:Error(String(A));Z(_),z(null),Y(null),console.error("Error fetching JWT:",_)}finally{G(!1)}},[W]),O=m(async()=>{let M=H||P;if(!M){console.warn("No tokenUrl or refreshUrl provided");return}await T(M)},[H,P,T]);return b(()=>{if(!P){G(!1);return}T(P)},[P,T]),b(()=>{if(!Q||!H)return;let M=()=>{let _=new Date,X=Q.getTime()-_.getTime();if(X<=60000&&X>0)O()};M();let A=setInterval(M,30000);return()=>clearInterval(A)},[Q,H,O]),{token:R,isLoading:C,error:j,refresh:O}}async function u(W){try{let P=await fetch(W,{headers:{Accept:"application/json"}});if(!P.ok)return{success:!1,error:`HTTP ${P.status}`};let H=await P.json();if(!H.success)return{success:!1,error:H.message||"Logout failed"};if(typeof window<"u"){for(let R=localStorage.length-1;R>=0;R--){let z=localStorage.key(R);if(z?.startsWith("es-sso-user"))localStorage.removeItem(z)}for(let R=sessionStorage.length-1;R>=0;R--){let z=sessionStorage.key(R);if(z?.startsWith("es-sso-user"))sessionStorage.removeItem(z)}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 y,Fragment as L}from"react/jsx-runtime";function U({complete:W=!1,children:P}){let{isLoading:H}=q();if(H&&!W)return y(L,{children:P});return y(L,{})}import{jsx as f,Fragment as D}from"react/jsx-runtime";function o({children:W}){let{user:P}=q();if(P)return f(D,{children:W});return f(D,{})}import{jsx as k,Fragment as v}from"react/jsx-runtime";function n({children:W}){let{user:P,isLoading:H}=q();if(P||H)return k(v,{});return k(v,{children:W})}export{q as useUser,g as useToken,u as logout,d as getUser,n as SignedOut,o as SignedIn,U as SignInLoading,i as SSOProvider};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enterprisestandard/react",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.8-beta.20260129.1",
|
|
4
4
|
"description": "Enterprise Standard React Components",
|
|
5
5
|
"private": false,
|
|
6
6
|
"author": "enterprisestandard",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"./package.json": "./package.json"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@enterprisestandard/core": "
|
|
25
|
+
"@enterprisestandard/core": "0.0.8-beta.20260129.1"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
28
|
"react": "^18.0.0 || ^19.0.0",
|