@strivacity/sdk-next 2.1.2 → 2.3.0

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/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ ## 2.3.0 (2026-02-10)
2
+
3
+ ### 🧱 Updated Dependencies
4
+
5
+ - Updated sdk-core to 2.3.0
6
+
7
+ ## 2.2.0 (2026-02-06)
8
+
9
+ ### 🚀 Features
10
+
11
+ - logging implemented ([032dc8a](https://github.com/Strivacity/sdk-js/commit/032dc8a))
12
+
13
+ ### 🩹 Fixes
14
+
15
+ - error message rendering fixed ([9e67051](https://github.com/Strivacity/sdk-js/commit/9e67051))
16
+ - minor sdk type fixes ([3434a90](https://github.com/Strivacity/sdk-js/commit/3434a90))
17
+
18
+ ### 🧱 Updated Dependencies
19
+
20
+ - Updated sdk-core to 2.2.0
21
+
1
22
  ## 2.1.2 (2026-01-13)
2
23
 
3
24
  ### 🧱 Updated Dependencies
package/README.md CHANGED
@@ -418,6 +418,97 @@ Same as the profile page example in redirect/popup mode.
418
418
 
419
419
  Same as the logout page example in redirect/popup mode.
420
420
 
421
+ ## Logging
422
+
423
+ The SDK supports optional logging to help you debug authentication flows and monitor SDK behavior. You can enable the built-in console logger or provide your own custom logger implementation.
424
+
425
+ ### Using the Default Logger
426
+
427
+ Enable the default console logger by adding the `logging` option when creating the SDK:
428
+
429
+ ```tsx
430
+ 'use client';
431
+
432
+ import { StyAuthProvider, type SDKOptions, DefaultLogging } from '@strivacity/sdk-next';
433
+
434
+ const options: SDKOptions = {
435
+ mode: 'redirect',
436
+ issuer: 'https://<YOUR_DOMAIN>',
437
+ scopes: ['openid', 'profile'],
438
+ clientId: '<YOUR_CLIENT_ID>',
439
+ redirectUri: '<YOUR_REDIRECT_URI>',
440
+ logging: DefaultLogging, // Enable built-in console logging
441
+ };
442
+
443
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
444
+ return (
445
+ <html lang="en">
446
+ <body>
447
+ <StyAuthProvider options={options}>{children}</StyAuthProvider>
448
+ </body>
449
+ </html>
450
+ );
451
+ }
452
+ ```
453
+
454
+ The default logger writes to the browser console and automatically prefixes messages with a correlation ID when available (via the `xEventId` property).
455
+
456
+ ### Creating a Custom Logger
457
+
458
+ You can provide your own logger by implementing the `SDKLogging` interface with four methods: `debug`, `info`, `warn`, and `error`. An optional `xEventId` property is honored for log correlation.
459
+
460
+ ```typescript
461
+ import type { SDKLogging } from '@strivacity/sdk-next';
462
+
463
+ export class MyLogger implements SDKLogging {
464
+ xEventId?: string;
465
+
466
+ debug(message: string): void {
467
+ // Send to your logging pipeline
468
+ console.debug(this.xEventId ? `[${this.xEventId}] ${message}` : message);
469
+ }
470
+
471
+ info(message: string): void {
472
+ console.info(this.xEventId ? `[${this.xEventId}] ${message}` : message);
473
+ }
474
+
475
+ warn(message: string): void {
476
+ console.warn(this.xEventId ? `[${this.xEventId}] ${message}` : message);
477
+ }
478
+
479
+ error(message: string, error: Error): void {
480
+ console.error(this.xEventId ? `[${this.xEventId}] ${message}` : message, error);
481
+ }
482
+ }
483
+ ```
484
+
485
+ Then register your custom logger when creating the SDK:
486
+
487
+ ```tsx
488
+ import { StyAuthProvider } from '@strivacity/sdk-next';
489
+ import { MyLogger } from './logging/MyLogger';
490
+
491
+ const options: SDKOptions = {
492
+ mode: 'redirect',
493
+ issuer: 'https://<YOUR_DOMAIN>',
494
+ scopes: ['openid', 'profile'],
495
+ clientId: '<YOUR_CLIENT_ID>',
496
+ redirectUri: '<YOUR_REDIRECT_URI>',
497
+ logging: MyLogger, // Use your custom logger
498
+ };
499
+ ```
500
+
501
+ ### Logger Interface
502
+
503
+ The `SDKLogging` interface requires the following methods:
504
+
505
+ - **`debug(message: string): void`** - Log debug-level messages
506
+ - **`info(message: string): void`** - Log informational messages
507
+ - **`warn(message: string): void`** - Log warning messages
508
+ - **`error(message: string, error: Error): void`** - Log error messages with error objects
509
+
510
+ The optional `xEventId` property, when set by the SDK, provides a correlation ID to trace related log messages across the authentication flow.
511
+
421
512
  ### API Documentation
422
513
 
423
514
  #### `useStrivacity` hook
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("react/jsx-runtime"),r=require("react"),x=require("@strivacity/sdk-core"),V=require("@strivacity/sdk-core/utils/object"),W=require("./composables.cjs"),z=r.createContext(null),j={},L=({items:p,widgets:b,state:c,triggerFallback:f})=>d.jsx(d.Fragment,{children:p.map((a,m)=>{if(a.type==="widget"){const l=c.forms?.find(g=>g.id===a.formId),u=l?.widgets.find(g=>g.id===a.widgetId);if(!l||!u)return f(),null;const h=b[u.type];return h?d.jsx(h,{formId:l.id,config:u},`${l.id}.${u.id}`):(f(),null)}else if(a.type==="vertical"||a.type==="horizontal"){const l=b.layout;return l?d.jsx(l,{formId:a.items[0].formId,type:a.type,children:d.jsx(L,{items:a.items,widgets:b,state:c,triggerFallback:f})},m):(f(),null)}else return f(),null})}),$=p=>{const{params:b,widgets:c,sessionId:f,onLogin:a,onFallback:m,onClose:l,onError:u,onGlobalMessage:h,onBlockReady:g}={params:{},widgets:{},sessionId:null,...p},{sdk:w}=W.useStrivacity(),S=r.useRef(null),[q,k]=r.useState(!1),[E,U]=r.useState({}),[M,C]=r.useState({}),[e,R]=r.useState({}),F=r.useCallback(s=>{const t=s||e.hostedUrl;if(!t)throw new Error("No hosted URL provided");m?.(new x.FallbackError(new URL(t)))},[e,m]),T=r.useCallback(()=>{l?.()},[l]),N=r.useCallback((s,t,o)=>{j[s]={...j[s],[t]:o===""?null:o},U(n=>({...n,[s]:{...n[s]||{},[t]:o===""?null:o}}))},[]),O=r.useCallback((s,t,o)=>{C(n=>({...n,[s]:{...n[s]||{},[t]:o}}))},[]),A=r.useCallback(async s=>{try{k(!0);const t=await S.current?.submitForm(s,V.unflattenObject(j[s]));if(await w.isAuthenticated)a?.(w.idTokenClaims);else{const o=structuredClone(e),n={hostedUrl:t?.hostedUrl??e.hostedUrl,finalizeUrl:t?.finalizeUrl??e.finalizeUrl,screen:t?.screen??e.screen,forms:t?.forms??e.forms,layout:t?.layout??e.layout,messages:t?.messages??e.messages,branding:t?.branding??e.branding};if(n.screen!==e.screen){const i={},y={};for(const v of n.forms??[])i[v.id]={},y[v.id]={};U(i),C(y)}Object.keys(n.messages??{}).forEach(i=>{i==="global"?h?.(n.messages?.global?.text??""):C(y=>({...y,[i]:n.messages[i]}))}),R(n),k(!1),setTimeout(()=>{g?.({previousState:o,state:structuredClone(n)})},1)}}catch(t){console.error("Error submitting form:",t),t instanceof x.FallbackError?m?.(t):u?.(t)}},[w,b,E,e,a,m,l,u,h,g]),P={loading:q,forms:E,messages:M,state:e,submitForm:A,triggerFallback:F,triggerClose:T,setFormValue:N,setMessage:O};return r.useEffect(()=>{S.current=w.login(b),(async()=>{try{const s=await S.current?.startSession(f),t=structuredClone(e),o={hostedUrl:s?.hostedUrl??e.hostedUrl,finalizeUrl:s?.finalizeUrl??e.finalizeUrl,screen:s?.screen??e.screen,forms:s?.forms??e.forms,layout:s?.layout??e.layout,messages:s?.messages??e.messages,branding:s?.branding??e.branding};if(await w.isAuthenticated)a?.(w.idTokenClaims);else{if(o.screen!==e.screen){const n={},i={};for(const y of o.forms??[])n[y.id]={},i[y.id]={};U(n),C(i)}Object.keys(o.messages??{}).forEach(n=>{n==="global"?h?.(o.messages?.global?.text??""):C(i=>({...i,[n]:o.messages[n]}))}),R(o),setTimeout(()=>{g?.({previousState:t,state:structuredClone(o)})},1)}}catch(s){s instanceof x.FallbackError?m?.(s):u?.(s)}})()},[]),d.jsx(z.Provider,{value:P,children:d.jsx("div",{className:"login-renderer",children:e.screen&&c.layout?r.createElement(c.layout,{formId:e.layout?.items?.[0]?.formId,type:e.layout?.type,tag:"form"},d.jsx(L,{items:e.layout?.items??[],widgets:c,state:e,triggerFallback:F})):c.loading?r.createElement(c.loading):null})})};exports.NativeFlowContext=z;exports.StyLoginRenderer=$;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("react/jsx-runtime"),a=require("react"),S=require("@strivacity/sdk-core"),A=require("@strivacity/sdk-core/utils/object"),P=require("./composables.cjs"),z=a.createContext(null),x={},L=({items:C,widgets:w,state:u,triggerFallback:g})=>f.jsx(f.Fragment,{children:C.map((r,m)=>{if(r.type==="widget"){const l=u.forms?.find(y=>y.id===r.formId),c=l?.widgets.find(y=>y.id===r.widgetId);if(!l||!c)return g(void 0,`Unable to find form or widget for item: formId=${r.formId}, widgetId=${r.widgetId}`),null;const p=w[c.type];return p?f.jsx(p,{formId:l.id,config:c},`${l.id}.${c.id}`):(g(void 0,`No component found for widget type ${c.type}`),null)}else if(r.type==="vertical"||r.type==="horizontal"){const l=w.layout;return l?f.jsx(l,{formId:r.items[0].formId,type:r.type,children:f.jsx(L,{items:r.items,widgets:w,state:u,triggerFallback:g})},m):(g(void 0,"No layout component provided"),null)}else return g(void 0,"Unknown item type in layout"),null})}),V=C=>{const{params:w,widgets:u,sessionId:g,onLogin:r,onFallback:m,onClose:l,onError:c,onGlobalMessage:p,onBlockReady:y}={params:{},widgets:{},sessionId:null,...C},{sdk:d}=P.useStrivacity(),U=a.useRef(null),[T,j]=a.useState(!1),[v,k]=a.useState({}),[$,h]=a.useState({}),[e,E]=a.useState({}),F=a.useCallback((t,o)=>{const n=t||e.hostedUrl;if(d.logging?.warn(o?`Triggering fallback due to: ${o}`:"Triggering fallback"),!n){const s=new Error("No hosted URL provided");throw d.logging?.error("Fallback error",s),s}m?.(new S.FallbackError(new URL(n)))},[e,m]),N=a.useCallback(()=>{l?.()},[l]),q=a.useCallback((t,o,n)=>{x[t]={...x[t],[o]:n===""?null:n},k(s=>({...s,[t]:{...s[t]||{},[o]:n===""?null:n}}))},[]),M=a.useCallback((t,o,n)=>{h(s=>({...s,[t]:{...s[t]||{},[o]:n}}))},[]),O=a.useCallback(async t=>{try{j(!0);const o=await U.current?.submitForm(t,A.unflattenObject(x[t]));if(await d.isAuthenticated)r?.(d.idTokenClaims);else{const n=structuredClone(e),s={hostedUrl:o?.hostedUrl??e.hostedUrl,finalizeUrl:o?.finalizeUrl??e.finalizeUrl,screen:o?.screen??e.screen,forms:o?.forms??e.forms,layout:o?.layout??e.layout,messages:o?.messages??{},branding:o?.branding??e.branding};if(s.screen!==e.screen){const i={},b={};for(const R of s.forms??[])i[R.id]={},b[R.id]={};k(i),h(b)}Object.keys(s.messages??{}).forEach(i=>{i==="global"?p?.(s.messages?.global?.text??""):h(b=>({...b,[i]:s.messages[i]}))}),E(s),j(!1),setTimeout(()=>{y?.({previousState:n,state:structuredClone(s)})},1)}}catch(o){o instanceof S.FallbackError?m?.(o):c?.(o)}},[d,w,v,e,r,m,l,c,p,y]),I={loading:T,forms:v,messages:$,state:e,submitForm:O,triggerFallback:F,triggerClose:N,setFormValue:q,setMessage:M};return a.useEffect(()=>{U.current=d.login(w),(async()=>{try{const t=await U.current?.startSession(g),o=structuredClone(e),n={hostedUrl:t?.hostedUrl??e.hostedUrl,finalizeUrl:t?.finalizeUrl??e.finalizeUrl,screen:t?.screen??e.screen,forms:t?.forms??e.forms,layout:t?.layout??e.layout,messages:t?.messages??{},branding:t?.branding??e.branding};if(await d.isAuthenticated)r?.(d.idTokenClaims);else{if(n.screen!==e.screen){const s={},i={};for(const b of n.forms??[])s[b.id]={},i[b.id]={};k(s),h(i)}else d.logging?.info(`Updating screen: ${n.screen}`);Object.keys(n.messages??{}).forEach(s=>{s==="global"?p?.(n.messages?.global?.text??""):h(i=>({...i,[s]:n.messages[s]}))}),E(n),setTimeout(()=>{y?.({previousState:o,state:structuredClone(n)})},1)}}catch(t){t instanceof S.FallbackError?m?.(t):c?.(t)}})()},[]),f.jsx(z.Provider,{value:I,children:f.jsx("div",{className:"login-renderer",children:e.screen&&u.layout?a.createElement(u.layout,{formId:e.layout?.items?.[0]?.formId,type:e.layout?.type,tag:"form"},f.jsx(L,{items:e.layout?.items??[],widgets:u,state:e,triggerFallback:F})):u.loading?a.createElement(u.loading):null})})};exports.NativeFlowContext=z;exports.StyLoginRenderer=V;
2
2
  //# sourceMappingURL=LoginRenderer.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"LoginRenderer.cjs","sources":["../src/LoginRenderer.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { NativeParams, PartialRecord, WidgetType, LayoutWidget, LoginFlowState, Widget, IdTokenClaims, LoginFlowMessage } from '@strivacity/sdk-core';\nimport type { NativeContext, NativeFlowContextValue } from './types';\nimport React, { useRef, useState, useEffect, createContext, useCallback } from 'react';\nimport { FallbackError } from '@strivacity/sdk-core';\nimport { unflattenObject } from '@strivacity/sdk-core/utils/object';\nimport { useStrivacity } from './composables';\n\nexport const NativeFlowContext = createContext<NativeFlowContextValue | null>(null);\nconst formData: Record<string, Record<string, unknown>> = {};\n\nconst StyWidgetRenderer: React.FC<{\n\titems: LayoutWidget['items'];\n\twidgets: PartialRecord<WidgetType, React.ComponentType<any>>;\n\tstate: LoginFlowState;\n\ttriggerFallback: (hostedUrl?: string) => void;\n}> = ({ items, widgets, state, triggerFallback }) => {\n\treturn (\n\t\t<>\n\t\t\t{items.map((item, idx) => {\n\t\t\t\tif (item.type === 'widget') {\n\t\t\t\t\tconst form = state.forms?.find((f) => f.id === item.formId);\n\t\t\t\t\tconst widget = form?.widgets.find((w) => w.id === item.widgetId);\n\n\t\t\t\t\tif (!form || !widget) {\n\t\t\t\t\t\ttriggerFallback();\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst WidgetComponent = widgets[widget.type];\n\n\t\t\t\t\tif (!WidgetComponent) {\n\t\t\t\t\t\ttriggerFallback();\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn <WidgetComponent key={`${form.id}.${widget.id}`} formId={form.id} config={widget} />;\n\t\t\t\t} else if (item.type === 'vertical' || item.type === 'horizontal') {\n\t\t\t\t\tconst LayoutComponent = widgets.layout;\n\n\t\t\t\t\tif (!LayoutComponent) {\n\t\t\t\t\t\ttriggerFallback();\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<LayoutComponent key={idx} formId={(item.items[0] as Widget).formId} type={item.type}>\n\t\t\t\t\t\t\t<StyWidgetRenderer items={item.items} widgets={widgets} state={state} triggerFallback={triggerFallback} />\n\t\t\t\t\t\t</LayoutComponent>\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\ttriggerFallback();\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t})}\n\t\t</>\n\t);\n};\n\nexport const StyLoginRenderer: React.FC<{\n\tparams?: NativeParams;\n\twidgets?: PartialRecord<WidgetType, React.ComponentType<any>>;\n\tsessionId?: string | null;\n\tonLogin?: (claims?: IdTokenClaims | null) => void;\n\tonFallback?: (error: FallbackError) => void;\n\tonClose?: () => void;\n\tonError?: (error: any) => void;\n\tonGlobalMessage?: (message: string) => void;\n\tonBlockReady?: ({ previousState, state }: { previousState: LoginFlowState; state: LoginFlowState }) => void;\n}> = (props) => {\n\tconst { params, widgets, sessionId, onLogin, onFallback, onClose, onError, onGlobalMessage, onBlockReady } = {\n\t\tparams: {},\n\t\twidgets: {},\n\t\tsessionId: null,\n\t\t...props,\n\t};\n\tconst { sdk } = useStrivacity<NativeContext>();\n\tconst loginHandlerRef = useRef<ReturnType<(typeof sdk)['login']> | null>(null);\n\n\tconst [loading, setLoading] = useState(false);\n\tconst [forms, setForms] = useState<Record<string, Record<string, unknown>>>({});\n\tconst [messages, setMessages] = useState<Record<string, Record<string, LoginFlowMessage>>>({});\n\tconst [state, setState] = useState<LoginFlowState>({});\n\n\tconst triggerFallback = useCallback(\n\t\t(hostedUrl?: string) => {\n\t\t\tconst url = hostedUrl || state.hostedUrl;\n\n\t\t\tif (!url) {\n\t\t\t\tthrow new Error('No hosted URL provided');\n\t\t\t}\n\n\t\t\tonFallback?.(new FallbackError(new URL(url)));\n\t\t},\n\t\t[state, onFallback],\n\t);\n\n\tconst triggerClose = useCallback(() => {\n\t\tonClose?.();\n\t}, [onClose]);\n\n\tconst setFormValue = useCallback((formId: string, widgetId: string, value: unknown) => {\n\t\tformData[formId] = {\n\t\t\t...formData[formId],\n\t\t\t[widgetId]: value === '' ? null : value,\n\t\t};\n\n\t\tsetForms((prev) => ({\n\t\t\t...prev,\n\t\t\t[formId]: { ...(prev[formId] || {}), [widgetId]: value === '' ? null : value },\n\t\t}));\n\t}, []);\n\n\tconst setMessage = useCallback((formId: string, widgetId: string, value: LoginFlowMessage) => {\n\t\tsetMessages((prev) => ({\n\t\t\t...prev,\n\t\t\t[formId]: { ...(prev[formId] || {}), [widgetId]: value },\n\t\t}));\n\t}, []);\n\n\tconst submitForm = useCallback(\n\t\tasync (formId: string) => {\n\t\t\ttry {\n\t\t\t\tsetLoading(true);\n\n\t\t\t\tconst data = await loginHandlerRef.current?.submitForm(formId, unflattenObject(formData[formId]));\n\n\t\t\t\tif (await sdk.isAuthenticated) {\n\t\t\t\t\tonLogin?.(sdk.idTokenClaims);\n\t\t\t\t} else {\n\t\t\t\t\tconst previousState = structuredClone(state);\n\t\t\t\t\tconst newState: LoginFlowState = {\n\t\t\t\t\t\thostedUrl: data?.hostedUrl ?? state.hostedUrl,\n\t\t\t\t\t\tfinalizeUrl: data?.finalizeUrl ?? state.finalizeUrl,\n\t\t\t\t\t\tscreen: data?.screen ?? state.screen,\n\t\t\t\t\t\tforms: data?.forms ?? state.forms,\n\t\t\t\t\t\tlayout: data?.layout ?? state.layout,\n\t\t\t\t\t\tmessages: data?.messages ?? state.messages,\n\t\t\t\t\t\tbranding: data?.branding ?? state.branding,\n\t\t\t\t\t};\n\n\t\t\t\t\tif (newState.screen !== state.screen) {\n\t\t\t\t\t\tconst newForms: typeof forms = {};\n\t\t\t\t\t\tconst newMessages: typeof messages = {};\n\n\t\t\t\t\t\tfor (const form of newState.forms ?? []) {\n\t\t\t\t\t\t\tnewForms[form.id] = {};\n\t\t\t\t\t\t\tnewMessages[form.id] = {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsetForms(newForms);\n\t\t\t\t\t\tsetMessages(newMessages);\n\t\t\t\t\t}\n\n\t\t\t\t\tObject.keys(newState.messages ?? {}).forEach((formId) => {\n\t\t\t\t\t\tif (formId === 'global') {\n\t\t\t\t\t\t\tonGlobalMessage?.(newState.messages?.global?.text ?? '');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsetMessages((prev) => ({\n\t\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\t\t[formId]: newState.messages![formId],\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tsetState(newState);\n\t\t\t\t\tsetLoading(false);\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tonBlockReady?.({ previousState, state: structuredClone(newState) });\n\t\t\t\t\t}, 1);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('Error submitting form:', error);\n\n\t\t\t\tif (error instanceof FallbackError) {\n\t\t\t\t\tonFallback?.(error);\n\t\t\t\t} else {\n\t\t\t\t\tonError?.(error);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[sdk, params, forms, state, onLogin, onFallback, onClose, onError, onGlobalMessage, onBlockReady],\n\t);\n\n\tconst contextValue: NativeFlowContextValue = {\n\t\tloading,\n\t\tforms,\n\t\tmessages,\n\t\tstate,\n\t\tsubmitForm,\n\t\ttriggerFallback,\n\t\ttriggerClose,\n\t\tsetFormValue,\n\t\tsetMessage,\n\t};\n\n\tuseEffect(() => {\n\t\tloginHandlerRef.current = sdk.login(params);\n\n\t\tvoid (async () => {\n\t\t\ttry {\n\t\t\t\tconst data = await loginHandlerRef.current?.startSession(sessionId);\n\t\t\t\tconst previousState = structuredClone(state);\n\t\t\t\tconst newState: LoginFlowState = {\n\t\t\t\t\thostedUrl: data?.hostedUrl ?? state.hostedUrl,\n\t\t\t\t\tfinalizeUrl: data?.finalizeUrl ?? state.finalizeUrl,\n\t\t\t\t\tscreen: data?.screen ?? state.screen,\n\t\t\t\t\tforms: data?.forms ?? state.forms,\n\t\t\t\t\tlayout: data?.layout ?? state.layout,\n\t\t\t\t\tmessages: data?.messages ?? state.messages,\n\t\t\t\t\tbranding: data?.branding ?? state.branding,\n\t\t\t\t};\n\n\t\t\t\tif (await sdk.isAuthenticated) {\n\t\t\t\t\tonLogin?.(sdk.idTokenClaims);\n\t\t\t\t} else {\n\t\t\t\t\tif (newState.screen !== state.screen) {\n\t\t\t\t\t\tconst newforms: typeof forms = {};\n\t\t\t\t\t\tconst newmessages: typeof messages = {};\n\n\t\t\t\t\t\tfor (const form of newState.forms ?? []) {\n\t\t\t\t\t\t\tnewforms[form.id] = {};\n\t\t\t\t\t\t\tnewmessages[form.id] = {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsetForms(newforms);\n\t\t\t\t\t\tsetMessages(newmessages);\n\t\t\t\t\t}\n\n\t\t\t\t\tObject.keys(newState.messages ?? {}).forEach((formId) => {\n\t\t\t\t\t\tif (formId === 'global') {\n\t\t\t\t\t\t\tonGlobalMessage?.(newState.messages?.global?.text ?? '');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsetMessages((prev) => ({\n\t\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\t\t[formId]: newState.messages![formId],\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tsetState(newState);\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tonBlockReady?.({ previousState, state: structuredClone(newState) });\n\t\t\t\t\t}, 1);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof FallbackError) {\n\t\t\t\t\tonFallback?.(error);\n\t\t\t\t} else {\n\t\t\t\t\tonError?.(error);\n\t\t\t\t}\n\t\t\t}\n\t\t})();\n\t}, []);\n\n\treturn (\n\t\t<NativeFlowContext.Provider value={contextValue}>\n\t\t\t<div className=\"login-renderer\">\n\t\t\t\t{state.screen && widgets.layout\n\t\t\t\t\t? React.createElement(\n\t\t\t\t\t\t\twidgets.layout,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tformId: (state.layout?.items?.[0] as Widget)?.formId,\n\t\t\t\t\t\t\t\ttype: state.layout?.type,\n\t\t\t\t\t\t\t\ttag: 'form',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t<StyWidgetRenderer items={state.layout?.items ?? []} widgets={widgets} state={state} triggerFallback={triggerFallback} />,\n\t\t\t\t\t\t)\n\t\t\t\t\t: widgets.loading\n\t\t\t\t\t\t? React.createElement(widgets.loading)\n\t\t\t\t\t\t: null}\n\t\t\t</div>\n\t\t</NativeFlowContext.Provider>\n\t);\n};\n"],"names":["NativeFlowContext","createContext","formData","StyWidgetRenderer","items","widgets","state","triggerFallback","jsx","Fragment","item","idx","form","f","widget","w","WidgetComponent","LayoutComponent","StyLoginRenderer","props","params","sessionId","onLogin","onFallback","onClose","onError","onGlobalMessage","onBlockReady","sdk","useStrivacity","loginHandlerRef","useRef","loading","setLoading","useState","forms","setForms","messages","setMessages","setState","useCallback","hostedUrl","url","FallbackError","triggerClose","setFormValue","formId","widgetId","value","prev","setMessage","submitForm","data","unflattenObject","previousState","newState","newForms","newMessages","error","contextValue","useEffect","newforms","newmessages","React"],"mappings":"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"}
1
+ {"version":3,"file":"LoginRenderer.cjs","sources":["../src/LoginRenderer.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { NativeParams, PartialRecord, WidgetType, LayoutWidget, LoginFlowState, Widget, IdTokenClaims, LoginFlowMessage } from '@strivacity/sdk-core';\nimport type { NativeContext, NativeFlowContextValue } from './types';\nimport React, { useRef, useState, useEffect, createContext, useCallback } from 'react';\nimport { FallbackError } from '@strivacity/sdk-core';\nimport { unflattenObject } from '@strivacity/sdk-core/utils/object';\nimport { useStrivacity } from './composables';\n\nexport const NativeFlowContext = createContext<NativeFlowContextValue | null>(null);\nconst formData: Record<string, Record<string, unknown>> = {};\n\nconst StyWidgetRenderer: React.FC<{\n\titems: LayoutWidget['items'];\n\twidgets: PartialRecord<WidgetType, React.ComponentType<any>>;\n\tstate: LoginFlowState;\n\ttriggerFallback: (hostedUrl?: string, message?: string) => void;\n}> = ({ items, widgets, state, triggerFallback }) => {\n\treturn (\n\t\t<>\n\t\t\t{items.map((item, idx) => {\n\t\t\t\tif (item.type === 'widget') {\n\t\t\t\t\tconst form = state.forms?.find((f) => f.id === item.formId);\n\t\t\t\t\tconst widget = form?.widgets.find((w) => w.id === item.widgetId);\n\n\t\t\t\t\tif (!form || !widget) {\n\t\t\t\t\t\ttriggerFallback(undefined, `Unable to find form or widget for item: formId=${item.formId}, widgetId=${item.widgetId}`);\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst WidgetComponent = widgets[widget.type];\n\n\t\t\t\t\tif (!WidgetComponent) {\n\t\t\t\t\t\ttriggerFallback(undefined, `No component found for widget type ${widget.type}`);\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn <WidgetComponent key={`${form.id}.${widget.id}`} formId={form.id} config={widget} />;\n\t\t\t\t} else if (item.type === 'vertical' || item.type === 'horizontal') {\n\t\t\t\t\tconst LayoutComponent = widgets.layout;\n\n\t\t\t\t\tif (!LayoutComponent) {\n\t\t\t\t\t\ttriggerFallback(undefined, 'No layout component provided');\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<LayoutComponent key={idx} formId={(item.items[0] as Widget).formId} type={item.type}>\n\t\t\t\t\t\t\t<StyWidgetRenderer items={item.items} widgets={widgets} state={state} triggerFallback={triggerFallback} />\n\t\t\t\t\t\t</LayoutComponent>\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\ttriggerFallback(undefined, 'Unknown item type in layout');\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t})}\n\t\t</>\n\t);\n};\n\nexport const StyLoginRenderer: React.FC<{\n\tparams?: NativeParams;\n\twidgets?: PartialRecord<WidgetType, React.ComponentType<any>>;\n\tsessionId?: string | null;\n\tonLogin?: (claims?: IdTokenClaims | null) => void;\n\tonFallback?: (error: FallbackError) => void;\n\tonClose?: () => void;\n\tonError?: (error: any) => void;\n\tonGlobalMessage?: (message: string) => void;\n\tonBlockReady?: ({ previousState, state }: { previousState: LoginFlowState; state: LoginFlowState }) => void;\n}> = (props) => {\n\tconst { params, widgets, sessionId, onLogin, onFallback, onClose, onError, onGlobalMessage, onBlockReady } = {\n\t\tparams: {},\n\t\twidgets: {},\n\t\tsessionId: null,\n\t\t...props,\n\t};\n\tconst { sdk } = useStrivacity<NativeContext>();\n\tconst loginHandlerRef = useRef<ReturnType<(typeof sdk)['login']> | null>(null);\n\n\tconst [loading, setLoading] = useState(false);\n\tconst [forms, setForms] = useState<Record<string, Record<string, unknown>>>({});\n\tconst [messages, setMessages] = useState<Record<string, Record<string, LoginFlowMessage>>>({});\n\tconst [state, setState] = useState<LoginFlowState>({});\n\n\tconst triggerFallback = useCallback(\n\t\t(hostedUrl?: string, message?: string) => {\n\t\t\tconst url = hostedUrl || state.hostedUrl;\n\n\t\t\tsdk.logging?.warn(message ? `Triggering fallback due to: ${message}` : 'Triggering fallback');\n\n\t\t\tif (!url) {\n\t\t\t\tconst error = new Error('No hosted URL provided');\n\t\t\t\tsdk.logging?.error('Fallback error', error);\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tonFallback?.(new FallbackError(new URL(url)));\n\t\t},\n\t\t[state, onFallback],\n\t);\n\n\tconst triggerClose = useCallback(() => {\n\t\tonClose?.();\n\t}, [onClose]);\n\n\tconst setFormValue = useCallback((formId: string, widgetId: string, value: unknown) => {\n\t\tformData[formId] = {\n\t\t\t...formData[formId],\n\t\t\t[widgetId]: value === '' ? null : value,\n\t\t};\n\n\t\tsetForms((prev) => ({\n\t\t\t...prev,\n\t\t\t[formId]: { ...(prev[formId] || {}), [widgetId]: value === '' ? null : value },\n\t\t}));\n\t}, []);\n\n\tconst setMessage = useCallback((formId: string, widgetId: string, value: LoginFlowMessage) => {\n\t\tsetMessages((prev) => ({\n\t\t\t...prev,\n\t\t\t[formId]: { ...(prev[formId] || {}), [widgetId]: value },\n\t\t}));\n\t}, []);\n\n\tconst submitForm = useCallback(\n\t\tasync (formId: string) => {\n\t\t\ttry {\n\t\t\t\tsetLoading(true);\n\n\t\t\t\tconst data = await loginHandlerRef.current?.submitForm(formId, unflattenObject(formData[formId]));\n\n\t\t\t\tif (await sdk.isAuthenticated) {\n\t\t\t\t\tonLogin?.(sdk.idTokenClaims);\n\t\t\t\t} else {\n\t\t\t\t\tconst previousState = structuredClone(state);\n\t\t\t\t\tconst newState: LoginFlowState = {\n\t\t\t\t\t\thostedUrl: data?.hostedUrl ?? state.hostedUrl,\n\t\t\t\t\t\tfinalizeUrl: data?.finalizeUrl ?? state.finalizeUrl,\n\t\t\t\t\t\tscreen: data?.screen ?? state.screen,\n\t\t\t\t\t\tforms: data?.forms ?? state.forms,\n\t\t\t\t\t\tlayout: data?.layout ?? state.layout,\n\t\t\t\t\t\tmessages: data?.messages ?? {},\n\t\t\t\t\t\tbranding: data?.branding ?? state.branding,\n\t\t\t\t\t};\n\n\t\t\t\t\tif (newState.screen !== state.screen) {\n\t\t\t\t\t\tconst newForms: typeof forms = {};\n\t\t\t\t\t\tconst newMessages: typeof messages = {};\n\n\t\t\t\t\t\tfor (const form of newState.forms ?? []) {\n\t\t\t\t\t\t\tnewForms[form.id] = {};\n\t\t\t\t\t\t\tnewMessages[form.id] = {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsetForms(newForms);\n\t\t\t\t\t\tsetMessages(newMessages);\n\t\t\t\t\t}\n\n\t\t\t\t\tObject.keys(newState.messages ?? {}).forEach((formId) => {\n\t\t\t\t\t\tif (formId === 'global') {\n\t\t\t\t\t\t\tonGlobalMessage?.(newState.messages?.global?.text ?? '');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsetMessages((prev) => ({\n\t\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\t\t[formId]: newState.messages![formId],\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tsetState(newState);\n\t\t\t\t\tsetLoading(false);\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tonBlockReady?.({ previousState, state: structuredClone(newState) });\n\t\t\t\t\t}, 1);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof FallbackError) {\n\t\t\t\t\tonFallback?.(error);\n\t\t\t\t} else {\n\t\t\t\t\tonError?.(error);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[sdk, params, forms, state, onLogin, onFallback, onClose, onError, onGlobalMessage, onBlockReady],\n\t);\n\n\tconst contextValue: NativeFlowContextValue = {\n\t\tloading,\n\t\tforms,\n\t\tmessages,\n\t\tstate,\n\t\tsubmitForm,\n\t\ttriggerFallback,\n\t\ttriggerClose,\n\t\tsetFormValue,\n\t\tsetMessage,\n\t};\n\n\tuseEffect(() => {\n\t\tloginHandlerRef.current = sdk.login(params);\n\n\t\tvoid (async () => {\n\t\t\ttry {\n\t\t\t\tconst data = await loginHandlerRef.current?.startSession(sessionId);\n\t\t\t\tconst previousState = structuredClone(state);\n\t\t\t\tconst newState: LoginFlowState = {\n\t\t\t\t\thostedUrl: data?.hostedUrl ?? state.hostedUrl,\n\t\t\t\t\tfinalizeUrl: data?.finalizeUrl ?? state.finalizeUrl,\n\t\t\t\t\tscreen: data?.screen ?? state.screen,\n\t\t\t\t\tforms: data?.forms ?? state.forms,\n\t\t\t\t\tlayout: data?.layout ?? state.layout,\n\t\t\t\t\tmessages: data?.messages ?? {},\n\t\t\t\t\tbranding: data?.branding ?? state.branding,\n\t\t\t\t};\n\n\t\t\t\tif (await sdk.isAuthenticated) {\n\t\t\t\t\tonLogin?.(sdk.idTokenClaims);\n\t\t\t\t} else {\n\t\t\t\t\tif (newState.screen !== state.screen) {\n\t\t\t\t\t\tconst newforms: typeof forms = {};\n\t\t\t\t\t\tconst newmessages: typeof messages = {};\n\n\t\t\t\t\t\tfor (const form of newState.forms ?? []) {\n\t\t\t\t\t\t\tnewforms[form.id] = {};\n\t\t\t\t\t\t\tnewmessages[form.id] = {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsetForms(newforms);\n\t\t\t\t\t\tsetMessages(newmessages);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsdk.logging?.info(`Updating screen: ${newState.screen}`);\n\t\t\t\t\t}\n\n\t\t\t\t\tObject.keys(newState.messages ?? {}).forEach((formId) => {\n\t\t\t\t\t\tif (formId === 'global') {\n\t\t\t\t\t\t\tonGlobalMessage?.(newState.messages?.global?.text ?? '');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsetMessages((prev) => ({\n\t\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\t\t[formId]: newState.messages![formId],\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tsetState(newState);\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tonBlockReady?.({ previousState, state: structuredClone(newState) });\n\t\t\t\t\t}, 1);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof FallbackError) {\n\t\t\t\t\tonFallback?.(error);\n\t\t\t\t} else {\n\t\t\t\t\tonError?.(error);\n\t\t\t\t}\n\t\t\t}\n\t\t})();\n\t}, []);\n\n\treturn (\n\t\t<NativeFlowContext.Provider value={contextValue}>\n\t\t\t<div className=\"login-renderer\">\n\t\t\t\t{state.screen && widgets.layout\n\t\t\t\t\t? React.createElement(\n\t\t\t\t\t\t\twidgets.layout,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tformId: (state.layout?.items?.[0] as Widget)?.formId,\n\t\t\t\t\t\t\t\ttype: state.layout?.type,\n\t\t\t\t\t\t\t\ttag: 'form',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t<StyWidgetRenderer items={state.layout?.items ?? []} widgets={widgets} state={state} triggerFallback={triggerFallback} />,\n\t\t\t\t\t\t)\n\t\t\t\t\t: widgets.loading\n\t\t\t\t\t\t? React.createElement(widgets.loading)\n\t\t\t\t\t\t: null}\n\t\t\t</div>\n\t\t</NativeFlowContext.Provider>\n\t);\n};\n"],"names":["NativeFlowContext","createContext","formData","StyWidgetRenderer","items","widgets","state","triggerFallback","jsx","Fragment","item","idx","form","f","widget","w","WidgetComponent","LayoutComponent","StyLoginRenderer","props","params","sessionId","onLogin","onFallback","onClose","onError","onGlobalMessage","onBlockReady","sdk","useStrivacity","loginHandlerRef","useRef","loading","setLoading","useState","forms","setForms","messages","setMessages","setState","useCallback","hostedUrl","message","url","error","FallbackError","triggerClose","setFormValue","formId","widgetId","value","prev","setMessage","submitForm","data","unflattenObject","previousState","newState","newForms","newMessages","contextValue","useEffect","newforms","newmessages","React"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{jsx as g,Fragment as B}from"react/jsx-runtime";import j,{createContext as D,useRef as G,useState as U,useCallback as b,useEffect as H}from"react";import{FallbackError as R}from"@strivacity/sdk-core";import{unflattenObject as P}from"@strivacity/sdk-core/utils/object";import{useStrivacity as q}from"./composables.mjs";const J=D(null),x={},M=({items:C,widgets:y,state:i,triggerFallback:u})=>g(B,{children:C.map((r,d)=>{if(r.type==="widget"){const a=i.forms?.find(m=>m.id===r.formId),c=a?.widgets.find(m=>m.id===r.widgetId);if(!a||!c)return u(),null;const h=y[c.type];return h?g(h,{formId:a.id,config:c},`${a.id}.${c.id}`):(u(),null)}else if(r.type==="vertical"||r.type==="horizontal"){const a=y.layout;return a?g(a,{formId:r.items[0].formId,type:r.type,children:g(M,{items:r.items,widgets:y,state:i,triggerFallback:u})},d):(u(),null)}else return u(),null})}),_=C=>{const{params:y,widgets:i,sessionId:u,onLogin:r,onFallback:d,onClose:a,onError:c,onGlobalMessage:h,onBlockReady:m}={params:{},widgets:{},sessionId:null,...C},{sdk:p}=q(),S=G(null),[T,z]=U(!1),[k,E]=U({}),[N,w]=U({}),[e,F]=U({}),L=b(s=>{const t=s||e.hostedUrl;if(!t)throw new Error("No hosted URL provided");d?.(new R(new URL(t)))},[e,d]),O=b(()=>{a?.()},[a]),A=b((s,t,n)=>{x[s]={...x[s],[t]:n===""?null:n},E(o=>({...o,[s]:{...o[s]||{},[t]:n===""?null:n}}))},[]),V=b((s,t,n)=>{w(o=>({...o,[s]:{...o[s]||{},[t]:n}}))},[]),W=b(async s=>{try{z(!0);const t=await S.current?.submitForm(s,P(x[s]));if(await p.isAuthenticated)r?.(p.idTokenClaims);else{const n=structuredClone(e),o={hostedUrl:t?.hostedUrl??e.hostedUrl,finalizeUrl:t?.finalizeUrl??e.finalizeUrl,screen:t?.screen??e.screen,forms:t?.forms??e.forms,layout:t?.layout??e.layout,messages:t?.messages??e.messages,branding:t?.branding??e.branding};if(o.screen!==e.screen){const l={},f={};for(const v of o.forms??[])l[v.id]={},f[v.id]={};E(l),w(f)}Object.keys(o.messages??{}).forEach(l=>{l==="global"?h?.(o.messages?.global?.text??""):w(f=>({...f,[l]:o.messages[l]}))}),F(o),z(!1),setTimeout(()=>{m?.({previousState:n,state:structuredClone(o)})},1)}}catch(t){console.error("Error submitting form:",t),t instanceof R?d?.(t):c?.(t)}},[p,y,k,e,r,d,a,c,h,m]),$={loading:T,forms:k,messages:N,state:e,submitForm:W,triggerFallback:L,triggerClose:O,setFormValue:A,setMessage:V};return H(()=>{S.current=p.login(y),(async()=>{try{const s=await S.current?.startSession(u),t=structuredClone(e),n={hostedUrl:s?.hostedUrl??e.hostedUrl,finalizeUrl:s?.finalizeUrl??e.finalizeUrl,screen:s?.screen??e.screen,forms:s?.forms??e.forms,layout:s?.layout??e.layout,messages:s?.messages??e.messages,branding:s?.branding??e.branding};if(await p.isAuthenticated)r?.(p.idTokenClaims);else{if(n.screen!==e.screen){const o={},l={};for(const f of n.forms??[])o[f.id]={},l[f.id]={};E(o),w(l)}Object.keys(n.messages??{}).forEach(o=>{o==="global"?h?.(n.messages?.global?.text??""):w(l=>({...l,[o]:n.messages[o]}))}),F(n),setTimeout(()=>{m?.({previousState:t,state:structuredClone(n)})},1)}}catch(s){s instanceof R?d?.(s):c?.(s)}})()},[]),g(J.Provider,{value:$,children:g("div",{className:"login-renderer",children:e.screen&&i.layout?j.createElement(i.layout,{formId:e.layout?.items?.[0]?.formId,type:e.layout?.type,tag:"form"},g(M,{items:e.layout?.items??[],widgets:i,state:e,triggerFallback:L})):i.loading?j.createElement(i.loading):null})})};export{J as NativeFlowContext,_ as StyLoginRenderer};
1
+ import{jsx as y,Fragment as W}from"react/jsx-runtime";import L,{createContext as B,useRef as D,useState as U,useCallback as h,useEffect as G}from"react";import{FallbackError as S}from"@strivacity/sdk-core";import{unflattenObject as H}from"@strivacity/sdk-core/utils/object";import{useStrivacity as P}from"./composables.mjs";const q=B(null),E={},T=({items:C,widgets:p,state:d,triggerFallback:f})=>y(W,{children:C.map((r,u)=>{if(r.type==="widget"){const a=d.forms?.find(g=>g.id===r.formId),l=a?.widgets.find(g=>g.id===r.widgetId);if(!a||!l)return f(void 0,`Unable to find form or widget for item: formId=${r.formId}, widgetId=${r.widgetId}`),null;const w=p[l.type];return w?y(w,{formId:a.id,config:l},`${a.id}.${l.id}`):(f(void 0,`No component found for widget type ${l.type}`),null)}else if(r.type==="vertical"||r.type==="horizontal"){const a=p.layout;return a?y(a,{formId:r.items[0].formId,type:r.type,children:y(T,{items:r.items,widgets:p,state:d,triggerFallback:f})},u):(f(void 0,"No layout component provided"),null)}else return f(void 0,"Unknown item type in layout"),null})}),Z=C=>{const{params:p,widgets:d,sessionId:f,onLogin:r,onFallback:u,onClose:a,onError:l,onGlobalMessage:w,onBlockReady:g}={params:{},widgets:{},sessionId:null,...C},{sdk:c}=P(),k=D(null),[N,R]=U(!1),[x,v]=U({}),[j,b]=U({}),[e,z]=U({}),F=h((t,o)=>{const n=t||e.hostedUrl;if(c.logging?.warn(o?`Triggering fallback due to: ${o}`:"Triggering fallback"),!n){const s=new Error("No hosted URL provided");throw c.logging?.error("Fallback error",s),s}u?.(new S(new URL(n)))},[e,u]),M=h(()=>{a?.()},[a]),I=h((t,o,n)=>{E[t]={...E[t],[o]:n===""?null:n},v(s=>({...s,[t]:{...s[t]||{},[o]:n===""?null:n}}))},[]),O=h((t,o,n)=>{b(s=>({...s,[t]:{...s[t]||{},[o]:n}}))},[]),A=h(async t=>{try{R(!0);const o=await k.current?.submitForm(t,H(E[t]));if(await c.isAuthenticated)r?.(c.idTokenClaims);else{const n=structuredClone(e),s={hostedUrl:o?.hostedUrl??e.hostedUrl,finalizeUrl:o?.finalizeUrl??e.finalizeUrl,screen:o?.screen??e.screen,forms:o?.forms??e.forms,layout:o?.layout??e.layout,messages:o?.messages??{},branding:o?.branding??e.branding};if(s.screen!==e.screen){const i={},m={};for(const $ of s.forms??[])i[$.id]={},m[$.id]={};v(i),b(m)}Object.keys(s.messages??{}).forEach(i=>{i==="global"?w?.(s.messages?.global?.text??""):b(m=>({...m,[i]:s.messages[i]}))}),z(s),R(!1),setTimeout(()=>{g?.({previousState:n,state:structuredClone(s)})},1)}}catch(o){o instanceof S?u?.(o):l?.(o)}},[c,p,x,e,r,u,a,l,w,g]),V={loading:N,forms:x,messages:j,state:e,submitForm:A,triggerFallback:F,triggerClose:M,setFormValue:I,setMessage:O};return G(()=>{k.current=c.login(p),(async()=>{try{const t=await k.current?.startSession(f),o=structuredClone(e),n={hostedUrl:t?.hostedUrl??e.hostedUrl,finalizeUrl:t?.finalizeUrl??e.finalizeUrl,screen:t?.screen??e.screen,forms:t?.forms??e.forms,layout:t?.layout??e.layout,messages:t?.messages??{},branding:t?.branding??e.branding};if(await c.isAuthenticated)r?.(c.idTokenClaims);else{if(n.screen!==e.screen){const s={},i={};for(const m of n.forms??[])s[m.id]={},i[m.id]={};v(s),b(i)}else c.logging?.info(`Updating screen: ${n.screen}`);Object.keys(n.messages??{}).forEach(s=>{s==="global"?w?.(n.messages?.global?.text??""):b(i=>({...i,[s]:n.messages[s]}))}),z(n),setTimeout(()=>{g?.({previousState:o,state:structuredClone(n)})},1)}}catch(t){t instanceof S?u?.(t):l?.(t)}})()},[]),y(q.Provider,{value:V,children:y("div",{className:"login-renderer",children:e.screen&&d.layout?L.createElement(d.layout,{formId:e.layout?.items?.[0]?.formId,type:e.layout?.type,tag:"form"},y(T,{items:e.layout?.items??[],widgets:d,state:e,triggerFallback:F})):d.loading?L.createElement(d.loading):null})})};export{q as NativeFlowContext,Z as StyLoginRenderer};
2
2
  //# sourceMappingURL=LoginRenderer.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"LoginRenderer.mjs","sources":["../src/LoginRenderer.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { NativeParams, PartialRecord, WidgetType, LayoutWidget, LoginFlowState, Widget, IdTokenClaims, LoginFlowMessage } from '@strivacity/sdk-core';\nimport type { NativeContext, NativeFlowContextValue } from './types';\nimport React, { useRef, useState, useEffect, createContext, useCallback } from 'react';\nimport { FallbackError } from '@strivacity/sdk-core';\nimport { unflattenObject } from '@strivacity/sdk-core/utils/object';\nimport { useStrivacity } from './composables';\n\nexport const NativeFlowContext = createContext<NativeFlowContextValue | null>(null);\nconst formData: Record<string, Record<string, unknown>> = {};\n\nconst StyWidgetRenderer: React.FC<{\n\titems: LayoutWidget['items'];\n\twidgets: PartialRecord<WidgetType, React.ComponentType<any>>;\n\tstate: LoginFlowState;\n\ttriggerFallback: (hostedUrl?: string) => void;\n}> = ({ items, widgets, state, triggerFallback }) => {\n\treturn (\n\t\t<>\n\t\t\t{items.map((item, idx) => {\n\t\t\t\tif (item.type === 'widget') {\n\t\t\t\t\tconst form = state.forms?.find((f) => f.id === item.formId);\n\t\t\t\t\tconst widget = form?.widgets.find((w) => w.id === item.widgetId);\n\n\t\t\t\t\tif (!form || !widget) {\n\t\t\t\t\t\ttriggerFallback();\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst WidgetComponent = widgets[widget.type];\n\n\t\t\t\t\tif (!WidgetComponent) {\n\t\t\t\t\t\ttriggerFallback();\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn <WidgetComponent key={`${form.id}.${widget.id}`} formId={form.id} config={widget} />;\n\t\t\t\t} else if (item.type === 'vertical' || item.type === 'horizontal') {\n\t\t\t\t\tconst LayoutComponent = widgets.layout;\n\n\t\t\t\t\tif (!LayoutComponent) {\n\t\t\t\t\t\ttriggerFallback();\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<LayoutComponent key={idx} formId={(item.items[0] as Widget).formId} type={item.type}>\n\t\t\t\t\t\t\t<StyWidgetRenderer items={item.items} widgets={widgets} state={state} triggerFallback={triggerFallback} />\n\t\t\t\t\t\t</LayoutComponent>\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\ttriggerFallback();\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t})}\n\t\t</>\n\t);\n};\n\nexport const StyLoginRenderer: React.FC<{\n\tparams?: NativeParams;\n\twidgets?: PartialRecord<WidgetType, React.ComponentType<any>>;\n\tsessionId?: string | null;\n\tonLogin?: (claims?: IdTokenClaims | null) => void;\n\tonFallback?: (error: FallbackError) => void;\n\tonClose?: () => void;\n\tonError?: (error: any) => void;\n\tonGlobalMessage?: (message: string) => void;\n\tonBlockReady?: ({ previousState, state }: { previousState: LoginFlowState; state: LoginFlowState }) => void;\n}> = (props) => {\n\tconst { params, widgets, sessionId, onLogin, onFallback, onClose, onError, onGlobalMessage, onBlockReady } = {\n\t\tparams: {},\n\t\twidgets: {},\n\t\tsessionId: null,\n\t\t...props,\n\t};\n\tconst { sdk } = useStrivacity<NativeContext>();\n\tconst loginHandlerRef = useRef<ReturnType<(typeof sdk)['login']> | null>(null);\n\n\tconst [loading, setLoading] = useState(false);\n\tconst [forms, setForms] = useState<Record<string, Record<string, unknown>>>({});\n\tconst [messages, setMessages] = useState<Record<string, Record<string, LoginFlowMessage>>>({});\n\tconst [state, setState] = useState<LoginFlowState>({});\n\n\tconst triggerFallback = useCallback(\n\t\t(hostedUrl?: string) => {\n\t\t\tconst url = hostedUrl || state.hostedUrl;\n\n\t\t\tif (!url) {\n\t\t\t\tthrow new Error('No hosted URL provided');\n\t\t\t}\n\n\t\t\tonFallback?.(new FallbackError(new URL(url)));\n\t\t},\n\t\t[state, onFallback],\n\t);\n\n\tconst triggerClose = useCallback(() => {\n\t\tonClose?.();\n\t}, [onClose]);\n\n\tconst setFormValue = useCallback((formId: string, widgetId: string, value: unknown) => {\n\t\tformData[formId] = {\n\t\t\t...formData[formId],\n\t\t\t[widgetId]: value === '' ? null : value,\n\t\t};\n\n\t\tsetForms((prev) => ({\n\t\t\t...prev,\n\t\t\t[formId]: { ...(prev[formId] || {}), [widgetId]: value === '' ? null : value },\n\t\t}));\n\t}, []);\n\n\tconst setMessage = useCallback((formId: string, widgetId: string, value: LoginFlowMessage) => {\n\t\tsetMessages((prev) => ({\n\t\t\t...prev,\n\t\t\t[formId]: { ...(prev[formId] || {}), [widgetId]: value },\n\t\t}));\n\t}, []);\n\n\tconst submitForm = useCallback(\n\t\tasync (formId: string) => {\n\t\t\ttry {\n\t\t\t\tsetLoading(true);\n\n\t\t\t\tconst data = await loginHandlerRef.current?.submitForm(formId, unflattenObject(formData[formId]));\n\n\t\t\t\tif (await sdk.isAuthenticated) {\n\t\t\t\t\tonLogin?.(sdk.idTokenClaims);\n\t\t\t\t} else {\n\t\t\t\t\tconst previousState = structuredClone(state);\n\t\t\t\t\tconst newState: LoginFlowState = {\n\t\t\t\t\t\thostedUrl: data?.hostedUrl ?? state.hostedUrl,\n\t\t\t\t\t\tfinalizeUrl: data?.finalizeUrl ?? state.finalizeUrl,\n\t\t\t\t\t\tscreen: data?.screen ?? state.screen,\n\t\t\t\t\t\tforms: data?.forms ?? state.forms,\n\t\t\t\t\t\tlayout: data?.layout ?? state.layout,\n\t\t\t\t\t\tmessages: data?.messages ?? state.messages,\n\t\t\t\t\t\tbranding: data?.branding ?? state.branding,\n\t\t\t\t\t};\n\n\t\t\t\t\tif (newState.screen !== state.screen) {\n\t\t\t\t\t\tconst newForms: typeof forms = {};\n\t\t\t\t\t\tconst newMessages: typeof messages = {};\n\n\t\t\t\t\t\tfor (const form of newState.forms ?? []) {\n\t\t\t\t\t\t\tnewForms[form.id] = {};\n\t\t\t\t\t\t\tnewMessages[form.id] = {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsetForms(newForms);\n\t\t\t\t\t\tsetMessages(newMessages);\n\t\t\t\t\t}\n\n\t\t\t\t\tObject.keys(newState.messages ?? {}).forEach((formId) => {\n\t\t\t\t\t\tif (formId === 'global') {\n\t\t\t\t\t\t\tonGlobalMessage?.(newState.messages?.global?.text ?? '');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsetMessages((prev) => ({\n\t\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\t\t[formId]: newState.messages![formId],\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tsetState(newState);\n\t\t\t\t\tsetLoading(false);\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tonBlockReady?.({ previousState, state: structuredClone(newState) });\n\t\t\t\t\t}, 1);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('Error submitting form:', error);\n\n\t\t\t\tif (error instanceof FallbackError) {\n\t\t\t\t\tonFallback?.(error);\n\t\t\t\t} else {\n\t\t\t\t\tonError?.(error);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[sdk, params, forms, state, onLogin, onFallback, onClose, onError, onGlobalMessage, onBlockReady],\n\t);\n\n\tconst contextValue: NativeFlowContextValue = {\n\t\tloading,\n\t\tforms,\n\t\tmessages,\n\t\tstate,\n\t\tsubmitForm,\n\t\ttriggerFallback,\n\t\ttriggerClose,\n\t\tsetFormValue,\n\t\tsetMessage,\n\t};\n\n\tuseEffect(() => {\n\t\tloginHandlerRef.current = sdk.login(params);\n\n\t\tvoid (async () => {\n\t\t\ttry {\n\t\t\t\tconst data = await loginHandlerRef.current?.startSession(sessionId);\n\t\t\t\tconst previousState = structuredClone(state);\n\t\t\t\tconst newState: LoginFlowState = {\n\t\t\t\t\thostedUrl: data?.hostedUrl ?? state.hostedUrl,\n\t\t\t\t\tfinalizeUrl: data?.finalizeUrl ?? state.finalizeUrl,\n\t\t\t\t\tscreen: data?.screen ?? state.screen,\n\t\t\t\t\tforms: data?.forms ?? state.forms,\n\t\t\t\t\tlayout: data?.layout ?? state.layout,\n\t\t\t\t\tmessages: data?.messages ?? state.messages,\n\t\t\t\t\tbranding: data?.branding ?? state.branding,\n\t\t\t\t};\n\n\t\t\t\tif (await sdk.isAuthenticated) {\n\t\t\t\t\tonLogin?.(sdk.idTokenClaims);\n\t\t\t\t} else {\n\t\t\t\t\tif (newState.screen !== state.screen) {\n\t\t\t\t\t\tconst newforms: typeof forms = {};\n\t\t\t\t\t\tconst newmessages: typeof messages = {};\n\n\t\t\t\t\t\tfor (const form of newState.forms ?? []) {\n\t\t\t\t\t\t\tnewforms[form.id] = {};\n\t\t\t\t\t\t\tnewmessages[form.id] = {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsetForms(newforms);\n\t\t\t\t\t\tsetMessages(newmessages);\n\t\t\t\t\t}\n\n\t\t\t\t\tObject.keys(newState.messages ?? {}).forEach((formId) => {\n\t\t\t\t\t\tif (formId === 'global') {\n\t\t\t\t\t\t\tonGlobalMessage?.(newState.messages?.global?.text ?? '');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsetMessages((prev) => ({\n\t\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\t\t[formId]: newState.messages![formId],\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tsetState(newState);\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tonBlockReady?.({ previousState, state: structuredClone(newState) });\n\t\t\t\t\t}, 1);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof FallbackError) {\n\t\t\t\t\tonFallback?.(error);\n\t\t\t\t} else {\n\t\t\t\t\tonError?.(error);\n\t\t\t\t}\n\t\t\t}\n\t\t})();\n\t}, []);\n\n\treturn (\n\t\t<NativeFlowContext.Provider value={contextValue}>\n\t\t\t<div className=\"login-renderer\">\n\t\t\t\t{state.screen && widgets.layout\n\t\t\t\t\t? React.createElement(\n\t\t\t\t\t\t\twidgets.layout,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tformId: (state.layout?.items?.[0] as Widget)?.formId,\n\t\t\t\t\t\t\t\ttype: state.layout?.type,\n\t\t\t\t\t\t\t\ttag: 'form',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t<StyWidgetRenderer items={state.layout?.items ?? []} widgets={widgets} state={state} triggerFallback={triggerFallback} />,\n\t\t\t\t\t\t)\n\t\t\t\t\t: widgets.loading\n\t\t\t\t\t\t? React.createElement(widgets.loading)\n\t\t\t\t\t\t: null}\n\t\t\t</div>\n\t\t</NativeFlowContext.Provider>\n\t);\n};\n"],"names":["NativeFlowContext","createContext","formData","StyWidgetRenderer","items","widgets","state","triggerFallback","jsx","Fragment","item","idx","form","f","widget","w","WidgetComponent","LayoutComponent","StyLoginRenderer","props","params","sessionId","onLogin","onFallback","onClose","onError","onGlobalMessage","onBlockReady","sdk","useStrivacity","loginHandlerRef","useRef","loading","setLoading","useState","forms","setForms","messages","setMessages","setState","useCallback","hostedUrl","url","FallbackError","triggerClose","setFormValue","formId","widgetId","value","prev","setMessage","submitForm","data","unflattenObject","previousState","newState","newForms","newMessages","error","contextValue","useEffect","newforms","newmessages","React"],"mappings":"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"}
1
+ {"version":3,"file":"LoginRenderer.mjs","sources":["../src/LoginRenderer.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { NativeParams, PartialRecord, WidgetType, LayoutWidget, LoginFlowState, Widget, IdTokenClaims, LoginFlowMessage } from '@strivacity/sdk-core';\nimport type { NativeContext, NativeFlowContextValue } from './types';\nimport React, { useRef, useState, useEffect, createContext, useCallback } from 'react';\nimport { FallbackError } from '@strivacity/sdk-core';\nimport { unflattenObject } from '@strivacity/sdk-core/utils/object';\nimport { useStrivacity } from './composables';\n\nexport const NativeFlowContext = createContext<NativeFlowContextValue | null>(null);\nconst formData: Record<string, Record<string, unknown>> = {};\n\nconst StyWidgetRenderer: React.FC<{\n\titems: LayoutWidget['items'];\n\twidgets: PartialRecord<WidgetType, React.ComponentType<any>>;\n\tstate: LoginFlowState;\n\ttriggerFallback: (hostedUrl?: string, message?: string) => void;\n}> = ({ items, widgets, state, triggerFallback }) => {\n\treturn (\n\t\t<>\n\t\t\t{items.map((item, idx) => {\n\t\t\t\tif (item.type === 'widget') {\n\t\t\t\t\tconst form = state.forms?.find((f) => f.id === item.formId);\n\t\t\t\t\tconst widget = form?.widgets.find((w) => w.id === item.widgetId);\n\n\t\t\t\t\tif (!form || !widget) {\n\t\t\t\t\t\ttriggerFallback(undefined, `Unable to find form or widget for item: formId=${item.formId}, widgetId=${item.widgetId}`);\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst WidgetComponent = widgets[widget.type];\n\n\t\t\t\t\tif (!WidgetComponent) {\n\t\t\t\t\t\ttriggerFallback(undefined, `No component found for widget type ${widget.type}`);\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn <WidgetComponent key={`${form.id}.${widget.id}`} formId={form.id} config={widget} />;\n\t\t\t\t} else if (item.type === 'vertical' || item.type === 'horizontal') {\n\t\t\t\t\tconst LayoutComponent = widgets.layout;\n\n\t\t\t\t\tif (!LayoutComponent) {\n\t\t\t\t\t\ttriggerFallback(undefined, 'No layout component provided');\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<LayoutComponent key={idx} formId={(item.items[0] as Widget).formId} type={item.type}>\n\t\t\t\t\t\t\t<StyWidgetRenderer items={item.items} widgets={widgets} state={state} triggerFallback={triggerFallback} />\n\t\t\t\t\t\t</LayoutComponent>\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\ttriggerFallback(undefined, 'Unknown item type in layout');\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t})}\n\t\t</>\n\t);\n};\n\nexport const StyLoginRenderer: React.FC<{\n\tparams?: NativeParams;\n\twidgets?: PartialRecord<WidgetType, React.ComponentType<any>>;\n\tsessionId?: string | null;\n\tonLogin?: (claims?: IdTokenClaims | null) => void;\n\tonFallback?: (error: FallbackError) => void;\n\tonClose?: () => void;\n\tonError?: (error: any) => void;\n\tonGlobalMessage?: (message: string) => void;\n\tonBlockReady?: ({ previousState, state }: { previousState: LoginFlowState; state: LoginFlowState }) => void;\n}> = (props) => {\n\tconst { params, widgets, sessionId, onLogin, onFallback, onClose, onError, onGlobalMessage, onBlockReady } = {\n\t\tparams: {},\n\t\twidgets: {},\n\t\tsessionId: null,\n\t\t...props,\n\t};\n\tconst { sdk } = useStrivacity<NativeContext>();\n\tconst loginHandlerRef = useRef<ReturnType<(typeof sdk)['login']> | null>(null);\n\n\tconst [loading, setLoading] = useState(false);\n\tconst [forms, setForms] = useState<Record<string, Record<string, unknown>>>({});\n\tconst [messages, setMessages] = useState<Record<string, Record<string, LoginFlowMessage>>>({});\n\tconst [state, setState] = useState<LoginFlowState>({});\n\n\tconst triggerFallback = useCallback(\n\t\t(hostedUrl?: string, message?: string) => {\n\t\t\tconst url = hostedUrl || state.hostedUrl;\n\n\t\t\tsdk.logging?.warn(message ? `Triggering fallback due to: ${message}` : 'Triggering fallback');\n\n\t\t\tif (!url) {\n\t\t\t\tconst error = new Error('No hosted URL provided');\n\t\t\t\tsdk.logging?.error('Fallback error', error);\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tonFallback?.(new FallbackError(new URL(url)));\n\t\t},\n\t\t[state, onFallback],\n\t);\n\n\tconst triggerClose = useCallback(() => {\n\t\tonClose?.();\n\t}, [onClose]);\n\n\tconst setFormValue = useCallback((formId: string, widgetId: string, value: unknown) => {\n\t\tformData[formId] = {\n\t\t\t...formData[formId],\n\t\t\t[widgetId]: value === '' ? null : value,\n\t\t};\n\n\t\tsetForms((prev) => ({\n\t\t\t...prev,\n\t\t\t[formId]: { ...(prev[formId] || {}), [widgetId]: value === '' ? null : value },\n\t\t}));\n\t}, []);\n\n\tconst setMessage = useCallback((formId: string, widgetId: string, value: LoginFlowMessage) => {\n\t\tsetMessages((prev) => ({\n\t\t\t...prev,\n\t\t\t[formId]: { ...(prev[formId] || {}), [widgetId]: value },\n\t\t}));\n\t}, []);\n\n\tconst submitForm = useCallback(\n\t\tasync (formId: string) => {\n\t\t\ttry {\n\t\t\t\tsetLoading(true);\n\n\t\t\t\tconst data = await loginHandlerRef.current?.submitForm(formId, unflattenObject(formData[formId]));\n\n\t\t\t\tif (await sdk.isAuthenticated) {\n\t\t\t\t\tonLogin?.(sdk.idTokenClaims);\n\t\t\t\t} else {\n\t\t\t\t\tconst previousState = structuredClone(state);\n\t\t\t\t\tconst newState: LoginFlowState = {\n\t\t\t\t\t\thostedUrl: data?.hostedUrl ?? state.hostedUrl,\n\t\t\t\t\t\tfinalizeUrl: data?.finalizeUrl ?? state.finalizeUrl,\n\t\t\t\t\t\tscreen: data?.screen ?? state.screen,\n\t\t\t\t\t\tforms: data?.forms ?? state.forms,\n\t\t\t\t\t\tlayout: data?.layout ?? state.layout,\n\t\t\t\t\t\tmessages: data?.messages ?? {},\n\t\t\t\t\t\tbranding: data?.branding ?? state.branding,\n\t\t\t\t\t};\n\n\t\t\t\t\tif (newState.screen !== state.screen) {\n\t\t\t\t\t\tconst newForms: typeof forms = {};\n\t\t\t\t\t\tconst newMessages: typeof messages = {};\n\n\t\t\t\t\t\tfor (const form of newState.forms ?? []) {\n\t\t\t\t\t\t\tnewForms[form.id] = {};\n\t\t\t\t\t\t\tnewMessages[form.id] = {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsetForms(newForms);\n\t\t\t\t\t\tsetMessages(newMessages);\n\t\t\t\t\t}\n\n\t\t\t\t\tObject.keys(newState.messages ?? {}).forEach((formId) => {\n\t\t\t\t\t\tif (formId === 'global') {\n\t\t\t\t\t\t\tonGlobalMessage?.(newState.messages?.global?.text ?? '');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsetMessages((prev) => ({\n\t\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\t\t[formId]: newState.messages![formId],\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tsetState(newState);\n\t\t\t\t\tsetLoading(false);\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tonBlockReady?.({ previousState, state: structuredClone(newState) });\n\t\t\t\t\t}, 1);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof FallbackError) {\n\t\t\t\t\tonFallback?.(error);\n\t\t\t\t} else {\n\t\t\t\t\tonError?.(error);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[sdk, params, forms, state, onLogin, onFallback, onClose, onError, onGlobalMessage, onBlockReady],\n\t);\n\n\tconst contextValue: NativeFlowContextValue = {\n\t\tloading,\n\t\tforms,\n\t\tmessages,\n\t\tstate,\n\t\tsubmitForm,\n\t\ttriggerFallback,\n\t\ttriggerClose,\n\t\tsetFormValue,\n\t\tsetMessage,\n\t};\n\n\tuseEffect(() => {\n\t\tloginHandlerRef.current = sdk.login(params);\n\n\t\tvoid (async () => {\n\t\t\ttry {\n\t\t\t\tconst data = await loginHandlerRef.current?.startSession(sessionId);\n\t\t\t\tconst previousState = structuredClone(state);\n\t\t\t\tconst newState: LoginFlowState = {\n\t\t\t\t\thostedUrl: data?.hostedUrl ?? state.hostedUrl,\n\t\t\t\t\tfinalizeUrl: data?.finalizeUrl ?? state.finalizeUrl,\n\t\t\t\t\tscreen: data?.screen ?? state.screen,\n\t\t\t\t\tforms: data?.forms ?? state.forms,\n\t\t\t\t\tlayout: data?.layout ?? state.layout,\n\t\t\t\t\tmessages: data?.messages ?? {},\n\t\t\t\t\tbranding: data?.branding ?? state.branding,\n\t\t\t\t};\n\n\t\t\t\tif (await sdk.isAuthenticated) {\n\t\t\t\t\tonLogin?.(sdk.idTokenClaims);\n\t\t\t\t} else {\n\t\t\t\t\tif (newState.screen !== state.screen) {\n\t\t\t\t\t\tconst newforms: typeof forms = {};\n\t\t\t\t\t\tconst newmessages: typeof messages = {};\n\n\t\t\t\t\t\tfor (const form of newState.forms ?? []) {\n\t\t\t\t\t\t\tnewforms[form.id] = {};\n\t\t\t\t\t\t\tnewmessages[form.id] = {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsetForms(newforms);\n\t\t\t\t\t\tsetMessages(newmessages);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsdk.logging?.info(`Updating screen: ${newState.screen}`);\n\t\t\t\t\t}\n\n\t\t\t\t\tObject.keys(newState.messages ?? {}).forEach((formId) => {\n\t\t\t\t\t\tif (formId === 'global') {\n\t\t\t\t\t\t\tonGlobalMessage?.(newState.messages?.global?.text ?? '');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsetMessages((prev) => ({\n\t\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\t\t[formId]: newState.messages![formId],\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tsetState(newState);\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tonBlockReady?.({ previousState, state: structuredClone(newState) });\n\t\t\t\t\t}, 1);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof FallbackError) {\n\t\t\t\t\tonFallback?.(error);\n\t\t\t\t} else {\n\t\t\t\t\tonError?.(error);\n\t\t\t\t}\n\t\t\t}\n\t\t})();\n\t}, []);\n\n\treturn (\n\t\t<NativeFlowContext.Provider value={contextValue}>\n\t\t\t<div className=\"login-renderer\">\n\t\t\t\t{state.screen && widgets.layout\n\t\t\t\t\t? React.createElement(\n\t\t\t\t\t\t\twidgets.layout,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tformId: (state.layout?.items?.[0] as Widget)?.formId,\n\t\t\t\t\t\t\t\ttype: state.layout?.type,\n\t\t\t\t\t\t\t\ttag: 'form',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t<StyWidgetRenderer items={state.layout?.items ?? []} widgets={widgets} state={state} triggerFallback={triggerFallback} />,\n\t\t\t\t\t\t)\n\t\t\t\t\t: widgets.loading\n\t\t\t\t\t\t? React.createElement(widgets.loading)\n\t\t\t\t\t\t: null}\n\t\t\t</div>\n\t\t</NativeFlowContext.Provider>\n\t);\n};\n"],"names":["NativeFlowContext","createContext","formData","StyWidgetRenderer","items","widgets","state","triggerFallback","jsx","Fragment","item","idx","form","f","widget","w","WidgetComponent","LayoutComponent","StyLoginRenderer","props","params","sessionId","onLogin","onFallback","onClose","onError","onGlobalMessage","onBlockReady","sdk","useStrivacity","loginHandlerRef","useRef","loading","setLoading","useState","forms","setForms","messages","setMessages","setState","useCallback","hostedUrl","message","url","error","FallbackError","triggerClose","setFormValue","formId","widgetId","value","prev","setMessage","submitForm","data","unflattenObject","previousState","newState","newForms","newMessages","contextValue","useEffect","newforms","newmessages","React"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("@strivacity/sdk-core"),i=require("@strivacity/sdk-core/utils/HttpClient"),n=require("@strivacity/sdk-core/storages/LocalStorage"),a=require("@strivacity/sdk-core/storages/SessionStorage"),r=require("@strivacity/sdk-core/utils/credentials"),u=require("./composables.cjs"),c=require("./AuthProvider.cjs"),o=require("./LoginRenderer.cjs");require("react");require("react/jsx-runtime");require("@strivacity/sdk-core/utils/object");Object.defineProperty(exports,"HttpClient",{enumerable:!0,get:()=>i.HttpClient});Object.defineProperty(exports,"LocalStorage",{enumerable:!0,get:()=>n.LocalStorage});Object.defineProperty(exports,"SessionStorage",{enumerable:!0,get:()=>a.SessionStorage});Object.defineProperty(exports,"createCredential",{enumerable:!0,get:()=>r.createCredential});Object.defineProperty(exports,"getCredential",{enumerable:!0,get:()=>r.getCredential});exports.useStrivacity=u.useStrivacity;exports.StyAuthProvider=c.StyAuthProvider;exports.NativeFlowContext=o.NativeFlowContext;exports.StyLoginRenderer=o.StyLoginRenderer;Object.keys(t).forEach(e=>{e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:()=>t[e]})});
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("@strivacity/sdk-core"),i=require("@strivacity/sdk-core/utils/HttpClient"),n=require("@strivacity/sdk-core/utils/Logging"),u=require("@strivacity/sdk-core/storages/LocalStorage"),a=require("@strivacity/sdk-core/storages/SessionStorage"),r=require("@strivacity/sdk-core/utils/credentials"),c=require("./composables.cjs"),g=require("./AuthProvider.cjs"),o=require("./LoginRenderer.cjs");require("react");require("react/jsx-runtime");require("@strivacity/sdk-core/utils/object");Object.defineProperty(exports,"HttpClient",{enumerable:!0,get:()=>i.HttpClient});Object.defineProperty(exports,"DefaultLogging",{enumerable:!0,get:()=>n.DefaultLogging});Object.defineProperty(exports,"LocalStorage",{enumerable:!0,get:()=>u.LocalStorage});Object.defineProperty(exports,"SessionStorage",{enumerable:!0,get:()=>a.SessionStorage});Object.defineProperty(exports,"createCredential",{enumerable:!0,get:()=>r.createCredential});Object.defineProperty(exports,"getCredential",{enumerable:!0,get:()=>r.getCredential});exports.useStrivacity=c.useStrivacity;exports.StyAuthProvider=g.StyAuthProvider;exports.NativeFlowContext=o.NativeFlowContext;exports.StyLoginRenderer=o.StyLoginRenderer;Object.keys(t).forEach(e=>{e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:()=>t[e]})});
2
2
  //# sourceMappingURL=index.cjs.map
package/dist/index.d.ts CHANGED
@@ -4,11 +4,10 @@ export type { PopupFlow } from '@strivacity/sdk-core/flows/PopupFlow';
4
4
  export type { RedirectFlow } from '@strivacity/sdk-core/flows/RedirectFlow';
5
5
  export type { NativeFlow } from '@strivacity/sdk-core/flows/NativeFlow';
6
6
  export { HttpClient } from '@strivacity/sdk-core/utils/HttpClient';
7
+ export { DefaultLogging } from '@strivacity/sdk-core/utils/Logging';
7
8
  export { LocalStorage } from '@strivacity/sdk-core/storages/LocalStorage';
8
9
  export { SessionStorage } from '@strivacity/sdk-core/storages/SessionStorage';
9
10
  export { createCredential, getCredential } from '@strivacity/sdk-core/utils/credentials';
10
11
  export { useStrivacity } from './composables';
11
12
  export { StyAuthProvider } from './AuthProvider';
12
13
  export { StyLoginRenderer, NativeFlowContext } from './LoginRenderer';
13
- export * from '@strivacity/sdk-core';
14
- export type * from './types';
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- export*from"@strivacity/sdk-core";import{HttpClient as m}from"@strivacity/sdk-core/utils/HttpClient";import{LocalStorage as a}from"@strivacity/sdk-core/storages/LocalStorage";import{SessionStorage as n}from"@strivacity/sdk-core/storages/SessionStorage";import{createCredential as l,getCredential as d}from"@strivacity/sdk-core/utils/credentials";import{useStrivacity as C}from"./composables.mjs";import{StyAuthProvider as s}from"./AuthProvider.mjs";import{NativeFlowContext as y,StyLoginRenderer as u}from"./LoginRenderer.mjs";import"react";import"react/jsx-runtime";import"@strivacity/sdk-core/utils/object";export{m as HttpClient,a as LocalStorage,y as NativeFlowContext,n as SessionStorage,s as StyAuthProvider,u as StyLoginRenderer,l as createCredential,d as getCredential,C as useStrivacity};
1
+ export*from"@strivacity/sdk-core";import{HttpClient as m}from"@strivacity/sdk-core/utils/HttpClient";import{DefaultLogging as x}from"@strivacity/sdk-core/utils/Logging";import{LocalStorage as n}from"@strivacity/sdk-core/storages/LocalStorage";import{SessionStorage as l}from"@strivacity/sdk-core/storages/SessionStorage";import{createCredential as d,getCredential as C}from"@strivacity/sdk-core/utils/credentials";import{useStrivacity as s}from"./composables.mjs";import{StyAuthProvider as v}from"./AuthProvider.mjs";import{NativeFlowContext as L,StyLoginRenderer as h}from"./LoginRenderer.mjs";import"react";import"react/jsx-runtime";import"@strivacity/sdk-core/utils/object";export{x as DefaultLogging,m as HttpClient,n as LocalStorage,L as NativeFlowContext,l as SessionStorage,v as StyAuthProvider,h as StyLoginRenderer,d as createCredential,C as getCredential,s as useStrivacity};
2
2
  //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strivacity/sdk-next",
3
- "version": "2.1.2",
3
+ "version": "2.3.0",
4
4
  "license": "MIT",
5
5
  "description": "Strivacity Next.js SDK client",
6
6
  "author": "strivacity <opensource@strivacity.com>",
@@ -9,7 +9,7 @@
9
9
  "url": "https://github.com/Strivacity/sdk-js"
10
10
  },
11
11
  "dependencies": {
12
- "@strivacity/sdk-core": "2.1.2"
12
+ "@strivacity/sdk-core": "2.3.0"
13
13
  },
14
14
  "peerDependencies": {
15
15
  "next": ">=13"