@descope/react-sdk 2.0.10 → 2.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.
package/README.md CHANGED
@@ -308,6 +308,98 @@ Descope SDK is automatically refreshes the session token when it is about to exp
308
308
  If the Descope project settings are configured to manage tokens in cookies.
309
309
  you must also configure a custom domain, and set it as the `baseUrl` prop in the `AuthProvider` component. See the above [`AuthProvider` usage](https://github.com/descope/react-sdk#wrap-your-app-with-auth-provider) for usage example.
310
310
 
311
+ ### Widgets
312
+
313
+ Widgets are components that allow you to expose management features for tenant-based implementation. In certain scenarios, your customers may require the capability to perform managerial actions independently, alleviating the necessity to contact you. Widgets serve as a feature enabling you to delegate these capabilities to your customers in a modular manner.
314
+
315
+ Important Note:
316
+
317
+ - For the user to be able to use the widget, they need to be assigned the `Tenant Admin` Role.
318
+
319
+ #### User Management
320
+
321
+ The `User Management` widget will let you embed a user table in your site to view and take action.
322
+
323
+ The widget lets you:
324
+
325
+ - Create a new user
326
+ - Edit an existing user
327
+ - Activate / disable an existing user
328
+ - Reset an existing user's password
329
+ - Remove an existing user's passkey
330
+ - Delete an existing user
331
+
332
+ Note:
333
+
334
+ - Custom fields also appear in the table.
335
+
336
+ ###### Usage
337
+
338
+ ```js
339
+ import { UserManagement } from '@descope/react-sdk';
340
+ ...
341
+ <UserManagement
342
+ widgetId="user-management-widget"
343
+ tenant="tenant-id"
344
+ />
345
+ ```
346
+
347
+ Example:
348
+ [Manage Users](./examples/app/ManageUsers.tsx)
349
+
350
+ #### Role Management
351
+
352
+ The `Role Management` widget will let you embed a role table in your site to view and take action.
353
+
354
+ The widget lets you:
355
+
356
+ - Create a new role
357
+ - Change an existing role's fields
358
+ - Delete an existing role
359
+
360
+ Note:
361
+
362
+ - The `Editable` field is determined by the user's access to the role - meaning that project-level roles are not editable by tenant level users.
363
+ - You need to pre-define the permissions that the user can use, which are not editable in the widget.
364
+
365
+ ###### Usage
366
+
367
+ ```js
368
+ import { RoleManagement } from '@descope/react-sdk';
369
+ ...
370
+ <RoleManagement
371
+ widgetId="role-management-widget"
372
+ tenant="tenant-id"
373
+ />
374
+ ```
375
+
376
+ Example:
377
+ [Manage Roles](./examples/app/ManageRoles.tsx)
378
+
379
+ #### Access Key Management
380
+
381
+ The `Access Key Management` widget will let you embed an access key table in your site to view and take action.
382
+
383
+ The widget lets you:
384
+
385
+ - Create a new access key
386
+ - Activate / deactivate an existing access key
387
+ - Delete an exising access key
388
+
389
+ ###### Usage
390
+
391
+ ```js
392
+ import { AccessKeyManagement } from '@descope/react-sdk';
393
+ ...
394
+ <AccessKeyManagement
395
+ widgetId="access-key-management-widget"
396
+ tenant="tenant-id"
397
+ />
398
+ ```
399
+
400
+ Example:
401
+ [Manage Access Keys](./examples/app/ManageAccessKeys.tsx)
402
+
311
403
  ## Code Example
312
404
 
313
405
  You can find an example react app in the [examples folder](./examples).
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("@descope/web-js-sdk");function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function n(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var s=r(e),o=r(t);const u=s.default.createContext(void 0),a=e=>(...t)=>{if(!e)throw Error("You can only use this function after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component");return e(...t)},l=e=>(...t)=>{let r;try{r=e(...t)}catch(e){console.error(e)}return r},i={"x-descope-sdk-name":"react","x-descope-sdk-version":"2.0.10"},c="undefined"!=typeof window;let d;const f=e=>{const t=o.default(Object.assign(Object.assign({},e),{persistTokens:c,autoRefresh:c}));return d=t,t};d=f({projectId:"temp pid"});const g=()=>c?null==d?void 0:d.getSessionToken():(console.warn("Get session token is not supported in SSR"),""),p=()=>c?null==d?void 0:d.getRefreshToken():(console.warn("Get refresh token is not supported in SSR"),""),m=l(((e=g(),t)=>null==d?void 0:d.getJwtPermissions(e,t))),b=l(((e=g(),t)=>null==d?void 0:d.getJwtRoles(e,t)));const h=e.lazy((async()=>((await Promise.resolve().then((function(){return n(require("@descope/web-component"))}))).default.sdkConfigOverrides={baseHeaders:i,persistTokens:!1,hooks:{get beforeRequest(){return d.httpClient.hooks.beforeRequest},set beforeRequest(e){}}},{default:({projectId:e,flowId:t,baseUrl:r,innerRef:n,tenant:o,theme:u,locale:a,debug:l,redirectUrl:i,client:c,form:d,autoFocus:f})=>s.default.createElement("descope-wc",{"project-id":e,"flow-id":t,"base-url":r,ref:n,tenant:o,theme:u,locale:a,debug:l,client:c,form:d,"redirect-url":i,"auto-focus":f})}))),w=s.default.forwardRef((({flowId:t,onSuccess:r,onError:n,onReady:o,logger:a,tenant:l,theme:i,locale:c,debug:d,client:f,form:g,telemetryKey:p,redirectUrl:m,autoFocus:b,errorTransformer:w},v)=>{const[E,k]=e.useState(null);e.useImperativeHandle(v,(()=>E));const{projectId:I,baseUrl:y,sdk:j}=s.default.useContext(u),S=e.useCallback((async e=>{await j.httpClient.hooks.afterRequest({},new Response(JSON.stringify(e.detail))),r&&r(e)}),[r]);e.useEffect((()=>{const e=E;return null==e||e.addEventListener("success",S),n&&(null==e||e.addEventListener("error",n)),o&&(null==e||e.addEventListener("ready",o)),()=>{n&&(null==e||e.removeEventListener("error",n)),o&&(null==e||e.removeEventListener("ready",o)),null==e||e.removeEventListener("success",S)}}),[E,n,S]),e.useEffect((()=>{const e=E;return null==e||e.addEventListener("success",S),()=>{null==e||e.removeEventListener("success",S)}}),[E,S]),e.useEffect((()=>{const e=E;return n&&(null==e||e.addEventListener("error",n)),()=>{n&&(null==e||e.removeEventListener("error",n))}}),[E,n]),e.useEffect((()=>{const e=E;return o&&(null==e||e.addEventListener("ready",o)),()=>{o&&(null==e||e.removeEventListener("error",o))}}),[E,o]),e.useEffect((()=>{E&&(E.errorTransformer=w)}),[E,w]),e.useEffect((()=>{E&&a&&(E.logger=a)}),[E,a]);const{form:U,client:R}=e.useMemo((()=>({form:JSON.stringify(g||{}),client:JSON.stringify(f||{})})),[g,f]);return s.default.createElement("form",null,s.default.createElement(e.Suspense,{fallback:null},s.default.createElement(h,{projectId:I,flowId:t,baseUrl:y,innerRef:k,tenant:l,theme:i,locale:c,debug:d,form:U,client:R,telemetryKey:p,redirectUrl:m,autoFocus:b})))})),v=e.lazy((async()=>(await Promise.resolve().then((function(){return n(require("@descope/user-management-widget"))})),{default:({projectId:e,baseUrl:t,innerRef:r,tenant:n,widgetId:o,theme:u,debug:a})=>s.default.createElement("descope-user-management-widget",{"project-id":e,"widget-id":o,"base-url":t,theme:u,tenant:n,debug:a,ref:r})}))),E=s.default.forwardRef((({logger:t,tenant:r,theme:n,debug:o,widgetId:a},l)=>{const[i,c]=e.useState(null);e.useImperativeHandle(l,(()=>i));const{projectId:d,baseUrl:f}=s.default.useContext(u);return e.useEffect((()=>{i&&t&&(i.logger=t)}),[i,t]),s.default.createElement(e.Suspense,{fallback:null},s.default.createElement(v,{projectId:d,widgetId:a,baseUrl:f,innerRef:c,tenant:r,theme:n,debug:o}))})),k=e.lazy((async()=>(await Promise.resolve().then((function(){return n(require("@descope/role-management-widget"))})),{default:({projectId:e,baseUrl:t,innerRef:r,tenant:n,widgetId:o,theme:u,debug:a})=>s.default.createElement("descope-role-management-widget",{"project-id":e,"widget-id":o,"base-url":t,theme:u,tenant:n,debug:a,ref:r})}))),I=s.default.forwardRef((({logger:t,tenant:r,theme:n,debug:o,widgetId:a},l)=>{const[i,c]=e.useState(null);e.useImperativeHandle(l,(()=>i));const{projectId:d,baseUrl:f}=s.default.useContext(u);return e.useEffect((()=>{i&&t&&(i.logger=t)}),[i,t]),s.default.createElement(e.Suspense,{fallback:null},s.default.createElement(k,{projectId:d,widgetId:a,baseUrl:f,innerRef:c,tenant:r,theme:n,debug:o}))})),y=e.lazy((async()=>(await Promise.resolve().then((function(){return n(require("@descope/access-key-management-widget"))})),{default:({projectId:e,baseUrl:t,innerRef:r,tenant:n,widgetId:o,theme:u,debug:a})=>s.default.createElement("descope-access-key-management-widget",{"project-id":e,"widget-id":o,"base-url":t,theme:u,tenant:n,debug:a,ref:r})}))),j=s.default.forwardRef((({logger:t,tenant:r,theme:n,debug:o,widgetId:a},l)=>{const[i,c]=e.useState(null);e.useImperativeHandle(l,(()=>i));const{projectId:d,baseUrl:f}=s.default.useContext(u);return e.useEffect((()=>{i&&t&&(i.logger=t)}),[i,t]),s.default.createElement(e.Suspense,{fallback:null},s.default.createElement(y,{projectId:d,widgetId:a,baseUrl:f,innerRef:c,tenant:r,theme:n,debug:o}))}));var S=()=>{const t=e.useContext(u);if(!t)throw Error("You can only use this hook in the context of <AuthProvider />");return t};const U=e=>`You can only use this ${e} after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component`,R={get(e,t){if("object"==typeof e[t]&&null!==e[t])return new Proxy(e[t],R);if("function"==typeof e[t])return()=>{throw Error(U("function"))};throw Error(U("attribute"))}};exports.AccessKeyManagement=j,exports.AuthProvider=({projectId:t,baseUrl:r="",sessionTokenViaCookie:n=!1,children:o})=>{const[l,c]=e.useState(),[d,g]=e.useState(),[p,m]=e.useState(!1),[b,h]=e.useState(!1),w=(({projectId:t,baseUrl:r,sessionTokenViaCookie:n})=>e.useMemo((()=>{if(t)return f({projectId:t,baseUrl:r,sessionTokenViaCookie:n,baseHeaders:i,persistToken:!0,autoRefresh:!0})}),[t,r,n]))({projectId:t,baseUrl:r,sessionTokenViaCookie:n});e.useEffect((()=>{if(w){const e=w.onSessionTokenChange(g),t=w.onUserChange(c);return()=>{e(),t()}}}),[w]);const v=e.useRef(!1),E=e.useCallback((()=>{v.current||(v.current=!0,h(!0),a(null==w?void 0:w.refresh)().then((()=>{h(!1)})))}),[w]),k=e.useCallback((()=>{m(!0),a(w.me)().then((()=>{m(!1)}))}),[w]),I=e.useMemo((()=>({fetchUser:k,user:l,isUserLoading:p,fetchSession:E,session:d,isSessionLoading:b,isSessionFetched:v.current,projectId:t,baseUrl:r,setUser:c,setSession:g,sdk:w})),[k,l,p,E,d,b,v.current,t,r,c,g,w]);return s.default.createElement(u.Provider,{value:I},o)},exports.Descope=w,exports.RoleManagement=I,exports.SignInFlow=e=>s.default.createElement(w,Object.assign({},e,{flowId:"sign-in"})),exports.SignUpFlow=e=>s.default.createElement(w,Object.assign({},e,{flowId:"sign-up"})),exports.SignUpOrInFlow=e=>s.default.createElement(w,Object.assign({},e,{flowId:"sign-up-or-in"})),exports.UserManagement=E,exports.baseHeaders=i,exports.getJwtPermissions=m,exports.getJwtRoles=b,exports.getRefreshToken=p,exports.getSessionToken=g,exports.refresh=(e=p())=>null==d?void 0:d.refresh(e),exports.useDescope=()=>{const{sdk:t}=S();return e.useMemo((()=>t||new Proxy(f({projectId:"dummy"}),R)),[t])},exports.useSession=()=>{const{session:t,isSessionLoading:r,fetchSession:n,isSessionFetched:s}=S(),o=e.useRef(r);e.useMemo((()=>{o.current=r}),[r]);const u=!t&&!r;return e.useMemo((()=>{u&&!s&&(o.current=!0)}),[s]),e.useEffect((()=>{u&&n()}),[n]),{isSessionLoading:o.current,sessionToken:t,isAuthenticated:!!t}},exports.useUser=()=>{const{user:t,fetchUser:r,isUserLoading:n,session:s}=S(),[o,u]=e.useState(!1),a=e.useRef(n),l=e.useMemo((()=>!t&&!n&&s&&!o),[r,s,o]);return e.useMemo((()=>{a.current=n}),[n]),e.useMemo((()=>{l&&(a.current=!0)}),[l]),e.useEffect((()=>{l&&(u(!0),r())}),[l]),{isUserLoading:a.current,user:t}};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("@descope/web-js-sdk");function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function n(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var s=r(e),o=r(t);const u=s.default.createContext(void 0),a=e=>(...t)=>{if(!e)throw Error("You can only use this function after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component");return e(...t)},l=e=>(...t)=>{let r;try{r=e(...t)}catch(e){console.error(e)}return r},i={"x-descope-sdk-name":"react","x-descope-sdk-version":"2.0.12"},c="undefined"!=typeof window;let d;const f=e=>{const t=o.default(Object.assign(Object.assign({},e),{persistTokens:c,autoRefresh:c}));return d=t,t};d=f({projectId:"temp pid"});const g=()=>c?null==d?void 0:d.getSessionToken():(console.warn("Get session token is not supported in SSR"),""),p=()=>c?null==d?void 0:d.getRefreshToken():(console.warn("Get refresh token is not supported in SSR"),""),m=l(((e=g(),t)=>null==d?void 0:d.getJwtPermissions(e,t))),b=l(((e=g(),t)=>null==d?void 0:d.getJwtRoles(e,t)));const h=e.lazy((async()=>((await Promise.resolve().then((function(){return n(require("@descope/web-component"))}))).default.sdkConfigOverrides={baseHeaders:i,persistTokens:!1,hooks:{get beforeRequest(){return d.httpClient.hooks.beforeRequest},set beforeRequest(e){}}},{default:({projectId:e,flowId:t,baseUrl:r,innerRef:n,tenant:o,theme:u,locale:a,debug:l,redirectUrl:i,client:c,form:d,autoFocus:f})=>s.default.createElement("descope-wc",{"project-id":e,"flow-id":t,"base-url":r,ref:n,tenant:o,theme:u,locale:a,debug:l,client:c,form:d,"redirect-url":i,"auto-focus":f})}))),w=s.default.forwardRef((({flowId:t,onSuccess:r,onError:n,onReady:o,logger:a,tenant:l,theme:i,locale:c,debug:d,client:f,form:g,telemetryKey:p,redirectUrl:m,autoFocus:b,errorTransformer:w},v)=>{const[E,k]=e.useState(null);e.useImperativeHandle(v,(()=>E));const{projectId:I,baseUrl:y,sdk:j}=s.default.useContext(u),S=e.useCallback((async e=>{await j.httpClient.hooks.afterRequest({},new Response(JSON.stringify(e.detail))),r&&r(e)}),[r]);e.useEffect((()=>{const e=E;return null==e||e.addEventListener("success",S),n&&(null==e||e.addEventListener("error",n)),o&&(null==e||e.addEventListener("ready",o)),()=>{n&&(null==e||e.removeEventListener("error",n)),o&&(null==e||e.removeEventListener("ready",o)),null==e||e.removeEventListener("success",S)}}),[E,n,S]),e.useEffect((()=>{const e=E;return null==e||e.addEventListener("success",S),()=>{null==e||e.removeEventListener("success",S)}}),[E,S]),e.useEffect((()=>{const e=E;return n&&(null==e||e.addEventListener("error",n)),()=>{n&&(null==e||e.removeEventListener("error",n))}}),[E,n]),e.useEffect((()=>{const e=E;return o&&(null==e||e.addEventListener("ready",o)),()=>{o&&(null==e||e.removeEventListener("error",o))}}),[E,o]),e.useEffect((()=>{E&&(E.errorTransformer=w)}),[E,w]),e.useEffect((()=>{E&&a&&(E.logger=a)}),[E,a]);const{form:U,client:R}=e.useMemo((()=>({form:JSON.stringify(g||{}),client:JSON.stringify(f||{})})),[g,f]);return s.default.createElement("form",null,s.default.createElement(e.Suspense,{fallback:null},s.default.createElement(h,{projectId:I,flowId:t,baseUrl:y,innerRef:k,tenant:l,theme:i,locale:c,debug:d,form:U,client:R,telemetryKey:p,redirectUrl:m,autoFocus:b})))})),v=e.lazy((async()=>(await Promise.resolve().then((function(){return n(require("@descope/user-management-widget"))})),{default:({projectId:e,baseUrl:t,innerRef:r,tenant:n,widgetId:o,theme:u,debug:a})=>s.default.createElement("descope-user-management-widget",{"project-id":e,"widget-id":o,"base-url":t,theme:u,tenant:n,debug:a,ref:r})}))),E=s.default.forwardRef((({logger:t,tenant:r,theme:n,debug:o,widgetId:a},l)=>{const[i,c]=e.useState(null);e.useImperativeHandle(l,(()=>i));const{projectId:d,baseUrl:f}=s.default.useContext(u);return e.useEffect((()=>{i&&t&&(i.logger=t)}),[i,t]),s.default.createElement(e.Suspense,{fallback:null},s.default.createElement(v,{projectId:d,widgetId:a,baseUrl:f,innerRef:c,tenant:r,theme:n,debug:o}))})),k=e.lazy((async()=>(await Promise.resolve().then((function(){return n(require("@descope/role-management-widget"))})),{default:({projectId:e,baseUrl:t,innerRef:r,tenant:n,widgetId:o,theme:u,debug:a})=>s.default.createElement("descope-role-management-widget",{"project-id":e,"widget-id":o,"base-url":t,theme:u,tenant:n,debug:a,ref:r})}))),I=s.default.forwardRef((({logger:t,tenant:r,theme:n,debug:o,widgetId:a},l)=>{const[i,c]=e.useState(null);e.useImperativeHandle(l,(()=>i));const{projectId:d,baseUrl:f}=s.default.useContext(u);return e.useEffect((()=>{i&&t&&(i.logger=t)}),[i,t]),s.default.createElement(e.Suspense,{fallback:null},s.default.createElement(k,{projectId:d,widgetId:a,baseUrl:f,innerRef:c,tenant:r,theme:n,debug:o}))})),y=e.lazy((async()=>(await Promise.resolve().then((function(){return n(require("@descope/access-key-management-widget"))})),{default:({projectId:e,baseUrl:t,innerRef:r,tenant:n,widgetId:o,theme:u,debug:a})=>s.default.createElement("descope-access-key-management-widget",{"project-id":e,"widget-id":o,"base-url":t,theme:u,tenant:n,debug:a,ref:r})}))),j=s.default.forwardRef((({logger:t,tenant:r,theme:n,debug:o,widgetId:a},l)=>{const[i,c]=e.useState(null);e.useImperativeHandle(l,(()=>i));const{projectId:d,baseUrl:f}=s.default.useContext(u);return e.useEffect((()=>{i&&t&&(i.logger=t)}),[i,t]),s.default.createElement(e.Suspense,{fallback:null},s.default.createElement(y,{projectId:d,widgetId:a,baseUrl:f,innerRef:c,tenant:r,theme:n,debug:o}))}));var S=()=>{const t=e.useContext(u);if(!t)throw Error("You can only use this hook in the context of <AuthProvider />");return t};const U=e=>`You can only use this ${e} after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component`,R={get(e,t){if("object"==typeof e[t]&&null!==e[t])return new Proxy(e[t],R);if("function"==typeof e[t])return()=>{throw Error(U("function"))};throw Error(U("attribute"))}};exports.AccessKeyManagement=j,exports.AuthProvider=({projectId:t,baseUrl:r="",sessionTokenViaCookie:n=!1,children:o})=>{const[l,c]=e.useState(),[d,g]=e.useState(),[p,m]=e.useState(!1),[b,h]=e.useState(!1),w=(({projectId:t,baseUrl:r,sessionTokenViaCookie:n})=>e.useMemo((()=>{if(t)return f({projectId:t,baseUrl:r,sessionTokenViaCookie:n,baseHeaders:i,persistToken:!0,autoRefresh:!0})}),[t,r,n]))({projectId:t,baseUrl:r,sessionTokenViaCookie:n});e.useEffect((()=>{if(w){const e=w.onSessionTokenChange(g),t=w.onUserChange(c);return()=>{e(),t()}}}),[w]);const v=e.useRef(!1),E=e.useCallback((()=>{v.current||(v.current=!0,h(!0),a(null==w?void 0:w.refresh)().then((()=>{h(!1)})))}),[w]),k=e.useCallback((()=>{m(!0),a(w.me)().then((()=>{m(!1)}))}),[w]),I=e.useMemo((()=>({fetchUser:k,user:l,isUserLoading:p,fetchSession:E,session:d,isSessionLoading:b,isSessionFetched:v.current,projectId:t,baseUrl:r,setUser:c,setSession:g,sdk:w})),[k,l,p,E,d,b,v.current,t,r,c,g,w]);return s.default.createElement(u.Provider,{value:I},o)},exports.Descope=w,exports.RoleManagement=I,exports.SignInFlow=e=>s.default.createElement(w,Object.assign({},e,{flowId:"sign-in"})),exports.SignUpFlow=e=>s.default.createElement(w,Object.assign({},e,{flowId:"sign-up"})),exports.SignUpOrInFlow=e=>s.default.createElement(w,Object.assign({},e,{flowId:"sign-up-or-in"})),exports.UserManagement=E,exports.baseHeaders=i,exports.getJwtPermissions=m,exports.getJwtRoles=b,exports.getRefreshToken=p,exports.getSessionToken=g,exports.refresh=(e=p())=>null==d?void 0:d.refresh(e),exports.useDescope=()=>{const{sdk:t}=S();return e.useMemo((()=>t||new Proxy(f({projectId:"dummy"}),R)),[t])},exports.useSession=()=>{const{session:t,isSessionLoading:r,fetchSession:n,isSessionFetched:s}=S(),o=e.useRef(r);e.useMemo((()=>{o.current=r}),[r]);const u=!t&&!r;return e.useMemo((()=>{u&&!s&&(o.current=!0)}),[s]),e.useEffect((()=>{u&&n()}),[n]),{isSessionLoading:o.current,sessionToken:t,isAuthenticated:!!t}},exports.useUser=()=>{const{user:t,fetchUser:r,isUserLoading:n,session:s}=S(),[o,u]=e.useState(!1),a=e.useRef(n),l=e.useMemo((()=>!t&&!n&&s&&!o),[r,s,o]);return e.useMemo((()=>{a.current=n}),[n]),e.useMemo((()=>{l&&(a.current=!0)}),[l]),e.useEffect((()=>{l&&(u(!0),r())}),[l]),{isUserLoading:a.current,user:t}};
2
2
  //# sourceMappingURL=index.cjs.js.map
package/dist/index.d.ts CHANGED
@@ -54,6 +54,8 @@ declare const createSdkWrapper: <P extends Omit<{
54
54
  fpLoad?: boolean;
55
55
  } & {
56
56
  autoRefresh?: boolean;
57
+ } & {
58
+ storeLastAuthenticatedUser?: boolean;
57
59
  } & {
58
60
  persistTokens?: boolean;
59
61
  storagePrefix?: string;
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import e,{useMemo as t,useState as r,useEffect as n,useRef as o,useCallback as s,lazy as i,useImperativeHandle as a,Suspense as c,useContext as l}from"react";import d from"@descope/web-js-sdk";const u=e.createContext(void 0),f=e=>(...t)=>{if(!e)throw Error("You can only use this function after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component");return e(...t)},g=e=>(...t)=>{let r;try{r=e(...t)}catch(e){console.error(e)}return r},m={"x-descope-sdk-name":"react","x-descope-sdk-version":"2.0.10"},p="undefined"!=typeof window;let b;const h=e=>{const t=d(Object.assign(Object.assign({},e),{persistTokens:p,autoRefresh:p}));return b=t,t};b=h({projectId:"temp pid"});const w=()=>p?null==b?void 0:b.getSessionToken():(console.warn("Get session token is not supported in SSR"),""),k=()=>p?null==b?void 0:b.getRefreshToken():(console.warn("Get refresh token is not supported in SSR"),""),I=g(((e=w(),t)=>null==b?void 0:b.getJwtPermissions(e,t))),E=g(((e=w(),t)=>null==b?void 0:b.getJwtRoles(e,t))),v=(e=k())=>null==b?void 0:b.refresh(e);const j=({projectId:i,baseUrl:a="",sessionTokenViaCookie:c=!1,children:l})=>{const[d,g]=r(),[p,b]=r(),[w,k]=r(!1),[I,E]=r(!1),v=(({projectId:e,baseUrl:r,sessionTokenViaCookie:n})=>t((()=>{if(e)return h({projectId:e,baseUrl:r,sessionTokenViaCookie:n,baseHeaders:m,persistToken:!0,autoRefresh:!0})}),[e,r,n]))({projectId:i,baseUrl:a,sessionTokenViaCookie:c});n((()=>{if(v){const e=v.onSessionTokenChange(b),t=v.onUserChange(g);return()=>{e(),t()}}}),[v]);const j=o(!1),y=s((()=>{j.current||(j.current=!0,E(!0),f(null==v?void 0:v.refresh)().then((()=>{E(!1)})))}),[v]),U=s((()=>{k(!0),f(v.me)().then((()=>{k(!1)}))}),[v]),R=t((()=>({fetchUser:U,user:d,isUserLoading:w,fetchSession:y,session:p,isSessionLoading:I,isSessionFetched:j.current,projectId:i,baseUrl:a,setUser:g,setSession:b,sdk:v})),[U,d,w,y,p,I,j.current,i,a,g,b,v]);return e.createElement(u.Provider,{value:R},l)},y=i((async()=>((await import("@descope/web-component")).default.sdkConfigOverrides={baseHeaders:m,persistTokens:!1,hooks:{get beforeRequest(){return b.httpClient.hooks.beforeRequest},set beforeRequest(e){}}},{default:({projectId:t,flowId:r,baseUrl:n,innerRef:o,tenant:s,theme:i,locale:a,debug:c,redirectUrl:l,client:d,form:u,autoFocus:f})=>e.createElement("descope-wc",{"project-id":t,"flow-id":r,"base-url":n,ref:o,tenant:s,theme:i,locale:a,debug:c,client:d,form:u,"redirect-url":l,"auto-focus":f})}))),U=e.forwardRef((({flowId:o,onSuccess:i,onError:l,onReady:d,logger:f,tenant:g,theme:m,locale:p,debug:b,client:h,form:w,telemetryKey:k,redirectUrl:I,autoFocus:E,errorTransformer:v},j)=>{const[U,R]=r(null);a(j,(()=>U));const{projectId:L,baseUrl:S,sdk:C}=e.useContext(u),T=s((async e=>{await C.httpClient.hooks.afterRequest({},new Response(JSON.stringify(e.detail))),i&&i(e)}),[i]);n((()=>{const e=U;return null==e||e.addEventListener("success",T),l&&(null==e||e.addEventListener("error",l)),d&&(null==e||e.addEventListener("ready",d)),()=>{l&&(null==e||e.removeEventListener("error",l)),d&&(null==e||e.removeEventListener("ready",d)),null==e||e.removeEventListener("success",T)}}),[U,l,T]),n((()=>{const e=U;return null==e||e.addEventListener("success",T),()=>{null==e||e.removeEventListener("success",T)}}),[U,T]),n((()=>{const e=U;return l&&(null==e||e.addEventListener("error",l)),()=>{l&&(null==e||e.removeEventListener("error",l))}}),[U,l]),n((()=>{const e=U;return d&&(null==e||e.addEventListener("ready",d)),()=>{d&&(null==e||e.removeEventListener("error",d))}}),[U,d]),n((()=>{U&&(U.errorTransformer=v)}),[U,v]),n((()=>{U&&f&&(U.logger=f)}),[U,f]);const{form:x,client:O}=t((()=>({form:JSON.stringify(w||{}),client:JSON.stringify(h||{})})),[w,h]);return e.createElement("form",null,e.createElement(c,{fallback:null},e.createElement(y,{projectId:L,flowId:o,baseUrl:S,innerRef:R,tenant:g,theme:m,locale:p,debug:b,form:x,client:O,telemetryKey:k,redirectUrl:I,autoFocus:E})))})),R=t=>e.createElement(U,Object.assign({},t,{flowId:"sign-in"})),L=t=>e.createElement(U,Object.assign({},t,{flowId:"sign-up"})),S=t=>e.createElement(U,Object.assign({},t,{flowId:"sign-up-or-in"})),C=i((async()=>(await import("@descope/user-management-widget"),{default:({projectId:t,baseUrl:r,innerRef:n,tenant:o,widgetId:s,theme:i,debug:a})=>e.createElement("descope-user-management-widget",{"project-id":t,"widget-id":s,"base-url":r,theme:i,tenant:o,debug:a,ref:n})}))),T=e.forwardRef((({logger:t,tenant:o,theme:s,debug:i,widgetId:l},d)=>{const[f,g]=r(null);a(d,(()=>f));const{projectId:m,baseUrl:p}=e.useContext(u);return n((()=>{f&&t&&(f.logger=t)}),[f,t]),e.createElement(c,{fallback:null},e.createElement(C,{projectId:m,widgetId:l,baseUrl:p,innerRef:g,tenant:o,theme:s,debug:i}))})),x=i((async()=>(await import("@descope/role-management-widget"),{default:({projectId:t,baseUrl:r,innerRef:n,tenant:o,widgetId:s,theme:i,debug:a})=>e.createElement("descope-role-management-widget",{"project-id":t,"widget-id":s,"base-url":r,theme:i,tenant:o,debug:a,ref:n})}))),O=e.forwardRef((({logger:t,tenant:o,theme:s,debug:i,widgetId:l},d)=>{const[f,g]=r(null);a(d,(()=>f));const{projectId:m,baseUrl:p}=e.useContext(u);return n((()=>{f&&t&&(f.logger=t)}),[f,t]),e.createElement(c,{fallback:null},e.createElement(x,{projectId:m,widgetId:l,baseUrl:p,innerRef:g,tenant:o,theme:s,debug:i}))})),P=i((async()=>(await import("@descope/access-key-management-widget"),{default:({projectId:t,baseUrl:r,innerRef:n,tenant:o,widgetId:s,theme:i,debug:a})=>e.createElement("descope-access-key-management-widget",{"project-id":t,"widget-id":s,"base-url":r,theme:i,tenant:o,debug:a,ref:n})}))),F=e.forwardRef((({logger:t,tenant:o,theme:s,debug:i,widgetId:l},d)=>{const[f,g]=r(null);a(d,(()=>f));const{projectId:m,baseUrl:p}=e.useContext(u);return n((()=>{f&&t&&(f.logger=t)}),[f,t]),e.createElement(c,{fallback:null},e.createElement(P,{projectId:m,widgetId:l,baseUrl:p,innerRef:g,tenant:o,theme:s,debug:i}))}));var J=()=>{const e=l(u);if(!e)throw Error("You can only use this hook in the context of <AuthProvider />");return e};const q=e=>`You can only use this ${e} after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component`,A={get(e,t){if("object"==typeof e[t]&&null!==e[t])return new Proxy(e[t],A);if("function"==typeof e[t])return()=>{throw Error(q("function"))};throw Error(q("attribute"))}},V=()=>{const{sdk:e}=J();return t((()=>e||new Proxy(h({projectId:"dummy"}),A)),[e])},N=()=>{const{session:e,isSessionLoading:r,fetchSession:s,isSessionFetched:i}=J(),a=o(r);t((()=>{a.current=r}),[r]);const c=!e&&!r;return t((()=>{c&&!i&&(a.current=!0)}),[i]),n((()=>{c&&s()}),[s]),{isSessionLoading:a.current,sessionToken:e,isAuthenticated:!!e}},Y=()=>{const{user:e,fetchUser:s,isUserLoading:i,session:a}=J(),[c,l]=r(!1),d=o(i),u=t((()=>!e&&!i&&a&&!c),[s,a,c]);return t((()=>{d.current=i}),[i]),t((()=>{u&&(d.current=!0)}),[u]),n((()=>{u&&(l(!0),s())}),[u]),{isUserLoading:d.current,user:e}};export{F as AccessKeyManagement,j as AuthProvider,U as Descope,O as RoleManagement,R as SignInFlow,L as SignUpFlow,S as SignUpOrInFlow,T as UserManagement,m as baseHeaders,I as getJwtPermissions,E as getJwtRoles,k as getRefreshToken,w as getSessionToken,v as refresh,V as useDescope,N as useSession,Y as useUser};
1
+ import e,{useMemo as t,useState as r,useEffect as n,useRef as o,useCallback as s,lazy as i,useImperativeHandle as a,Suspense as c,useContext as l}from"react";import d from"@descope/web-js-sdk";const u=e.createContext(void 0),f=e=>(...t)=>{if(!e)throw Error("You can only use this function after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component");return e(...t)},g=e=>(...t)=>{let r;try{r=e(...t)}catch(e){console.error(e)}return r},m={"x-descope-sdk-name":"react","x-descope-sdk-version":"2.0.12"},p="undefined"!=typeof window;let b;const h=e=>{const t=d(Object.assign(Object.assign({},e),{persistTokens:p,autoRefresh:p}));return b=t,t};b=h({projectId:"temp pid"});const w=()=>p?null==b?void 0:b.getSessionToken():(console.warn("Get session token is not supported in SSR"),""),k=()=>p?null==b?void 0:b.getRefreshToken():(console.warn("Get refresh token is not supported in SSR"),""),I=g(((e=w(),t)=>null==b?void 0:b.getJwtPermissions(e,t))),E=g(((e=w(),t)=>null==b?void 0:b.getJwtRoles(e,t))),v=(e=k())=>null==b?void 0:b.refresh(e);const j=({projectId:i,baseUrl:a="",sessionTokenViaCookie:c=!1,children:l})=>{const[d,g]=r(),[p,b]=r(),[w,k]=r(!1),[I,E]=r(!1),v=(({projectId:e,baseUrl:r,sessionTokenViaCookie:n})=>t((()=>{if(e)return h({projectId:e,baseUrl:r,sessionTokenViaCookie:n,baseHeaders:m,persistToken:!0,autoRefresh:!0})}),[e,r,n]))({projectId:i,baseUrl:a,sessionTokenViaCookie:c});n((()=>{if(v){const e=v.onSessionTokenChange(b),t=v.onUserChange(g);return()=>{e(),t()}}}),[v]);const j=o(!1),y=s((()=>{j.current||(j.current=!0,E(!0),f(null==v?void 0:v.refresh)().then((()=>{E(!1)})))}),[v]),U=s((()=>{k(!0),f(v.me)().then((()=>{k(!1)}))}),[v]),R=t((()=>({fetchUser:U,user:d,isUserLoading:w,fetchSession:y,session:p,isSessionLoading:I,isSessionFetched:j.current,projectId:i,baseUrl:a,setUser:g,setSession:b,sdk:v})),[U,d,w,y,p,I,j.current,i,a,g,b,v]);return e.createElement(u.Provider,{value:R},l)},y=i((async()=>((await import("@descope/web-component")).default.sdkConfigOverrides={baseHeaders:m,persistTokens:!1,hooks:{get beforeRequest(){return b.httpClient.hooks.beforeRequest},set beforeRequest(e){}}},{default:({projectId:t,flowId:r,baseUrl:n,innerRef:o,tenant:s,theme:i,locale:a,debug:c,redirectUrl:l,client:d,form:u,autoFocus:f})=>e.createElement("descope-wc",{"project-id":t,"flow-id":r,"base-url":n,ref:o,tenant:s,theme:i,locale:a,debug:c,client:d,form:u,"redirect-url":l,"auto-focus":f})}))),U=e.forwardRef((({flowId:o,onSuccess:i,onError:l,onReady:d,logger:f,tenant:g,theme:m,locale:p,debug:b,client:h,form:w,telemetryKey:k,redirectUrl:I,autoFocus:E,errorTransformer:v},j)=>{const[U,R]=r(null);a(j,(()=>U));const{projectId:L,baseUrl:S,sdk:C}=e.useContext(u),T=s((async e=>{await C.httpClient.hooks.afterRequest({},new Response(JSON.stringify(e.detail))),i&&i(e)}),[i]);n((()=>{const e=U;return null==e||e.addEventListener("success",T),l&&(null==e||e.addEventListener("error",l)),d&&(null==e||e.addEventListener("ready",d)),()=>{l&&(null==e||e.removeEventListener("error",l)),d&&(null==e||e.removeEventListener("ready",d)),null==e||e.removeEventListener("success",T)}}),[U,l,T]),n((()=>{const e=U;return null==e||e.addEventListener("success",T),()=>{null==e||e.removeEventListener("success",T)}}),[U,T]),n((()=>{const e=U;return l&&(null==e||e.addEventListener("error",l)),()=>{l&&(null==e||e.removeEventListener("error",l))}}),[U,l]),n((()=>{const e=U;return d&&(null==e||e.addEventListener("ready",d)),()=>{d&&(null==e||e.removeEventListener("error",d))}}),[U,d]),n((()=>{U&&(U.errorTransformer=v)}),[U,v]),n((()=>{U&&f&&(U.logger=f)}),[U,f]);const{form:x,client:O}=t((()=>({form:JSON.stringify(w||{}),client:JSON.stringify(h||{})})),[w,h]);return e.createElement("form",null,e.createElement(c,{fallback:null},e.createElement(y,{projectId:L,flowId:o,baseUrl:S,innerRef:R,tenant:g,theme:m,locale:p,debug:b,form:x,client:O,telemetryKey:k,redirectUrl:I,autoFocus:E})))})),R=t=>e.createElement(U,Object.assign({},t,{flowId:"sign-in"})),L=t=>e.createElement(U,Object.assign({},t,{flowId:"sign-up"})),S=t=>e.createElement(U,Object.assign({},t,{flowId:"sign-up-or-in"})),C=i((async()=>(await import("@descope/user-management-widget"),{default:({projectId:t,baseUrl:r,innerRef:n,tenant:o,widgetId:s,theme:i,debug:a})=>e.createElement("descope-user-management-widget",{"project-id":t,"widget-id":s,"base-url":r,theme:i,tenant:o,debug:a,ref:n})}))),T=e.forwardRef((({logger:t,tenant:o,theme:s,debug:i,widgetId:l},d)=>{const[f,g]=r(null);a(d,(()=>f));const{projectId:m,baseUrl:p}=e.useContext(u);return n((()=>{f&&t&&(f.logger=t)}),[f,t]),e.createElement(c,{fallback:null},e.createElement(C,{projectId:m,widgetId:l,baseUrl:p,innerRef:g,tenant:o,theme:s,debug:i}))})),x=i((async()=>(await import("@descope/role-management-widget"),{default:({projectId:t,baseUrl:r,innerRef:n,tenant:o,widgetId:s,theme:i,debug:a})=>e.createElement("descope-role-management-widget",{"project-id":t,"widget-id":s,"base-url":r,theme:i,tenant:o,debug:a,ref:n})}))),O=e.forwardRef((({logger:t,tenant:o,theme:s,debug:i,widgetId:l},d)=>{const[f,g]=r(null);a(d,(()=>f));const{projectId:m,baseUrl:p}=e.useContext(u);return n((()=>{f&&t&&(f.logger=t)}),[f,t]),e.createElement(c,{fallback:null},e.createElement(x,{projectId:m,widgetId:l,baseUrl:p,innerRef:g,tenant:o,theme:s,debug:i}))})),P=i((async()=>(await import("@descope/access-key-management-widget"),{default:({projectId:t,baseUrl:r,innerRef:n,tenant:o,widgetId:s,theme:i,debug:a})=>e.createElement("descope-access-key-management-widget",{"project-id":t,"widget-id":s,"base-url":r,theme:i,tenant:o,debug:a,ref:n})}))),F=e.forwardRef((({logger:t,tenant:o,theme:s,debug:i,widgetId:l},d)=>{const[f,g]=r(null);a(d,(()=>f));const{projectId:m,baseUrl:p}=e.useContext(u);return n((()=>{f&&t&&(f.logger=t)}),[f,t]),e.createElement(c,{fallback:null},e.createElement(P,{projectId:m,widgetId:l,baseUrl:p,innerRef:g,tenant:o,theme:s,debug:i}))}));var J=()=>{const e=l(u);if(!e)throw Error("You can only use this hook in the context of <AuthProvider />");return e};const q=e=>`You can only use this ${e} after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component`,A={get(e,t){if("object"==typeof e[t]&&null!==e[t])return new Proxy(e[t],A);if("function"==typeof e[t])return()=>{throw Error(q("function"))};throw Error(q("attribute"))}},V=()=>{const{sdk:e}=J();return t((()=>e||new Proxy(h({projectId:"dummy"}),A)),[e])},N=()=>{const{session:e,isSessionLoading:r,fetchSession:s,isSessionFetched:i}=J(),a=o(r);t((()=>{a.current=r}),[r]);const c=!e&&!r;return t((()=>{c&&!i&&(a.current=!0)}),[i]),n((()=>{c&&s()}),[s]),{isSessionLoading:a.current,sessionToken:e,isAuthenticated:!!e}},Y=()=>{const{user:e,fetchUser:s,isUserLoading:i,session:a}=J(),[c,l]=r(!1),d=o(i),u=t((()=>!e&&!i&&a&&!c),[s,a,c]);return t((()=>{d.current=i}),[i]),t((()=>{u&&(d.current=!0)}),[u]),n((()=>{u&&(l(!0),s())}),[u]),{isUserLoading:d.current,user:e}};export{F as AccessKeyManagement,j as AuthProvider,U as Descope,O as RoleManagement,R as SignInFlow,L as SignUpFlow,S as SignUpOrInFlow,T as UserManagement,m as baseHeaders,I as getJwtPermissions,E as getJwtRoles,k as getRefreshToken,w as getSessionToken,v as refresh,V as useDescope,N as useSession,Y as useUser};
2
2
  //# sourceMappingURL=index.esm.js.map