@strivacity/sdk-remix 3.0.1 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
+ ## 3.0.3 (2026-08-03)
2
+
3
+ ### 🧱 Updated Dependencies
4
+
5
+ - Updated sdk-core to 3.0.3
6
+
7
+ ## 3.0.2 (2026-05-12)
8
+
9
+ ### 🩹 Fixes
10
+
11
+ - language parameter added to the login renderer component ([c8f18d9](https://github.com/Strivacity/sdk-js/commit/c8f18d9))
12
+
13
+ ### 🧱 Updated Dependencies
14
+
15
+ - Updated sdk-core to 3.0.2
16
+
1
17
  ## 3.0.1 (2026-04-20)
2
18
 
3
19
  ### 🩹 Fixes
package/README.md CHANGED
@@ -263,7 +263,7 @@ export const widgets = {
263
263
 
264
264
  #### Login page example
265
265
 
266
- The login page extracts `session_id` and optionally `language` from the URL on load, cleans up the URL, and passes them to the renderer. When a `session_id` is present the renderer calls `startSession(sessionId)` to resume the existing flow instead of starting a new one. When a `language` parameter is present it overrides `uiLocales` to display the authentication UI in the specified language.
266
+ The login page extracts `session_id` and optionally `language` from the URL on load, cleans up the URL, and passes them to the renderer. When a `session_id` is present the renderer calls `startSession(sessionId)` to resume the existing flow instead of starting a new one. When a `language` parameter is present it is passed to the renderer which uses it for the authentication UI and calls `onLanguageChange` with the resolved language.
267
267
 
268
268
  ```tsx
269
269
  import { useEffect, useState } from 'react';
@@ -274,11 +274,17 @@ import { widgets } from '~/components/widgets';
274
274
  export default function Login() {
275
275
  const navigate = useNavigate();
276
276
  const [sessionId, setSessionId] = useState<string | null>(null);
277
+ const [language, setLanguage] = useState<string | null>(null);
277
278
 
278
279
  useEffect(() => {
279
280
  if (window.location.search !== '') {
280
281
  const url = new URL(window.location.href);
281
282
  setSessionId(url.searchParams.get('session_id'));
283
+
284
+ if (url.searchParams.has('language')) {
285
+ setLanguage(url.searchParams.get('language'));
286
+ }
287
+
282
288
  url.search = '';
283
289
  window.history.replaceState({}, '', url.toString());
284
290
  }
@@ -313,6 +319,8 @@ export default function Login() {
313
319
  <StyLoginRenderer
314
320
  widgets={widgets}
315
321
  sessionId={sessionId}
322
+ language={language}
323
+ onLanguageChange={(lang) => setLanguage(lang)}
316
324
  onFallback={onFallback}
317
325
  onLogin={() => void onLogin()}
318
326
  onError={onError}
@@ -485,6 +493,55 @@ export class MyLogger implements SDKLogging {
485
493
 
486
494
  The `SDKLogging` interface requires `debug`, `info`, `warn`, and `error` methods. The optional `xEventId` property, when set by the SDK, provides a correlation ID to trace related log messages across the authentication flow.
487
495
 
496
+ ## HTTP Client
497
+
498
+ The SDK uses a built-in `fetch`-based HTTP client for all requests. You can replace it with your own implementation by extending `SDKHttpClient` and passing your class via the `httpClient` option. This is useful when you need to attach custom headers (e.g. `x-sty-app-id`) to every outgoing request or route traffic through a proxy.
499
+
500
+ ### Adding custom headers to every request
501
+
502
+ ```tsx
503
+ import { StyAuthProvider, SDKHttpClient, type HttpClientResponse, type SDKOptions } from '@strivacity/sdk-remix';
504
+
505
+ class CustomHttpClient extends SDKHttpClient {
506
+ async request<T>(url: string, options?: RequestInit): Promise<HttpClientResponse<T>> {
507
+ const mergedOptions: RequestInit = {
508
+ ...options,
509
+ headers: {
510
+ 'x-sty-app-id': 'my-app',
511
+ ...(options?.headers as Record<string, string>),
512
+ },
513
+ };
514
+
515
+ const response = await fetch(url, mergedOptions);
516
+
517
+ return {
518
+ headers: response.headers,
519
+ ok: response.ok,
520
+ status: response.status,
521
+ statusText: response.statusText,
522
+ url: response.url,
523
+ json: async () => (await response.json()) as T,
524
+ text: async () => await response.text(),
525
+ };
526
+ }
527
+ }
528
+
529
+ const options: SDKOptions = {
530
+ // ...other options
531
+ httpClient: CustomHttpClient,
532
+ };
533
+ ```
534
+
535
+ Any header you add inside `request()` is automatically included in every SDK request
536
+
537
+ ### CORS configuration
538
+
539
+ For custom request headers to reach the Strivacity cluster, the cluster must be configured to explicitly allow them. Add the header name(s) to the **Access-Control-Allow-Headers** list in the cluster settings. Without this, browsers will block the preflight `OPTIONS` request and the SDK call will fail with a CORS error.
540
+
541
+ ```
542
+ Access-Control-Allow-Headers: x-sty-app-id, <any other custom headers>
543
+ ```
544
+
488
545
  ## API Documentation
489
546
 
490
547
  ### `useStrivacity` hook
@@ -554,6 +611,7 @@ Used in `native` mode to render the authentication UI with your own widget compo
554
611
  - **`params?: NativeParams`**: Additional parameters for the native login flow.
555
612
  - **`widgets?: PartialRecord<WidgetType, React.ComponentType>`**: Custom React components for each widget type used in the flow.
556
613
  - **`sessionId?: string | null`**: Session ID for resuming an existing authentication session.
614
+ - **`language?: string | null`**: Language tag (e.g. `"en-US"`) for the authentication UI. Defaults to `navigator.language`. After the session starts the component calls `onLanguageChange` with the resolved language. See the [Translations](https://docs.strivacity.com/docs/translations) page to learn about language precedence implemented by the product.
557
615
 
558
616
  **Event callbacks**
559
617
 
@@ -562,6 +620,7 @@ Used in `native` mode to render the authentication UI with your own widget compo
562
620
  - **`onError`**: Called when an error occurs during authentication.
563
621
  - **`onGlobalMessage`**: Called when the flow wants to display a global message (e.g. account lockout warning).
564
622
  - **`onBlockReady`**: Called on flow state transitions. Receives `{ previousState: LoginFlowState; state: LoginFlowState }`. Useful for analytics and custom logging.
623
+ - **`onLanguageChange`**: Called after the session starts with the resolved language string.
565
624
 
566
625
  ## Vulnerability Reporting
567
626
 
@@ -1,2 +1,2 @@
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,F]=a.useState({}),E=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]),M=a.useCallback(()=>{l?.()},[l]),N=a.useCallback((t,o,n)=>{x[t]={...x[t],[o]:n===""?null:n},k(s=>({...s,[t]:{...s[t]||{},[o]:n===""?null:n}}))},[]),q=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]}))}),F(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:E,triggerClose:M,setFormValue:N,setMessage:q};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]}))}),F(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:E})):u.loading?a.createElement(u.loading):null})})};exports.NativeFlowContext=z;exports.StyLoginRenderer=V;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=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={},T=({items:U,widgets:b,state:d,triggerFallback:f})=>g.jsx(g.Fragment,{children:U.map((l,p)=>{if(l.type==="widget"){const a=d.forms?.find(m=>m.id===l.formId),c=a?.widgets.find(m=>m.id===l.widgetId);if(!a||!c)return f(void 0,`Unable to find form or widget for item: formId=${l.formId}, widgetId=${l.widgetId}`),null;const w=b[c.type];return w?g.jsx(w,{formId:a.id,config:c},`${a.id}.${c.id}`):(f(void 0,`No component found for widget type ${c.type}`),null)}else if(l.type==="vertical"||l.type==="horizontal"){const a=b.layout;return a?g.jsx(a,{formId:l.items[0].formId,type:l.type,children:g.jsx(T,{items:l.items,widgets:b,state:d,triggerFallback:f})},p):(f(void 0,"No layout component provided"),null)}else return f(void 0,"Unknown item type in layout"),null})}),B=U=>{const{params:b,widgets:d,sessionId:f,language:l,onLogin:p,onFallback:a,onClose:c,onError:w,onGlobalMessage:m,onBlockReady:k,onLanguageChange:$}={params:{},widgets:{},sessionId:null,language:null,...U},{sdk:u}=W.useStrivacity(),C=r.useRef(null),[M,v]=r.useState(!1),[F,S]=r.useState({}),[N,h]=r.useState({}),[e,E]=r.useState({}),R=r.useCallback((t,n)=>{const o=t||e.hostedUrl;if(u.logging?.warn(n?`Triggering fallback due to: ${n}`:"Triggering fallback"),!o){const s=new Error("No hosted URL provided");throw u.logging?.error("Fallback error",s),s}a?.(new x.FallbackError(new URL(o)))},[e,a]),q=r.useCallback(()=>{c?.()},[c]),O=r.useCallback((t,n,o)=>{j[t]={...j[t],[n]:o===""?null:o},S(s=>({...s,[t]:{...s[t]||{},[n]:o===""?null:o}}))},[]),I=r.useCallback((t,n,o)=>{h(s=>({...s,[t]:{...s[t]||{},[n]:o}}))},[]),A=r.useCallback(async t=>{try{v(!0);const n=await C.current?.submitForm(t,V.unflattenObject(j[t]));if(await u.isAuthenticated)p?.(u.idTokenClaims);else{const o=structuredClone(e),s={hostedUrl:n?.hostedUrl??e.hostedUrl,finalizeUrl:n?.finalizeUrl??e.finalizeUrl,screen:n?.screen??e.screen,forms:n?.forms??e.forms,layout:n?.layout??e.layout,messages:n?.messages??{},branding:n?.branding??e.branding};if(s.screen!==e.screen){const i={},y={};for(const L of s.forms??[])i[L.id]={},y[L.id]={};S(i),h(y)}Object.keys(s.messages??{}).forEach(i=>{i==="global"?m?.(s.messages?.global?.text??""):h(y=>({...y,[i]:s.messages[i]}))}),E(s),v(!1),setTimeout(()=>{k?.({previousState:o,state:structuredClone(s)})},1)}}catch(n){n instanceof x.FallbackError?a?.(n):w?.(n)}},[u,b,F,e,p,a,c,w,m,k]),P={loading:M,forms:F,messages:N,state:e,submitForm:A,triggerFallback:R,triggerClose:q,setFormValue:O,setMessage:I};return r.useEffect(()=>{C.current=u.login(b),(async()=>{try{const t=await C.current?.startSession(f,l),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??{},branding:t?.branding??e.branding};if($?.(C.current?.language??null),await u.isAuthenticated)p?.(u.idTokenClaims);else{if(o.screen!==e.screen){const s={},i={};for(const y of o.forms??[])s[y.id]={},i[y.id]={};S(s),h(i)}else u.logging?.info(`Updating screen: ${o.screen}`);Object.keys(o.messages??{}).forEach(s=>{s==="global"?m?.(o.messages?.global?.text??""):h(i=>({...i,[s]:o.messages[s]}))}),E(o),setTimeout(()=>{k?.({previousState:n,state:structuredClone(o)})},1)}}catch(t){t instanceof x.FallbackError?a?.(t):w?.(t)}})()},[]),g.jsx(z.Provider,{value:P,children:g.jsx("div",{className:"login-renderer",children:e.screen&&d.layout?r.createElement(d.layout,{formId:e.layout?.items?.[0]?.formId,type:e.layout?.type,tag:"form"},g.jsx(T,{items:e.layout?.items??[],widgets:d,state:e,triggerFallback:R})):d.loading?r.createElement(d.loading):null})})};exports.NativeFlowContext=z;exports.StyLoginRenderer=B;
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, 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","React"],"mappings":"wPAQaA,EAAoBC,EAAAA,cAA6C,IAAI,EAC5EC,EAAoD,CAAA,EAEpDC,EAKD,CAAC,CAAE,MAAAC,EAAO,QAAAC,EAAS,MAAAC,EAAO,gBAAAC,KAE7BC,EAAAA,IAAAC,EAAAA,SAAA,CACE,SAAAL,EAAM,IAAI,CAACM,EAAMC,IAAQ,CACzB,GAAID,EAAK,OAAS,SAAU,CAC3B,MAAME,EAAON,EAAM,OAAO,KAAMO,GAAMA,EAAE,KAAOH,EAAK,MAAM,EACpDI,EAASF,GAAM,QAAQ,KAAMG,GAAMA,EAAE,KAAOL,EAAK,QAAQ,EAE/D,GAAI,CAACE,GAAQ,CAACE,EACb,OAAAP,EAAgB,OAAW,kDAAkDG,EAAK,MAAM,cAAcA,EAAK,QAAQ,EAAE,EAC9G,KAGR,MAAMM,EAAkBX,EAAQS,EAAO,IAAI,EAE3C,OAAKE,EAKER,EAAAA,IAACQ,EAAA,CAAgD,OAAQJ,EAAK,GAAI,OAAQE,CAAA,EAApD,GAAGF,EAAK,EAAE,IAAIE,EAAO,EAAE,EAAqC,GAJxFP,EAAgB,OAAW,sCAAsCO,EAAO,IAAI,EAAE,EACvE,KAIT,SAAWJ,EAAK,OAAS,YAAcA,EAAK,OAAS,aAAc,CAClE,MAAMO,EAAkBZ,EAAQ,OAEhC,OAAKY,EAMJT,MAACS,GAA0B,OAASP,EAAK,MAAM,CAAC,EAAa,OAAQ,KAAMA,EAAK,KAC/E,SAAAF,EAAAA,IAACL,EAAA,CAAkB,MAAOO,EAAK,MAAO,QAAAL,EAAkB,MAAAC,EAAc,gBAAAC,EAAkC,GADnFI,CAEtB,GAPAJ,EAAgB,OAAW,8BAA8B,EAClD,KAQT,KACC,QAAAA,EAAgB,OAAW,6BAA6B,EACjD,IAET,CAAC,CAAA,CACF,EAIWW,EAUPC,GAAU,CACf,KAAM,CAAE,OAAAC,EAAQ,QAAAf,EAAS,UAAAgB,EAAW,QAAAC,EAAS,WAAAC,EAAY,QAAAC,EAAS,QAAAC,EAAS,gBAAAC,EAAiB,aAAAC,GAAiB,CAC5G,OAAQ,CAAA,EACR,QAAS,CAAA,EACT,UAAW,KACX,GAAGR,CAAA,EAEE,CAAE,IAAAS,CAAA,EAAQC,gBAAA,EACVC,EAAkBC,EAAAA,OAAiD,IAAI,EAEvE,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAK,EACtC,CAACC,EAAOC,CAAQ,EAAIF,EAAAA,SAAkD,CAAA,CAAE,EACxE,CAACG,EAAUC,CAAW,EAAIJ,EAAAA,SAA2D,CAAA,CAAE,EACvF,CAAC5B,EAAOiC,CAAQ,EAAIL,EAAAA,SAAyB,CAAA,CAAE,EAE/C3B,EAAkBiC,EAAAA,YACvB,CAACC,EAAoBC,IAAqB,CACzC,MAAMC,EAAMF,GAAanC,EAAM,UAI/B,GAFAsB,EAAI,SAAS,KAAKc,EAAU,+BAA+BA,CAAO,GAAK,qBAAqB,EAExF,CAACC,EAAK,CACT,MAAMC,EAAQ,IAAI,MAAM,wBAAwB,EAChD,MAAAhB,EAAI,SAAS,MAAM,iBAAkBgB,CAAK,EACpCA,CACP,CAEArB,IAAa,IAAIsB,EAAAA,cAAc,IAAI,IAAIF,CAAG,CAAC,CAAC,CAC7C,EACA,CAACrC,EAAOiB,CAAU,CAAA,EAGbuB,EAAeN,EAAAA,YAAY,IAAM,CACtChB,IAAA,CACD,EAAG,CAACA,CAAO,CAAC,EAENuB,EAAeP,EAAAA,YAAY,CAACQ,EAAgBC,EAAkBC,IAAmB,CACtFhD,EAAS8C,CAAM,EAAI,CAClB,GAAG9C,EAAS8C,CAAM,EAClB,CAACC,CAAQ,EAAGC,IAAU,GAAK,KAAOA,CAAA,EAGnCd,EAAUe,IAAU,CACnB,GAAGA,EACH,CAACH,CAAM,EAAG,CAAE,GAAIG,EAAKH,CAAM,GAAK,GAAK,CAACC,CAAQ,EAAGC,IAAU,GAAK,KAAOA,CAAA,CAAM,EAC5E,CACH,EAAG,CAAA,CAAE,EAECE,EAAaZ,EAAAA,YAAY,CAACQ,EAAgBC,EAAkBC,IAA4B,CAC7FZ,EAAaa,IAAU,CACtB,GAAGA,EACH,CAACH,CAAM,EAAG,CAAE,GAAIG,EAAKH,CAAM,GAAK,CAAA,EAAK,CAACC,CAAQ,EAAGC,CAAA,CAAM,EACtD,CACH,EAAG,CAAA,CAAE,EAECG,EAAab,EAAAA,YAClB,MAAOQ,GAAmB,CACzB,GAAI,CACHf,EAAW,EAAI,EAEf,MAAMqB,EAAO,MAAMxB,EAAgB,SAAS,WAAWkB,EAAQO,kBAAgBrD,EAAS8C,CAAM,CAAC,CAAC,EAEhG,GAAI,MAAMpB,EAAI,gBACbN,IAAUM,EAAI,aAAa,MACrB,CACN,MAAM4B,EAAgB,gBAAgBlD,CAAK,EACrCmD,EAA2B,CAChC,UAAWH,GAAM,WAAahD,EAAM,UACpC,YAAagD,GAAM,aAAehD,EAAM,YACxC,OAAQgD,GAAM,QAAUhD,EAAM,OAC9B,MAAOgD,GAAM,OAAShD,EAAM,MAC5B,OAAQgD,GAAM,QAAUhD,EAAM,OAC9B,SAAUgD,GAAM,UAAY,CAAA,EAC5B,SAAUA,GAAM,UAAYhD,EAAM,QAAA,EAGnC,GAAImD,EAAS,SAAWnD,EAAM,OAAQ,CACrC,MAAMoD,EAAyB,CAAA,EACzBC,EAA+B,CAAA,EAErC,UAAW/C,KAAQ6C,EAAS,OAAS,CAAA,EACpCC,EAAS9C,EAAK,EAAE,EAAI,CAAA,EACpB+C,EAAY/C,EAAK,EAAE,EAAI,CAAA,EAGxBwB,EAASsB,CAAQ,EACjBpB,EAAYqB,CAAW,CACxB,CAEA,OAAO,KAAKF,EAAS,UAAY,CAAA,CAAE,EAAE,QAAST,GAAW,CACpDA,IAAW,SACdtB,IAAkB+B,EAAS,UAAU,QAAQ,MAAQ,EAAE,EAEvDnB,EAAaa,IAAU,CACtB,GAAGA,EACH,CAACH,CAAM,EAAGS,EAAS,SAAUT,CAAM,CAAA,EAClC,CAEJ,CAAC,EAEDT,EAASkB,CAAQ,EACjBxB,EAAW,EAAK,EAEhB,WAAW,IAAM,CAChBN,IAAe,CAAE,cAAA6B,EAAe,MAAO,gBAAgBC,CAAQ,EAAG,CACnE,EAAG,CAAC,CACL,CACD,OAASb,EAAO,CACXA,aAAiBC,EAAAA,cACpBtB,IAAaqB,CAAK,EAElBnB,IAAUmB,CAAK,CAEjB,CACD,EACA,CAAChB,EAAKR,EAAQe,EAAO7B,EAAOgB,EAASC,EAAYC,EAASC,EAASC,EAAiBC,CAAY,CAAA,EAG3FiC,EAAuC,CAC5C,QAAA5B,EACA,MAAAG,EACA,SAAAE,EACA,MAAA/B,EACA,WAAA+C,EACA,gBAAA9C,EACA,aAAAuC,EACA,aAAAC,EACA,WAAAK,CAAA,EAGDS,OAAAA,EAAAA,UAAU,IAAM,CACf/B,EAAgB,QAAUF,EAAI,MAAMR,CAAM,GAEpC,SAAY,CACjB,GAAI,CACH,MAAMkC,EAAO,MAAMxB,EAAgB,SAAS,aAAaT,CAAS,EAC5DmC,EAAgB,gBAAgBlD,CAAK,EACrCmD,EAA2B,CAChC,UAAWH,GAAM,WAAahD,EAAM,UACpC,YAAagD,GAAM,aAAehD,EAAM,YACxC,OAAQgD,GAAM,QAAUhD,EAAM,OAC9B,MAAOgD,GAAM,OAAShD,EAAM,MAC5B,OAAQgD,GAAM,QAAUhD,EAAM,OAC9B,SAAUgD,GAAM,UAAY,CAAA,EAC5B,SAAUA,GAAM,UAAYhD,EAAM,QAAA,EAGnC,GAAI,MAAMsB,EAAI,gBACbN,IAAUM,EAAI,aAAa,MACrB,CACN,GAAI6B,EAAS,SAAWnD,EAAM,OAAQ,CACrC,MAAMoD,EAAyB,CAAA,EACzBC,EAA+B,CAAA,EAErC,UAAW/C,KAAQ6C,EAAS,OAAS,CAAA,EACpCC,EAAS9C,EAAK,EAAE,EAAI,CAAA,EACpB+C,EAAY/C,EAAK,EAAE,EAAI,CAAA,EAGxBwB,EAASsB,CAAQ,EACjBpB,EAAYqB,CAAW,CACxB,MACC/B,EAAI,SAAS,KAAK,oBAAoB6B,EAAS,MAAM,EAAE,EAGxD,OAAO,KAAKA,EAAS,UAAY,CAAA,CAAE,EAAE,QAAST,GAAW,CACpDA,IAAW,SACdtB,IAAkB+B,EAAS,UAAU,QAAQ,MAAQ,EAAE,EAEvDnB,EAAaa,IAAU,CACtB,GAAGA,EACH,CAACH,CAAM,EAAGS,EAAS,SAAUT,CAAM,CAAA,EAClC,CAEJ,CAAC,EAEDT,EAASkB,CAAQ,EAEjB,WAAW,IAAM,CAChB9B,IAAe,CAAE,cAAA6B,EAAe,MAAO,gBAAgBC,CAAQ,EAAG,CACnE,EAAG,CAAC,CACL,CACD,OAASb,EAAO,CACXA,aAAiBC,EAAAA,cACpBtB,IAAaqB,CAAK,EAElBnB,IAAUmB,CAAK,CAEjB,CACD,GAAA,CACD,EAAG,CAAA,CAAE,EAGJpC,EAAAA,IAACR,EAAkB,SAAlB,CAA2B,MAAO4D,EAClC,SAAApD,MAAC,MAAA,CAAI,UAAU,iBACb,SAAAF,EAAM,QAAUD,EAAQ,OACtByD,EAAM,cACNzD,EAAQ,OACR,CACC,OAASC,EAAM,QAAQ,QAAQ,CAAC,GAAc,OAC9C,KAAMA,EAAM,QAAQ,KACpB,IAAK,MAAA,EAENE,EAAAA,IAACL,EAAA,CAAkB,MAAOG,EAAM,QAAQ,OAAS,GAAI,QAAAD,EAAkB,MAAAC,EAAc,gBAAAC,CAAA,CAAkC,CAAA,EAEvHF,EAAQ,QACPyD,EAAM,cAAczD,EAAQ,OAAO,EACnC,IAAA,CACL,EACD,CAEF"}
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\tlanguage?: 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\tonLanguageChange?: (language: string | null) => void;\n}> = (props) => {\n\tconst { params, widgets, sessionId, language, onLogin, onFallback, onClose, onError, onGlobalMessage, onBlockReady, onLanguageChange } = {\n\t\tparams: {},\n\t\twidgets: {},\n\t\tsessionId: null,\n\t\tlanguage: 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, language);\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\tonLanguageChange?.(loginHandlerRef.current?.language ?? null);\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","language","onLogin","onFallback","onClose","onError","onGlobalMessage","onBlockReady","onLanguageChange","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","React"],"mappings":"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"}
@@ -6,6 +6,7 @@ export declare const StyLoginRenderer: React.FC<{
6
6
  params?: NativeParams;
7
7
  widgets?: PartialRecord<WidgetType, React.ComponentType<any>>;
8
8
  sessionId?: string | null;
9
+ language?: string | null;
9
10
  onLogin?: (claims?: IdTokenClaims | null) => void;
10
11
  onFallback?: (error: FallbackError) => void;
11
12
  onClose?: () => void;
@@ -15,4 +16,5 @@ export declare const StyLoginRenderer: React.FC<{
15
16
  previousState: LoginFlowState;
16
17
  state: LoginFlowState;
17
18
  }) => void;
19
+ onLanguageChange?: (language: string | null) => void;
18
20
  }>;
@@ -1,2 +1,2 @@
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),[M,F]=U(!1),[R,v]=U({}),[N,b]=U({}),[e,x]=U({}),z=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]),j=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{F(!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]}))}),x(s),F(!1),setTimeout(()=>{g?.({previousState:n,state:structuredClone(s)})},1)}}catch(o){o instanceof S?u?.(o):l?.(o)}},[c,p,R,e,r,u,a,l,w,g]),V={loading:M,forms:R,messages:N,state:e,submitForm:A,triggerFallback:z,triggerClose:j,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]}))}),x(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:z})):d.loading?L.createElement(d.loading):null})})};export{q as NativeFlowContext,Z as StyLoginRenderer};
1
+ import{jsx as m,Fragment as D}from"react/jsx-runtime";import T,{createContext as G,useRef as H,useState as C,useCallback as b,useEffect as P}from"react";import{FallbackError as E}from"@strivacity/sdk-core";import{unflattenObject as q}from"@strivacity/sdk-core/utils/object";import{useStrivacity as J}from"./composables.mjs";const K=G(null),F={},M=({items:k,widgets:y,state:d,triggerFallback:u})=>m(D,{children:k.map((a,w)=>{if(a.type==="widget"){const r=d.forms?.find(g=>g.id===a.formId),i=r?.widgets.find(g=>g.id===a.widgetId);if(!r||!i)return u(void 0,`Unable to find form or widget for item: formId=${a.formId}, widgetId=${a.widgetId}`),null;const p=y[i.type];return p?m(p,{formId:r.id,config:i},`${r.id}.${i.id}`):(u(void 0,`No component found for widget type ${i.type}`),null)}else if(a.type==="vertical"||a.type==="horizontal"){const r=y.layout;return r?m(r,{formId:a.items[0].formId,type:a.type,children:m(M,{items:a.items,widgets:y,state:d,triggerFallback:u})},w):(u(void 0,"No layout component provided"),null)}else return u(void 0,"Unknown item type in layout"),null})}),ee=k=>{const{params:y,widgets:d,sessionId:u,language:a,onLogin:w,onFallback:r,onClose:i,onError:p,onGlobalMessage:g,onBlockReady:v,onLanguageChange:N}={params:{},widgets:{},sessionId:null,language:null,...k},{sdk:c}=J(),U=H(null),[j,R]=C(!1),[x,S]=C({}),[I,h]=C({}),[e,z]=C({}),L=b((t,s)=>{const n=t||e.hostedUrl;if(c.logging?.warn(s?`Triggering fallback due to: ${s}`:"Triggering fallback"),!n){const o=new Error("No hosted URL provided");throw c.logging?.error("Fallback error",o),o}r?.(new E(new URL(n)))},[e,r]),O=b(()=>{i?.()},[i]),A=b((t,s,n)=>{F[t]={...F[t],[s]:n===""?null:n},S(o=>({...o,[t]:{...o[t]||{},[s]:n===""?null:n}}))},[]),V=b((t,s,n)=>{h(o=>({...o,[t]:{...o[t]||{},[s]:n}}))},[]),W=b(async t=>{try{R(!0);const s=await U.current?.submitForm(t,q(F[t]));if(await c.isAuthenticated)w?.(c.idTokenClaims);else{const n=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??{},branding:s?.branding??e.branding};if(o.screen!==e.screen){const l={},f={};for(const $ of o.forms??[])l[$.id]={},f[$.id]={};S(l),h(f)}Object.keys(o.messages??{}).forEach(l=>{l==="global"?g?.(o.messages?.global?.text??""):h(f=>({...f,[l]:o.messages[l]}))}),z(o),R(!1),setTimeout(()=>{v?.({previousState:n,state:structuredClone(o)})},1)}}catch(s){s instanceof E?r?.(s):p?.(s)}},[c,y,x,e,w,r,i,p,g,v]),B={loading:j,forms:x,messages:I,state:e,submitForm:W,triggerFallback:L,triggerClose:O,setFormValue:A,setMessage:V};return P(()=>{U.current=c.login(y),(async()=>{try{const t=await U.current?.startSession(u,a),s=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(N?.(U.current?.language??null),await c.isAuthenticated)w?.(c.idTokenClaims);else{if(n.screen!==e.screen){const o={},l={};for(const f of n.forms??[])o[f.id]={},l[f.id]={};S(o),h(l)}else c.logging?.info(`Updating screen: ${n.screen}`);Object.keys(n.messages??{}).forEach(o=>{o==="global"?g?.(n.messages?.global?.text??""):h(l=>({...l,[o]:n.messages[o]}))}),z(n),setTimeout(()=>{v?.({previousState:s,state:structuredClone(n)})},1)}}catch(t){t instanceof E?r?.(t):p?.(t)}})()},[]),m(K.Provider,{value:B,children:m("div",{className:"login-renderer",children:e.screen&&d.layout?T.createElement(d.layout,{formId:e.layout?.items?.[0]?.formId,type:e.layout?.type,tag:"form"},m(M,{items:e.layout?.items??[],widgets:d,state:e,triggerFallback:L})):d.loading?T.createElement(d.loading):null})})};export{K as NativeFlowContext,ee 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, 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","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\tlanguage?: 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\tonLanguageChange?: (language: string | null) => void;\n}> = (props) => {\n\tconst { params, widgets, sessionId, language, onLogin, onFallback, onClose, onError, onGlobalMessage, onBlockReady, onLanguageChange } = {\n\t\tparams: {},\n\t\twidgets: {},\n\t\tsessionId: null,\n\t\tlanguage: 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, language);\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\tonLanguageChange?.(loginHandlerRef.current?.language ?? null);\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","language","onLogin","onFallback","onClose","onError","onGlobalMessage","onBlockReady","onLanguageChange","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","React"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strivacity/sdk-remix",
3
- "version": "3.0.1",
3
+ "version": "3.0.3",
4
4
  "license": "MIT",
5
5
  "description": "Strivacity Remix 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": "3.0.1"
12
+ "@strivacity/sdk-core": "3.0.3"
13
13
  },
14
14
  "peerDependencies": {
15
15
  "react": ">=18"