@thunderid/react 1.14.0 → 1.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. package/dist/ThunderIDReactClient.d.ts.map +1 -1
  2. package/dist/ThunderIDReactClient.js +7 -3
  3. package/dist/ThunderIDReactClient.js.map +1 -1
  4. package/dist/api/account/getAccessibleOrganizationUnits.d.ts +27 -0
  5. package/dist/api/account/getAccessibleOrganizationUnits.d.ts.map +1 -0
  6. package/dist/api/account/getAccessibleOrganizationUnits.js +24 -0
  7. package/dist/api/account/getAccessibleOrganizationUnits.js.map +1 -0
  8. package/dist/cjs/ThunderIDReactClient.cjs +7 -3
  9. package/dist/cjs/ThunderIDReactClient.cjs.map +1 -1
  10. package/dist/cjs/api/account/getAccessibleOrganizationUnits.cjs +26 -0
  11. package/dist/cjs/api/account/getAccessibleOrganizationUnits.cjs.map +1 -0
  12. package/dist/cjs/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.cjs +214 -0
  13. package/dist/cjs/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.cjs.map +1 -0
  14. package/dist/cjs/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.styles.cjs +184 -0
  15. package/dist/cjs/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.styles.cjs.map +1 -0
  16. package/dist/cjs/components/account/OrganizationUnitSwitcher/OrganizationUnitSwitcher.cjs +139 -0
  17. package/dist/cjs/components/account/OrganizationUnitSwitcher/OrganizationUnitSwitcher.cjs.map +1 -0
  18. package/dist/cjs/components/auth/Callback/TokenCallback.cjs +3 -3
  19. package/dist/cjs/components/auth/Callback/TokenCallback.cjs.map +1 -1
  20. package/dist/cjs/components/auth/SignIn/SignIn.cjs +49 -44
  21. package/dist/cjs/components/auth/SignIn/SignIn.cjs.map +1 -1
  22. package/dist/cjs/components/auth/SignUp/BaseSignUp.cjs +13 -9
  23. package/dist/cjs/components/auth/SignUp/BaseSignUp.cjs.map +1 -1
  24. package/dist/cjs/components/auth/flow/AuthOptionFactory.cjs +2 -2
  25. package/dist/cjs/components/auth/flow/AuthOptionFactory.cjs.map +1 -1
  26. package/dist/cjs/components/common/LanguageSwitcher/BaseLanguageSwitcher.cjs +1 -1
  27. package/dist/cjs/components/{admin → management}/AgentCreate/AgentCreate.cjs +8 -7
  28. package/dist/cjs/components/management/AgentCreate/AgentCreate.cjs.map +1 -0
  29. package/dist/cjs/components/{admin → management}/AgentCreate/BaseAgentCreate.cjs +1 -1
  30. package/dist/cjs/components/management/AgentCreate/BaseAgentCreate.cjs.map +1 -0
  31. package/dist/cjs/components/{admin → management}/AgentDetails/AgentDetails.cjs +1 -1
  32. package/dist/cjs/components/management/AgentDetails/AgentDetails.cjs.map +1 -0
  33. package/dist/cjs/components/{admin → management}/AgentDetails/BaseAgentDetails.cjs +1 -1
  34. package/dist/cjs/components/management/AgentDetails/BaseAgentDetails.cjs.map +1 -0
  35. package/dist/cjs/components/{admin → management}/AgentList/AgentList.cjs +11 -6
  36. package/dist/cjs/components/management/AgentList/AgentList.cjs.map +1 -0
  37. package/dist/cjs/components/{admin → management}/AgentList/BaseAgentList.cjs +1 -1
  38. package/dist/cjs/components/management/AgentList/BaseAgentList.cjs.map +1 -0
  39. package/dist/cjs/components/{admin → management}/ApplicationCreate/ApplicationCreate.cjs +10 -5
  40. package/dist/cjs/components/management/ApplicationCreate/ApplicationCreate.cjs.map +1 -0
  41. package/dist/cjs/components/{admin → management}/ApplicationCreate/BaseApplicationCreate.cjs +1 -1
  42. package/dist/cjs/components/management/ApplicationCreate/BaseApplicationCreate.cjs.map +1 -0
  43. package/dist/cjs/components/{admin → management}/ApplicationDetails/ApplicationDetails.cjs +1 -1
  44. package/dist/cjs/components/management/ApplicationDetails/ApplicationDetails.cjs.map +1 -0
  45. package/dist/cjs/components/{admin → management}/ApplicationDetails/BaseApplicationDetails.cjs +1 -1
  46. package/dist/cjs/components/management/ApplicationDetails/BaseApplicationDetails.cjs.map +1 -0
  47. package/dist/cjs/components/{admin → management}/ApplicationList/ApplicationList.cjs +9 -4
  48. package/dist/cjs/components/management/ApplicationList/ApplicationList.cjs.map +1 -0
  49. package/dist/cjs/components/{admin → management}/ApplicationList/BaseApplicationList.cjs +1 -1
  50. package/dist/cjs/components/management/ApplicationList/BaseApplicationList.cjs.map +1 -0
  51. package/dist/cjs/components/{admin → management}/GroupCreate/BaseGroupCreate.cjs +1 -1
  52. package/dist/cjs/components/management/GroupCreate/BaseGroupCreate.cjs.map +1 -0
  53. package/dist/cjs/components/{admin → management}/GroupCreate/GroupCreate.cjs +1 -1
  54. package/dist/cjs/components/management/GroupCreate/GroupCreate.cjs.map +1 -0
  55. package/dist/cjs/components/management/GroupDetails/BaseGroupDetails.cjs +86 -0
  56. package/dist/cjs/components/management/GroupDetails/BaseGroupDetails.cjs.map +1 -0
  57. package/dist/cjs/components/management/GroupDetails/GroupDetails.cjs +60 -0
  58. package/dist/cjs/components/management/GroupDetails/GroupDetails.cjs.map +1 -0
  59. package/dist/cjs/components/{admin → management}/GroupList/BaseGroupList.cjs +1 -1
  60. package/dist/cjs/components/management/GroupList/BaseGroupList.cjs.map +1 -0
  61. package/dist/cjs/components/{admin → management}/GroupList/GroupList.cjs +1 -1
  62. package/dist/cjs/components/management/GroupList/GroupList.cjs.map +1 -0
  63. package/dist/cjs/components/{admin → management}/GroupMembers/BaseGroupMembers.cjs +1 -1
  64. package/dist/cjs/components/management/GroupMembers/BaseGroupMembers.cjs.map +1 -0
  65. package/dist/cjs/components/{admin → management}/GroupMembers/GroupMembers.cjs +1 -1
  66. package/dist/cjs/components/management/GroupMembers/GroupMembers.cjs.map +1 -0
  67. package/dist/cjs/components/management/OrganizationUnitCreate/BaseOrganizationUnitCreate.cjs +140 -0
  68. package/dist/cjs/components/management/OrganizationUnitCreate/BaseOrganizationUnitCreate.cjs.map +1 -0
  69. package/dist/cjs/components/management/OrganizationUnitCreate/OrganizationUnitCreate.cjs +83 -0
  70. package/dist/cjs/components/management/OrganizationUnitCreate/OrganizationUnitCreate.cjs.map +1 -0
  71. package/dist/cjs/components/management/OrganizationUnitDetails/BaseOrganizationUnitDetails.cjs +276 -0
  72. package/dist/cjs/components/management/OrganizationUnitDetails/BaseOrganizationUnitDetails.cjs.map +1 -0
  73. package/dist/cjs/components/management/OrganizationUnitDetails/OrganizationUnitDetails.cjs +142 -0
  74. package/dist/cjs/components/management/OrganizationUnitDetails/OrganizationUnitDetails.cjs.map +1 -0
  75. package/dist/cjs/components/management/OrganizationUnitList/BaseOrganizationUnitList.cjs +78 -0
  76. package/dist/cjs/components/management/OrganizationUnitList/BaseOrganizationUnitList.cjs.map +1 -0
  77. package/dist/cjs/components/management/OrganizationUnitList/OrganizationUnitList.cjs +69 -0
  78. package/dist/cjs/components/management/OrganizationUnitList/OrganizationUnitList.cjs.map +1 -0
  79. package/dist/cjs/components/management/ProjectCreate/BaseProjectCreate.cjs +116 -0
  80. package/dist/cjs/components/management/ProjectCreate/BaseProjectCreate.cjs.map +1 -0
  81. package/dist/cjs/components/management/ProjectCreate/ProjectCreate.cjs +43 -0
  82. package/dist/cjs/components/management/ProjectCreate/ProjectCreate.cjs.map +1 -0
  83. package/dist/cjs/components/management/ProjectDetails/BaseProjectDetails.cjs +172 -0
  84. package/dist/cjs/components/management/ProjectDetails/BaseProjectDetails.cjs.map +1 -0
  85. package/dist/cjs/components/management/ProjectDetails/ProjectDetails.cjs +68 -0
  86. package/dist/cjs/components/management/ProjectDetails/ProjectDetails.cjs.map +1 -0
  87. package/dist/cjs/components/management/ProjectList/BaseProjectList.cjs +78 -0
  88. package/dist/cjs/components/management/ProjectList/BaseProjectList.cjs.map +1 -0
  89. package/dist/cjs/components/management/ProjectList/ProjectList.cjs +51 -0
  90. package/dist/cjs/components/management/ProjectList/ProjectList.cjs.map +1 -0
  91. package/dist/cjs/components/management/ProjectSwitcher/BaseProjectSwitcher.cjs +58 -0
  92. package/dist/cjs/components/management/ProjectSwitcher/BaseProjectSwitcher.cjs.map +1 -0
  93. package/dist/cjs/components/management/ProjectSwitcher/ProjectSwitcher.cjs +72 -0
  94. package/dist/cjs/components/management/ProjectSwitcher/ProjectSwitcher.cjs.map +1 -0
  95. package/dist/cjs/components/{admin → management}/RoleAssignments/BaseRoleAssignments.cjs +1 -1
  96. package/dist/cjs/components/management/RoleAssignments/BaseRoleAssignments.cjs.map +1 -0
  97. package/dist/cjs/components/{admin → management}/RoleAssignments/RoleAssignments.cjs +1 -1
  98. package/dist/cjs/components/management/RoleAssignments/RoleAssignments.cjs.map +1 -0
  99. package/dist/cjs/components/{admin → management}/RoleCreate/BaseRoleCreate.cjs +1 -1
  100. package/dist/cjs/components/management/RoleCreate/BaseRoleCreate.cjs.map +1 -0
  101. package/dist/cjs/components/{admin → management}/RoleCreate/RoleCreate.cjs +1 -1
  102. package/dist/cjs/components/management/RoleCreate/RoleCreate.cjs.map +1 -0
  103. package/dist/cjs/components/management/RoleDetails/BaseRoleDetails.cjs +87 -0
  104. package/dist/cjs/components/management/RoleDetails/BaseRoleDetails.cjs.map +1 -0
  105. package/dist/cjs/components/management/RoleDetails/RoleDetails.cjs +68 -0
  106. package/dist/cjs/components/management/RoleDetails/RoleDetails.cjs.map +1 -0
  107. package/dist/cjs/components/{admin → management}/RoleList/BaseRoleList.cjs +1 -1
  108. package/dist/cjs/components/management/RoleList/BaseRoleList.cjs.map +1 -0
  109. package/dist/cjs/components/{admin → management}/RoleList/RoleList.cjs +1 -1
  110. package/dist/cjs/components/management/RoleList/RoleList.cjs.map +1 -0
  111. package/dist/cjs/components/management/RolePermissions/BaseRolePermissions.cjs +181 -0
  112. package/dist/cjs/components/management/RolePermissions/BaseRolePermissions.cjs.map +1 -0
  113. package/dist/cjs/components/management/RolePermissions/RolePermissions.cjs +112 -0
  114. package/dist/cjs/components/management/RolePermissions/RolePermissions.cjs.map +1 -0
  115. package/dist/cjs/components/management/SharingPolicies/BaseSharingPolicies.cjs +308 -0
  116. package/dist/cjs/components/management/SharingPolicies/BaseSharingPolicies.cjs.map +1 -0
  117. package/dist/cjs/components/management/SharingPolicies/SharingPolicies.cjs +126 -0
  118. package/dist/cjs/components/management/SharingPolicies/SharingPolicies.cjs.map +1 -0
  119. package/dist/cjs/components/{admin → management}/UserCreate/BaseUserCreate.cjs +1 -1
  120. package/dist/cjs/components/management/UserCreate/BaseUserCreate.cjs.map +1 -0
  121. package/dist/cjs/components/{admin → management}/UserCreate/UserCreate.cjs +1 -1
  122. package/dist/cjs/components/management/UserCreate/UserCreate.cjs.map +1 -0
  123. package/dist/cjs/components/{admin → management}/UserCreate/userCreateFields.cjs +1 -1
  124. package/dist/cjs/components/management/UserCreate/userCreateFields.cjs.map +1 -0
  125. package/dist/cjs/components/{admin → management}/UserDetails/BaseUserDetails.cjs +1 -1
  126. package/dist/cjs/components/management/UserDetails/BaseUserDetails.cjs.map +1 -0
  127. package/dist/cjs/components/{admin → management}/UserDetails/UserDetails.cjs +1 -1
  128. package/dist/cjs/components/management/UserDetails/UserDetails.cjs.map +1 -0
  129. package/dist/cjs/components/{admin → management}/UserList/BaseUserList.cjs +1 -1
  130. package/dist/cjs/components/management/UserList/BaseUserList.cjs.map +1 -0
  131. package/dist/cjs/components/{admin → management}/UserList/UserList.cjs +1 -1
  132. package/dist/cjs/components/management/UserList/UserList.cjs.map +1 -0
  133. package/dist/cjs/components/{admin → management}/shared/AccountLifecycleParts.cjs +1 -1
  134. package/dist/cjs/components/management/shared/AccountLifecycleParts.cjs.map +1 -0
  135. package/dist/cjs/components/{admin → management}/shared/AdminParts.cjs +1 -1
  136. package/dist/cjs/components/management/shared/AdminParts.cjs.map +1 -0
  137. package/dist/cjs/components/{admin → management}/shared/AdminParts.styles.cjs +1 -1
  138. package/dist/cjs/components/management/shared/AdminParts.styles.cjs.map +1 -0
  139. package/dist/cjs/components/{admin → management}/shared/AdminSearch.cjs +1 -1
  140. package/dist/cjs/components/management/shared/AdminSearch.cjs.map +1 -0
  141. package/dist/cjs/components/{admin → management}/shared/AdminSection.cjs +1 -1
  142. package/dist/cjs/components/management/shared/AdminSection.cjs.map +1 -0
  143. package/dist/cjs/components/{admin → management}/shared/AdminSection.styles.cjs +1 -1
  144. package/dist/cjs/components/management/shared/AdminSection.styles.cjs.map +1 -0
  145. package/dist/cjs/components/{admin → management}/shared/ApplicationFormFields.cjs +1 -1
  146. package/dist/cjs/components/management/shared/ApplicationFormFields.cjs.map +1 -0
  147. package/dist/cjs/components/{admin → management}/shared/ClientSecretNotice.cjs +1 -1
  148. package/dist/cjs/components/management/shared/ClientSecretNotice.cjs.map +1 -0
  149. package/dist/cjs/components/{admin → management}/shared/IdentityPicker.cjs +1 -1
  150. package/dist/cjs/components/management/shared/IdentityPicker.cjs.map +1 -0
  151. package/dist/cjs/components/management/shared/formatTimestamp.cjs +18 -0
  152. package/dist/cjs/components/management/shared/formatTimestamp.cjs.map +1 -0
  153. package/dist/cjs/components/{admin → management}/shared/useAdminPartStyles.cjs +1 -1
  154. package/dist/cjs/components/management/shared/useAdminPartStyles.cjs.map +1 -0
  155. package/dist/cjs/components/{admin → management}/shared/useDefaultOuId.cjs +1 -1
  156. package/dist/cjs/components/management/shared/useDefaultOuId.cjs.map +1 -0
  157. package/dist/cjs/components/management/shared/useProjectPlacement.cjs +23 -0
  158. package/dist/cjs/components/management/shared/useProjectPlacement.cjs.map +1 -0
  159. package/dist/cjs/contexts/ThunderID/ThunderIDContext.cjs +5 -0
  160. package/dist/cjs/contexts/ThunderID/ThunderIDContext.cjs.map +1 -1
  161. package/dist/cjs/contexts/ThunderID/ThunderIDProvider.cjs +27 -1
  162. package/dist/cjs/contexts/ThunderID/ThunderIDProvider.cjs.map +1 -1
  163. package/dist/cjs/contexts/ThunderID/useCurrentProjectState.cjs +33 -0
  164. package/dist/cjs/contexts/ThunderID/useCurrentProjectState.cjs.map +1 -0
  165. package/dist/cjs/hooks/management/useManagementEndpoint.cjs.map +1 -1
  166. package/dist/cjs/index.cjs +377 -33
  167. package/dist/cjs/utils/flowTransformer.cjs +9 -0
  168. package/dist/cjs/utils/flowTransformer.cjs.map +1 -1
  169. package/dist/cjs/utils/getOrganizationUnitSwitchErrorKey.cjs +24 -0
  170. package/dist/cjs/utils/getOrganizationUnitSwitchErrorKey.cjs.map +1 -0
  171. package/dist/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.d.ts +85 -0
  172. package/dist/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.d.ts.map +1 -0
  173. package/dist/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.js +209 -0
  174. package/dist/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.js.map +1 -0
  175. package/dist/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.styles.d.ts +11 -0
  176. package/dist/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.styles.d.ts.map +1 -0
  177. package/dist/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.styles.js +184 -0
  178. package/dist/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.styles.js.map +1 -0
  179. package/dist/components/account/OrganizationUnitSwitcher/OrganizationUnitSwitcher.d.ts +54 -0
  180. package/dist/components/account/OrganizationUnitSwitcher/OrganizationUnitSwitcher.d.ts.map +1 -0
  181. package/dist/components/account/OrganizationUnitSwitcher/OrganizationUnitSwitcher.js +135 -0
  182. package/dist/components/account/OrganizationUnitSwitcher/OrganizationUnitSwitcher.js.map +1 -0
  183. package/dist/components/auth/Callback/TokenCallback.js +3 -3
  184. package/dist/components/auth/Callback/TokenCallback.js.map +1 -1
  185. package/dist/components/auth/SignIn/SignIn.d.ts +5 -0
  186. package/dist/components/auth/SignIn/SignIn.d.ts.map +1 -1
  187. package/dist/components/auth/SignIn/SignIn.js +51 -46
  188. package/dist/components/auth/SignIn/SignIn.js.map +1 -1
  189. package/dist/components/auth/SignUp/BaseSignUp.d.ts.map +1 -1
  190. package/dist/components/auth/SignUp/BaseSignUp.js +14 -10
  191. package/dist/components/auth/SignUp/BaseSignUp.js.map +1 -1
  192. package/dist/components/auth/flow/AuthOptionFactory.js +2 -2
  193. package/dist/components/auth/flow/AuthOptionFactory.js.map +1 -1
  194. package/dist/components/common/LanguageSwitcher/BaseLanguageSwitcher.js +1 -1
  195. package/dist/components/{admin → management}/AgentCreate/AgentCreate.d.ts +2 -1
  196. package/dist/components/management/AgentCreate/AgentCreate.d.ts.map +1 -0
  197. package/dist/components/{admin → management}/AgentCreate/AgentCreate.js +8 -7
  198. package/dist/components/management/AgentCreate/AgentCreate.js.map +1 -0
  199. package/dist/components/management/AgentCreate/BaseAgentCreate.d.ts.map +1 -0
  200. package/dist/components/{admin → management}/AgentCreate/BaseAgentCreate.js +1 -1
  201. package/dist/components/management/AgentCreate/BaseAgentCreate.js.map +1 -0
  202. package/dist/components/management/AgentDetails/AgentDetails.d.ts.map +1 -0
  203. package/dist/components/{admin → management}/AgentDetails/AgentDetails.js +1 -1
  204. package/dist/components/management/AgentDetails/AgentDetails.js.map +1 -0
  205. package/dist/components/management/AgentDetails/BaseAgentDetails.d.ts.map +1 -0
  206. package/dist/components/{admin → management}/AgentDetails/BaseAgentDetails.js +1 -1
  207. package/dist/components/management/AgentDetails/BaseAgentDetails.js.map +1 -0
  208. package/dist/components/{admin → management}/AgentList/AgentList.d.ts +7 -1
  209. package/dist/components/management/AgentList/AgentList.d.ts.map +1 -0
  210. package/dist/components/{admin → management}/AgentList/AgentList.js +11 -6
  211. package/dist/components/management/AgentList/AgentList.js.map +1 -0
  212. package/dist/components/management/AgentList/BaseAgentList.d.ts.map +1 -0
  213. package/dist/components/{admin → management}/AgentList/BaseAgentList.js +1 -1
  214. package/dist/components/management/AgentList/BaseAgentList.js.map +1 -0
  215. package/dist/components/{admin → management}/ApplicationCreate/ApplicationCreate.d.ts +2 -1
  216. package/dist/components/management/ApplicationCreate/ApplicationCreate.d.ts.map +1 -0
  217. package/dist/components/{admin → management}/ApplicationCreate/ApplicationCreate.js +10 -5
  218. package/dist/components/management/ApplicationCreate/ApplicationCreate.js.map +1 -0
  219. package/dist/components/management/ApplicationCreate/BaseApplicationCreate.d.ts.map +1 -0
  220. package/dist/components/{admin → management}/ApplicationCreate/BaseApplicationCreate.js +1 -1
  221. package/dist/components/management/ApplicationCreate/BaseApplicationCreate.js.map +1 -0
  222. package/dist/components/management/ApplicationDetails/ApplicationDetails.d.ts.map +1 -0
  223. package/dist/components/{admin → management}/ApplicationDetails/ApplicationDetails.js +1 -1
  224. package/dist/components/management/ApplicationDetails/ApplicationDetails.js.map +1 -0
  225. package/dist/components/management/ApplicationDetails/BaseApplicationDetails.d.ts.map +1 -0
  226. package/dist/components/{admin → management}/ApplicationDetails/BaseApplicationDetails.js +1 -1
  227. package/dist/components/management/ApplicationDetails/BaseApplicationDetails.js.map +1 -0
  228. package/dist/components/{admin → management}/ApplicationList/ApplicationList.d.ts +7 -1
  229. package/dist/components/management/ApplicationList/ApplicationList.d.ts.map +1 -0
  230. package/dist/components/{admin → management}/ApplicationList/ApplicationList.js +9 -4
  231. package/dist/components/management/ApplicationList/ApplicationList.js.map +1 -0
  232. package/dist/components/management/ApplicationList/BaseApplicationList.d.ts.map +1 -0
  233. package/dist/components/{admin → management}/ApplicationList/BaseApplicationList.js +1 -1
  234. package/dist/components/management/ApplicationList/BaseApplicationList.js.map +1 -0
  235. package/dist/components/management/GroupCreate/BaseGroupCreate.d.ts.map +1 -0
  236. package/dist/components/{admin → management}/GroupCreate/BaseGroupCreate.js +1 -1
  237. package/dist/components/management/GroupCreate/BaseGroupCreate.js.map +1 -0
  238. package/dist/components/management/GroupCreate/GroupCreate.d.ts.map +1 -0
  239. package/dist/components/{admin → management}/GroupCreate/GroupCreate.js +1 -1
  240. package/dist/components/management/GroupCreate/GroupCreate.js.map +1 -0
  241. package/dist/components/management/GroupDetails/BaseGroupDetails.d.ts +47 -0
  242. package/dist/components/management/GroupDetails/BaseGroupDetails.d.ts.map +1 -0
  243. package/dist/components/management/GroupDetails/BaseGroupDetails.js +84 -0
  244. package/dist/components/management/GroupDetails/BaseGroupDetails.js.map +1 -0
  245. package/dist/components/management/GroupDetails/GroupDetails.d.ts +37 -0
  246. package/dist/components/management/GroupDetails/GroupDetails.d.ts.map +1 -0
  247. package/dist/components/management/GroupDetails/GroupDetails.js +57 -0
  248. package/dist/components/management/GroupDetails/GroupDetails.js.map +1 -0
  249. package/dist/components/management/GroupList/BaseGroupList.d.ts.map +1 -0
  250. package/dist/components/{admin → management}/GroupList/BaseGroupList.js +1 -1
  251. package/dist/components/management/GroupList/BaseGroupList.js.map +1 -0
  252. package/dist/components/management/GroupList/GroupList.d.ts.map +1 -0
  253. package/dist/components/{admin → management}/GroupList/GroupList.js +1 -1
  254. package/dist/components/management/GroupList/GroupList.js.map +1 -0
  255. package/dist/components/management/GroupMembers/BaseGroupMembers.d.ts.map +1 -0
  256. package/dist/components/{admin → management}/GroupMembers/BaseGroupMembers.js +1 -1
  257. package/dist/components/management/GroupMembers/BaseGroupMembers.js.map +1 -0
  258. package/dist/components/management/GroupMembers/GroupMembers.d.ts.map +1 -0
  259. package/dist/components/{admin → management}/GroupMembers/GroupMembers.js +1 -1
  260. package/dist/components/management/GroupMembers/GroupMembers.js.map +1 -0
  261. package/dist/components/management/OrganizationUnitCreate/BaseOrganizationUnitCreate.d.ts +85 -0
  262. package/dist/components/management/OrganizationUnitCreate/BaseOrganizationUnitCreate.d.ts.map +1 -0
  263. package/dist/components/management/OrganizationUnitCreate/BaseOrganizationUnitCreate.js +137 -0
  264. package/dist/components/management/OrganizationUnitCreate/BaseOrganizationUnitCreate.js.map +1 -0
  265. package/dist/components/management/OrganizationUnitCreate/OrganizationUnitCreate.d.ts +21 -0
  266. package/dist/components/management/OrganizationUnitCreate/OrganizationUnitCreate.d.ts.map +1 -0
  267. package/dist/components/management/OrganizationUnitCreate/OrganizationUnitCreate.js +79 -0
  268. package/dist/components/management/OrganizationUnitCreate/OrganizationUnitCreate.js.map +1 -0
  269. package/dist/components/management/OrganizationUnitDetails/BaseOrganizationUnitDetails.d.ts +105 -0
  270. package/dist/components/management/OrganizationUnitDetails/BaseOrganizationUnitDetails.d.ts.map +1 -0
  271. package/dist/components/management/OrganizationUnitDetails/BaseOrganizationUnitDetails.js +273 -0
  272. package/dist/components/management/OrganizationUnitDetails/BaseOrganizationUnitDetails.js.map +1 -0
  273. package/dist/components/management/OrganizationUnitDetails/OrganizationUnitDetails.d.ts +42 -0
  274. package/dist/components/management/OrganizationUnitDetails/OrganizationUnitDetails.d.ts.map +1 -0
  275. package/dist/components/management/OrganizationUnitDetails/OrganizationUnitDetails.js +139 -0
  276. package/dist/components/management/OrganizationUnitDetails/OrganizationUnitDetails.js.map +1 -0
  277. package/dist/components/management/OrganizationUnitList/BaseOrganizationUnitList.d.ts +54 -0
  278. package/dist/components/management/OrganizationUnitList/BaseOrganizationUnitList.d.ts.map +1 -0
  279. package/dist/components/management/OrganizationUnitList/BaseOrganizationUnitList.js +76 -0
  280. package/dist/components/management/OrganizationUnitList/BaseOrganizationUnitList.js.map +1 -0
  281. package/dist/components/management/OrganizationUnitList/OrganizationUnitList.d.ts +19 -0
  282. package/dist/components/management/OrganizationUnitList/OrganizationUnitList.d.ts.map +1 -0
  283. package/dist/components/management/OrganizationUnitList/OrganizationUnitList.js +65 -0
  284. package/dist/components/management/OrganizationUnitList/OrganizationUnitList.js.map +1 -0
  285. package/dist/components/management/ProjectCreate/BaseProjectCreate.d.ts +60 -0
  286. package/dist/components/management/ProjectCreate/BaseProjectCreate.d.ts.map +1 -0
  287. package/dist/components/management/ProjectCreate/BaseProjectCreate.js +113 -0
  288. package/dist/components/management/ProjectCreate/BaseProjectCreate.js.map +1 -0
  289. package/dist/components/management/ProjectCreate/ProjectCreate.d.ts +20 -0
  290. package/dist/components/management/ProjectCreate/ProjectCreate.d.ts.map +1 -0
  291. package/dist/components/management/ProjectCreate/ProjectCreate.js +40 -0
  292. package/dist/components/management/ProjectCreate/ProjectCreate.js.map +1 -0
  293. package/dist/components/management/ProjectDetails/BaseProjectDetails.d.ts +60 -0
  294. package/dist/components/management/ProjectDetails/BaseProjectDetails.d.ts.map +1 -0
  295. package/dist/components/management/ProjectDetails/BaseProjectDetails.js +169 -0
  296. package/dist/components/management/ProjectDetails/BaseProjectDetails.js.map +1 -0
  297. package/dist/components/management/ProjectDetails/ProjectDetails.d.ts +36 -0
  298. package/dist/components/management/ProjectDetails/ProjectDetails.d.ts.map +1 -0
  299. package/dist/components/management/ProjectDetails/ProjectDetails.js +65 -0
  300. package/dist/components/management/ProjectDetails/ProjectDetails.js.map +1 -0
  301. package/dist/components/management/ProjectList/BaseProjectList.d.ts +53 -0
  302. package/dist/components/management/ProjectList/BaseProjectList.d.ts.map +1 -0
  303. package/dist/components/management/ProjectList/BaseProjectList.js +76 -0
  304. package/dist/components/management/ProjectList/BaseProjectList.js.map +1 -0
  305. package/dist/components/management/ProjectList/ProjectList.d.ts +14 -0
  306. package/dist/components/management/ProjectList/ProjectList.d.ts.map +1 -0
  307. package/dist/components/management/ProjectList/ProjectList.js +47 -0
  308. package/dist/components/management/ProjectList/ProjectList.js.map +1 -0
  309. package/dist/components/management/ProjectSwitcher/BaseProjectSwitcher.d.ts +69 -0
  310. package/dist/components/management/ProjectSwitcher/BaseProjectSwitcher.d.ts.map +1 -0
  311. package/dist/components/management/ProjectSwitcher/BaseProjectSwitcher.js +55 -0
  312. package/dist/components/management/ProjectSwitcher/BaseProjectSwitcher.js.map +1 -0
  313. package/dist/components/management/ProjectSwitcher/ProjectSwitcher.d.ts +25 -0
  314. package/dist/components/management/ProjectSwitcher/ProjectSwitcher.d.ts.map +1 -0
  315. package/dist/components/management/ProjectSwitcher/ProjectSwitcher.js +68 -0
  316. package/dist/components/management/ProjectSwitcher/ProjectSwitcher.js.map +1 -0
  317. package/dist/components/management/RoleAssignments/BaseRoleAssignments.d.ts.map +1 -0
  318. package/dist/components/{admin → management}/RoleAssignments/BaseRoleAssignments.js +1 -1
  319. package/dist/components/management/RoleAssignments/BaseRoleAssignments.js.map +1 -0
  320. package/dist/components/management/RoleAssignments/RoleAssignments.d.ts.map +1 -0
  321. package/dist/components/{admin → management}/RoleAssignments/RoleAssignments.js +1 -1
  322. package/dist/components/management/RoleAssignments/RoleAssignments.js.map +1 -0
  323. package/dist/components/management/RoleCreate/BaseRoleCreate.d.ts.map +1 -0
  324. package/dist/components/{admin → management}/RoleCreate/BaseRoleCreate.js +1 -1
  325. package/dist/components/management/RoleCreate/BaseRoleCreate.js.map +1 -0
  326. package/dist/components/management/RoleCreate/RoleCreate.d.ts.map +1 -0
  327. package/dist/components/{admin → management}/RoleCreate/RoleCreate.js +1 -1
  328. package/dist/components/management/RoleCreate/RoleCreate.js.map +1 -0
  329. package/dist/components/management/RoleDetails/BaseRoleDetails.d.ts +51 -0
  330. package/dist/components/management/RoleDetails/BaseRoleDetails.d.ts.map +1 -0
  331. package/dist/components/management/RoleDetails/BaseRoleDetails.js +85 -0
  332. package/dist/components/management/RoleDetails/BaseRoleDetails.js.map +1 -0
  333. package/dist/components/management/RoleDetails/RoleDetails.d.ts +39 -0
  334. package/dist/components/management/RoleDetails/RoleDetails.d.ts.map +1 -0
  335. package/dist/components/management/RoleDetails/RoleDetails.js +65 -0
  336. package/dist/components/management/RoleDetails/RoleDetails.js.map +1 -0
  337. package/dist/components/management/RoleList/BaseRoleList.d.ts.map +1 -0
  338. package/dist/components/{admin → management}/RoleList/BaseRoleList.js +1 -1
  339. package/dist/components/management/RoleList/BaseRoleList.js.map +1 -0
  340. package/dist/components/management/RoleList/RoleList.d.ts.map +1 -0
  341. package/dist/components/{admin → management}/RoleList/RoleList.js +1 -1
  342. package/dist/components/management/RoleList/RoleList.js.map +1 -0
  343. package/dist/components/management/RolePermissions/BaseRolePermissions.d.ts +104 -0
  344. package/dist/components/management/RolePermissions/BaseRolePermissions.d.ts.map +1 -0
  345. package/dist/components/management/RolePermissions/BaseRolePermissions.js +178 -0
  346. package/dist/components/management/RolePermissions/BaseRolePermissions.js.map +1 -0
  347. package/dist/components/management/RolePermissions/RolePermissions.d.ts +29 -0
  348. package/dist/components/management/RolePermissions/RolePermissions.d.ts.map +1 -0
  349. package/dist/components/management/RolePermissions/RolePermissions.js +108 -0
  350. package/dist/components/management/RolePermissions/RolePermissions.js.map +1 -0
  351. package/dist/components/management/SharingPolicies/BaseSharingPolicies.d.ts +124 -0
  352. package/dist/components/management/SharingPolicies/BaseSharingPolicies.d.ts.map +1 -0
  353. package/dist/components/management/SharingPolicies/BaseSharingPolicies.js +304 -0
  354. package/dist/components/management/SharingPolicies/BaseSharingPolicies.js.map +1 -0
  355. package/dist/components/management/SharingPolicies/SharingPolicies.d.ts +36 -0
  356. package/dist/components/management/SharingPolicies/SharingPolicies.d.ts.map +1 -0
  357. package/dist/components/management/SharingPolicies/SharingPolicies.js +122 -0
  358. package/dist/components/management/SharingPolicies/SharingPolicies.js.map +1 -0
  359. package/dist/components/management/UserCreate/BaseUserCreate.d.ts.map +1 -0
  360. package/dist/components/{admin → management}/UserCreate/BaseUserCreate.js +1 -1
  361. package/dist/components/management/UserCreate/BaseUserCreate.js.map +1 -0
  362. package/dist/components/management/UserCreate/UserCreate.d.ts.map +1 -0
  363. package/dist/components/{admin → management}/UserCreate/UserCreate.js +1 -1
  364. package/dist/components/management/UserCreate/UserCreate.js.map +1 -0
  365. package/dist/components/management/UserCreate/userCreateFields.d.ts.map +1 -0
  366. package/dist/components/{admin → management}/UserCreate/userCreateFields.js +1 -1
  367. package/dist/components/management/UserCreate/userCreateFields.js.map +1 -0
  368. package/dist/components/management/UserDetails/BaseUserDetails.d.ts.map +1 -0
  369. package/dist/components/{admin → management}/UserDetails/BaseUserDetails.js +1 -1
  370. package/dist/components/management/UserDetails/BaseUserDetails.js.map +1 -0
  371. package/dist/components/management/UserDetails/UserDetails.d.ts.map +1 -0
  372. package/dist/components/{admin → management}/UserDetails/UserDetails.js +1 -1
  373. package/dist/components/management/UserDetails/UserDetails.js.map +1 -0
  374. package/dist/components/management/UserList/BaseUserList.d.ts.map +1 -0
  375. package/dist/components/{admin → management}/UserList/BaseUserList.js +1 -1
  376. package/dist/components/management/UserList/BaseUserList.js.map +1 -0
  377. package/dist/components/management/UserList/UserList.d.ts.map +1 -0
  378. package/dist/components/{admin → management}/UserList/UserList.js +1 -1
  379. package/dist/components/management/UserList/UserList.js.map +1 -0
  380. package/dist/components/management/shared/AccountLifecycleParts.d.ts.map +1 -0
  381. package/dist/components/{admin → management}/shared/AccountLifecycleParts.js +1 -1
  382. package/dist/components/management/shared/AccountLifecycleParts.js.map +1 -0
  383. package/dist/components/management/shared/AdminListRenderProps.d.ts.map +1 -0
  384. package/dist/components/management/shared/AdminParts.d.ts.map +1 -0
  385. package/dist/components/{admin → management}/shared/AdminParts.js +1 -1
  386. package/dist/components/management/shared/AdminParts.js.map +1 -0
  387. package/dist/components/management/shared/AdminParts.styles.d.ts.map +1 -0
  388. package/dist/components/{admin → management}/shared/AdminParts.styles.js +1 -1
  389. package/dist/components/management/shared/AdminParts.styles.js.map +1 -0
  390. package/dist/components/management/shared/AdminSearch.d.ts.map +1 -0
  391. package/dist/components/{admin → management}/shared/AdminSearch.js +1 -1
  392. package/dist/components/management/shared/AdminSearch.js.map +1 -0
  393. package/dist/components/management/shared/AdminSection.d.ts.map +1 -0
  394. package/dist/components/{admin → management}/shared/AdminSection.js +1 -1
  395. package/dist/components/management/shared/AdminSection.js.map +1 -0
  396. package/dist/components/management/shared/AdminSection.styles.d.ts.map +1 -0
  397. package/dist/components/{admin → management}/shared/AdminSection.styles.js +1 -1
  398. package/dist/components/management/shared/AdminSection.styles.js.map +1 -0
  399. package/dist/components/management/shared/ApplicationFormFields.d.ts.map +1 -0
  400. package/dist/components/{admin → management}/shared/ApplicationFormFields.js +1 -1
  401. package/dist/components/management/shared/ApplicationFormFields.js.map +1 -0
  402. package/dist/components/management/shared/ClientSecretNotice.d.ts.map +1 -0
  403. package/dist/components/{admin → management}/shared/ClientSecretNotice.js +1 -1
  404. package/dist/components/management/shared/ClientSecretNotice.js.map +1 -0
  405. package/dist/components/management/shared/IdentityPicker.d.ts.map +1 -0
  406. package/dist/components/{admin → management}/shared/IdentityPicker.js +1 -1
  407. package/dist/components/management/shared/IdentityPicker.js.map +1 -0
  408. package/dist/components/management/shared/formatTimestamp.d.ts +9 -0
  409. package/dist/components/management/shared/formatTimestamp.d.ts.map +1 -0
  410. package/dist/components/management/shared/formatTimestamp.js +17 -0
  411. package/dist/components/management/shared/formatTimestamp.js.map +1 -0
  412. package/dist/components/management/shared/useAdminPartStyles.d.ts.map +1 -0
  413. package/dist/components/{admin → management}/shared/useAdminPartStyles.js +1 -1
  414. package/dist/components/management/shared/useAdminPartStyles.js.map +1 -0
  415. package/dist/components/management/shared/useDefaultOuId.d.ts.map +1 -0
  416. package/dist/components/{admin → management}/shared/useDefaultOuId.js +1 -1
  417. package/dist/components/management/shared/useDefaultOuId.js.map +1 -0
  418. package/dist/components/management/shared/useProjectPlacement.d.ts +26 -0
  419. package/dist/components/management/shared/useProjectPlacement.d.ts.map +1 -0
  420. package/dist/components/management/shared/useProjectPlacement.js +23 -0
  421. package/dist/components/management/shared/useProjectPlacement.js.map +1 -0
  422. package/dist/contexts/ThunderID/ThunderIDContext.d.ts +27 -1
  423. package/dist/contexts/ThunderID/ThunderIDContext.d.ts.map +1 -1
  424. package/dist/contexts/ThunderID/ThunderIDContext.js +5 -0
  425. package/dist/contexts/ThunderID/ThunderIDContext.js.map +1 -1
  426. package/dist/contexts/ThunderID/ThunderIDProvider.d.ts.map +1 -1
  427. package/dist/contexts/ThunderID/ThunderIDProvider.js +28 -2
  428. package/dist/contexts/ThunderID/ThunderIDProvider.js.map +1 -1
  429. package/dist/contexts/ThunderID/useCurrentProjectState.d.ts +26 -0
  430. package/dist/contexts/ThunderID/useCurrentProjectState.d.ts.map +1 -0
  431. package/dist/contexts/ThunderID/useCurrentProjectState.js +30 -0
  432. package/dist/contexts/ThunderID/useCurrentProjectState.js.map +1 -0
  433. package/dist/hooks/management/useManagementEndpoint.d.ts +1 -1
  434. package/dist/hooks/management/useManagementEndpoint.d.ts.map +1 -1
  435. package/dist/hooks/management/useManagementEndpoint.js.map +1 -1
  436. package/dist/index.d.ts +120 -69
  437. package/dist/index.d.ts.map +1 -1
  438. package/dist/index.js +59 -34
  439. package/dist/utils/flowTransformer.d.ts +7 -0
  440. package/dist/utils/flowTransformer.d.ts.map +1 -1
  441. package/dist/utils/flowTransformer.js +9 -1
  442. package/dist/utils/flowTransformer.js.map +1 -1
  443. package/dist/utils/getOrganizationUnitSwitchErrorKey.d.ts +11 -0
  444. package/dist/utils/getOrganizationUnitSwitchErrorKey.d.ts.map +1 -0
  445. package/dist/utils/getOrganizationUnitSwitchErrorKey.js +22 -0
  446. package/dist/utils/getOrganizationUnitSwitchErrorKey.js.map +1 -0
  447. package/package.json +2 -2
  448. package/dist/cjs/components/admin/AgentCreate/AgentCreate.cjs.map +0 -1
  449. package/dist/cjs/components/admin/AgentCreate/BaseAgentCreate.cjs.map +0 -1
  450. package/dist/cjs/components/admin/AgentDetails/AgentDetails.cjs.map +0 -1
  451. package/dist/cjs/components/admin/AgentDetails/BaseAgentDetails.cjs.map +0 -1
  452. package/dist/cjs/components/admin/AgentList/AgentList.cjs.map +0 -1
  453. package/dist/cjs/components/admin/AgentList/BaseAgentList.cjs.map +0 -1
  454. package/dist/cjs/components/admin/ApplicationCreate/ApplicationCreate.cjs.map +0 -1
  455. package/dist/cjs/components/admin/ApplicationCreate/BaseApplicationCreate.cjs.map +0 -1
  456. package/dist/cjs/components/admin/ApplicationDetails/ApplicationDetails.cjs.map +0 -1
  457. package/dist/cjs/components/admin/ApplicationDetails/BaseApplicationDetails.cjs.map +0 -1
  458. package/dist/cjs/components/admin/ApplicationList/ApplicationList.cjs.map +0 -1
  459. package/dist/cjs/components/admin/ApplicationList/BaseApplicationList.cjs.map +0 -1
  460. package/dist/cjs/components/admin/GroupCreate/BaseGroupCreate.cjs.map +0 -1
  461. package/dist/cjs/components/admin/GroupCreate/GroupCreate.cjs.map +0 -1
  462. package/dist/cjs/components/admin/GroupList/BaseGroupList.cjs.map +0 -1
  463. package/dist/cjs/components/admin/GroupList/GroupList.cjs.map +0 -1
  464. package/dist/cjs/components/admin/GroupMembers/BaseGroupMembers.cjs.map +0 -1
  465. package/dist/cjs/components/admin/GroupMembers/GroupMembers.cjs.map +0 -1
  466. package/dist/cjs/components/admin/RoleAssignments/BaseRoleAssignments.cjs.map +0 -1
  467. package/dist/cjs/components/admin/RoleAssignments/RoleAssignments.cjs.map +0 -1
  468. package/dist/cjs/components/admin/RoleCreate/BaseRoleCreate.cjs.map +0 -1
  469. package/dist/cjs/components/admin/RoleCreate/RoleCreate.cjs.map +0 -1
  470. package/dist/cjs/components/admin/RoleList/BaseRoleList.cjs.map +0 -1
  471. package/dist/cjs/components/admin/RoleList/RoleList.cjs.map +0 -1
  472. package/dist/cjs/components/admin/RolePermissions/BaseRolePermissions.cjs +0 -69
  473. package/dist/cjs/components/admin/RolePermissions/BaseRolePermissions.cjs.map +0 -1
  474. package/dist/cjs/components/admin/RolePermissions/RolePermissions.cjs +0 -40
  475. package/dist/cjs/components/admin/RolePermissions/RolePermissions.cjs.map +0 -1
  476. package/dist/cjs/components/admin/UserCreate/BaseUserCreate.cjs.map +0 -1
  477. package/dist/cjs/components/admin/UserCreate/UserCreate.cjs.map +0 -1
  478. package/dist/cjs/components/admin/UserCreate/userCreateFields.cjs.map +0 -1
  479. package/dist/cjs/components/admin/UserDetails/BaseUserDetails.cjs.map +0 -1
  480. package/dist/cjs/components/admin/UserDetails/UserDetails.cjs.map +0 -1
  481. package/dist/cjs/components/admin/UserList/BaseUserList.cjs.map +0 -1
  482. package/dist/cjs/components/admin/UserList/UserList.cjs.map +0 -1
  483. package/dist/cjs/components/admin/shared/AccountLifecycleParts.cjs.map +0 -1
  484. package/dist/cjs/components/admin/shared/AdminParts.cjs.map +0 -1
  485. package/dist/cjs/components/admin/shared/AdminParts.styles.cjs.map +0 -1
  486. package/dist/cjs/components/admin/shared/AdminSearch.cjs.map +0 -1
  487. package/dist/cjs/components/admin/shared/AdminSection.cjs.map +0 -1
  488. package/dist/cjs/components/admin/shared/AdminSection.styles.cjs.map +0 -1
  489. package/dist/cjs/components/admin/shared/ApplicationFormFields.cjs.map +0 -1
  490. package/dist/cjs/components/admin/shared/ClientSecretNotice.cjs.map +0 -1
  491. package/dist/cjs/components/admin/shared/IdentityPicker.cjs.map +0 -1
  492. package/dist/cjs/components/admin/shared/useAdminPartStyles.cjs.map +0 -1
  493. package/dist/cjs/components/admin/shared/useDefaultOuId.cjs.map +0 -1
  494. package/dist/components/admin/AgentCreate/AgentCreate.d.ts.map +0 -1
  495. package/dist/components/admin/AgentCreate/AgentCreate.js.map +0 -1
  496. package/dist/components/admin/AgentCreate/BaseAgentCreate.d.ts.map +0 -1
  497. package/dist/components/admin/AgentCreate/BaseAgentCreate.js.map +0 -1
  498. package/dist/components/admin/AgentDetails/AgentDetails.d.ts.map +0 -1
  499. package/dist/components/admin/AgentDetails/AgentDetails.js.map +0 -1
  500. package/dist/components/admin/AgentDetails/BaseAgentDetails.d.ts.map +0 -1
  501. package/dist/components/admin/AgentDetails/BaseAgentDetails.js.map +0 -1
  502. package/dist/components/admin/AgentList/AgentList.d.ts.map +0 -1
  503. package/dist/components/admin/AgentList/AgentList.js.map +0 -1
  504. package/dist/components/admin/AgentList/BaseAgentList.d.ts.map +0 -1
  505. package/dist/components/admin/AgentList/BaseAgentList.js.map +0 -1
  506. package/dist/components/admin/ApplicationCreate/ApplicationCreate.d.ts.map +0 -1
  507. package/dist/components/admin/ApplicationCreate/ApplicationCreate.js.map +0 -1
  508. package/dist/components/admin/ApplicationCreate/BaseApplicationCreate.d.ts.map +0 -1
  509. package/dist/components/admin/ApplicationCreate/BaseApplicationCreate.js.map +0 -1
  510. package/dist/components/admin/ApplicationDetails/ApplicationDetails.d.ts.map +0 -1
  511. package/dist/components/admin/ApplicationDetails/ApplicationDetails.js.map +0 -1
  512. package/dist/components/admin/ApplicationDetails/BaseApplicationDetails.d.ts.map +0 -1
  513. package/dist/components/admin/ApplicationDetails/BaseApplicationDetails.js.map +0 -1
  514. package/dist/components/admin/ApplicationList/ApplicationList.d.ts.map +0 -1
  515. package/dist/components/admin/ApplicationList/ApplicationList.js.map +0 -1
  516. package/dist/components/admin/ApplicationList/BaseApplicationList.d.ts.map +0 -1
  517. package/dist/components/admin/ApplicationList/BaseApplicationList.js.map +0 -1
  518. package/dist/components/admin/GroupCreate/BaseGroupCreate.d.ts.map +0 -1
  519. package/dist/components/admin/GroupCreate/BaseGroupCreate.js.map +0 -1
  520. package/dist/components/admin/GroupCreate/GroupCreate.d.ts.map +0 -1
  521. package/dist/components/admin/GroupCreate/GroupCreate.js.map +0 -1
  522. package/dist/components/admin/GroupList/BaseGroupList.d.ts.map +0 -1
  523. package/dist/components/admin/GroupList/BaseGroupList.js.map +0 -1
  524. package/dist/components/admin/GroupList/GroupList.d.ts.map +0 -1
  525. package/dist/components/admin/GroupList/GroupList.js.map +0 -1
  526. package/dist/components/admin/GroupMembers/BaseGroupMembers.d.ts.map +0 -1
  527. package/dist/components/admin/GroupMembers/BaseGroupMembers.js.map +0 -1
  528. package/dist/components/admin/GroupMembers/GroupMembers.d.ts.map +0 -1
  529. package/dist/components/admin/GroupMembers/GroupMembers.js.map +0 -1
  530. package/dist/components/admin/RoleAssignments/BaseRoleAssignments.d.ts.map +0 -1
  531. package/dist/components/admin/RoleAssignments/BaseRoleAssignments.js.map +0 -1
  532. package/dist/components/admin/RoleAssignments/RoleAssignments.d.ts.map +0 -1
  533. package/dist/components/admin/RoleAssignments/RoleAssignments.js.map +0 -1
  534. package/dist/components/admin/RoleCreate/BaseRoleCreate.d.ts.map +0 -1
  535. package/dist/components/admin/RoleCreate/BaseRoleCreate.js.map +0 -1
  536. package/dist/components/admin/RoleCreate/RoleCreate.d.ts.map +0 -1
  537. package/dist/components/admin/RoleCreate/RoleCreate.js.map +0 -1
  538. package/dist/components/admin/RoleList/BaseRoleList.d.ts.map +0 -1
  539. package/dist/components/admin/RoleList/BaseRoleList.js.map +0 -1
  540. package/dist/components/admin/RoleList/RoleList.d.ts.map +0 -1
  541. package/dist/components/admin/RoleList/RoleList.js.map +0 -1
  542. package/dist/components/admin/RolePermissions/BaseRolePermissions.d.ts +0 -42
  543. package/dist/components/admin/RolePermissions/BaseRolePermissions.d.ts.map +0 -1
  544. package/dist/components/admin/RolePermissions/BaseRolePermissions.js +0 -67
  545. package/dist/components/admin/RolePermissions/BaseRolePermissions.js.map +0 -1
  546. package/dist/components/admin/RolePermissions/RolePermissions.d.ts +0 -16
  547. package/dist/components/admin/RolePermissions/RolePermissions.d.ts.map +0 -1
  548. package/dist/components/admin/RolePermissions/RolePermissions.js +0 -37
  549. package/dist/components/admin/RolePermissions/RolePermissions.js.map +0 -1
  550. package/dist/components/admin/UserCreate/BaseUserCreate.d.ts.map +0 -1
  551. package/dist/components/admin/UserCreate/BaseUserCreate.js.map +0 -1
  552. package/dist/components/admin/UserCreate/UserCreate.d.ts.map +0 -1
  553. package/dist/components/admin/UserCreate/UserCreate.js.map +0 -1
  554. package/dist/components/admin/UserCreate/userCreateFields.d.ts.map +0 -1
  555. package/dist/components/admin/UserCreate/userCreateFields.js.map +0 -1
  556. package/dist/components/admin/UserDetails/BaseUserDetails.d.ts.map +0 -1
  557. package/dist/components/admin/UserDetails/BaseUserDetails.js.map +0 -1
  558. package/dist/components/admin/UserDetails/UserDetails.d.ts.map +0 -1
  559. package/dist/components/admin/UserDetails/UserDetails.js.map +0 -1
  560. package/dist/components/admin/UserList/BaseUserList.d.ts.map +0 -1
  561. package/dist/components/admin/UserList/BaseUserList.js.map +0 -1
  562. package/dist/components/admin/UserList/UserList.d.ts.map +0 -1
  563. package/dist/components/admin/UserList/UserList.js.map +0 -1
  564. package/dist/components/admin/shared/AccountLifecycleParts.d.ts.map +0 -1
  565. package/dist/components/admin/shared/AccountLifecycleParts.js.map +0 -1
  566. package/dist/components/admin/shared/AdminListRenderProps.d.ts.map +0 -1
  567. package/dist/components/admin/shared/AdminParts.d.ts.map +0 -1
  568. package/dist/components/admin/shared/AdminParts.js.map +0 -1
  569. package/dist/components/admin/shared/AdminParts.styles.d.ts.map +0 -1
  570. package/dist/components/admin/shared/AdminParts.styles.js.map +0 -1
  571. package/dist/components/admin/shared/AdminSearch.d.ts.map +0 -1
  572. package/dist/components/admin/shared/AdminSearch.js.map +0 -1
  573. package/dist/components/admin/shared/AdminSection.d.ts.map +0 -1
  574. package/dist/components/admin/shared/AdminSection.js.map +0 -1
  575. package/dist/components/admin/shared/AdminSection.styles.d.ts.map +0 -1
  576. package/dist/components/admin/shared/AdminSection.styles.js.map +0 -1
  577. package/dist/components/admin/shared/ApplicationFormFields.d.ts.map +0 -1
  578. package/dist/components/admin/shared/ApplicationFormFields.js.map +0 -1
  579. package/dist/components/admin/shared/ClientSecretNotice.d.ts.map +0 -1
  580. package/dist/components/admin/shared/ClientSecretNotice.js.map +0 -1
  581. package/dist/components/admin/shared/IdentityPicker.d.ts.map +0 -1
  582. package/dist/components/admin/shared/IdentityPicker.js.map +0 -1
  583. package/dist/components/admin/shared/useAdminPartStyles.d.ts.map +0 -1
  584. package/dist/components/admin/shared/useAdminPartStyles.js.map +0 -1
  585. package/dist/components/admin/shared/useDefaultOuId.d.ts.map +0 -1
  586. package/dist/components/admin/shared/useDefaultOuId.js.map +0 -1
  587. /package/dist/components/{admin → management}/AgentCreate/BaseAgentCreate.d.ts +0 -0
  588. /package/dist/components/{admin → management}/AgentDetails/AgentDetails.d.ts +0 -0
  589. /package/dist/components/{admin → management}/AgentDetails/BaseAgentDetails.d.ts +0 -0
  590. /package/dist/components/{admin → management}/AgentList/BaseAgentList.d.ts +0 -0
  591. /package/dist/components/{admin → management}/ApplicationCreate/BaseApplicationCreate.d.ts +0 -0
  592. /package/dist/components/{admin → management}/ApplicationDetails/ApplicationDetails.d.ts +0 -0
  593. /package/dist/components/{admin → management}/ApplicationDetails/BaseApplicationDetails.d.ts +0 -0
  594. /package/dist/components/{admin → management}/ApplicationList/BaseApplicationList.d.ts +0 -0
  595. /package/dist/components/{admin → management}/GroupCreate/BaseGroupCreate.d.ts +0 -0
  596. /package/dist/components/{admin → management}/GroupCreate/GroupCreate.d.ts +0 -0
  597. /package/dist/components/{admin → management}/GroupList/BaseGroupList.d.ts +0 -0
  598. /package/dist/components/{admin → management}/GroupList/GroupList.d.ts +0 -0
  599. /package/dist/components/{admin → management}/GroupMembers/BaseGroupMembers.d.ts +0 -0
  600. /package/dist/components/{admin → management}/GroupMembers/GroupMembers.d.ts +0 -0
  601. /package/dist/components/{admin → management}/RoleAssignments/BaseRoleAssignments.d.ts +0 -0
  602. /package/dist/components/{admin → management}/RoleAssignments/RoleAssignments.d.ts +0 -0
  603. /package/dist/components/{admin → management}/RoleCreate/BaseRoleCreate.d.ts +0 -0
  604. /package/dist/components/{admin → management}/RoleCreate/RoleCreate.d.ts +0 -0
  605. /package/dist/components/{admin → management}/RoleList/BaseRoleList.d.ts +0 -0
  606. /package/dist/components/{admin → management}/RoleList/RoleList.d.ts +0 -0
  607. /package/dist/components/{admin → management}/UserCreate/BaseUserCreate.d.ts +0 -0
  608. /package/dist/components/{admin → management}/UserCreate/UserCreate.d.ts +0 -0
  609. /package/dist/components/{admin → management}/UserCreate/userCreateFields.d.ts +0 -0
  610. /package/dist/components/{admin → management}/UserDetails/BaseUserDetails.d.ts +0 -0
  611. /package/dist/components/{admin → management}/UserDetails/UserDetails.d.ts +0 -0
  612. /package/dist/components/{admin → management}/UserList/BaseUserList.d.ts +0 -0
  613. /package/dist/components/{admin → management}/UserList/UserList.d.ts +0 -0
  614. /package/dist/components/{admin → management}/shared/AccountLifecycleParts.d.ts +0 -0
  615. /package/dist/components/{admin → management}/shared/AdminListRenderProps.d.ts +0 -0
  616. /package/dist/components/{admin → management}/shared/AdminParts.d.ts +0 -0
  617. /package/dist/components/{admin → management}/shared/AdminParts.styles.d.ts +0 -0
  618. /package/dist/components/{admin → management}/shared/AdminSearch.d.ts +0 -0
  619. /package/dist/components/{admin → management}/shared/AdminSection.d.ts +0 -0
  620. /package/dist/components/{admin → management}/shared/AdminSection.styles.d.ts +0 -0
  621. /package/dist/components/{admin → management}/shared/ApplicationFormFields.d.ts +0 -0
  622. /package/dist/components/{admin → management}/shared/ClientSecretNotice.d.ts +0 -0
  623. /package/dist/components/{admin → management}/shared/IdentityPicker.d.ts +0 -0
  624. /package/dist/components/{admin → management}/shared/useAdminPartStyles.d.ts +0 -0
  625. /package/dist/components/{admin → management}/shared/useDefaultOuId.d.ts +0 -0
@@ -1,13 +1,13 @@
1
1
  import useThunderID_default from "../../../contexts/ThunderID/useThunderID.js";
2
2
  import useTranslation_default from "../../../hooks/useTranslation.js";
3
- import { extractErrorMessage, normalizeFlowResponse } from "../../../utils/flowTransformer.js";
3
+ import { extractErrorMessage, normalizeFlowResponse, resolveFlowError } from "../../../utils/flowTransformer.js";
4
4
  import isConsentApprovalBlocked_default from "../../../utils/isConsentApprovalBlocked.js";
5
5
  import BaseSignIn_default from "./BaseSignIn.js";
6
6
  import { useOAuthCallback } from "../../../hooks/auth/useOAuthCallback.js";
7
7
  import { initiateOAuthRedirect } from "../../../utils/oauth.js";
8
8
  import { handlePasskeyAuthentication, handlePasskeyRegistration } from "../../../utils/passkey.js";
9
9
  import { ConsentConstants, EmbeddedFlowType, EmbeddedSignInFlowStatus, EmbeddedSignInFlowType, ThunderIDAPIError, ThunderIDRuntimeError, compileConsentDecisions, logger } from "@thunderid/browser";
10
- import { useEffect, useRef, useState } from "react";
10
+ import { useEffect, useMemo, useRef, useState } from "react";
11
11
  import { Fragment as Fragment$1, jsx } from "react/jsx-runtime";
12
12
 
13
13
  //#region src/components/auth/SignIn/SignIn.tsx
@@ -88,7 +88,7 @@ const findConsentSubmitActionId = (comps) => {
88
88
  * };
89
89
  * ```
90
90
  */
91
- const SignIn = ({ className, preferences, size = "medium", onSuccess, onError, variant, children, revalidateOnChangeAfterBlur }) => {
91
+ const SignIn = ({ className, preferences, size = "medium", onSuccess, onError, variant, children, revalidateOnChangeAfterBlur, organizationUnitId }) => {
92
92
  const { applicationId, afterSignInUrl, signIn, isInitialized, isLoading, meta, getStorageManager, scopes, vendor } = useThunderID_default();
93
93
  const { t } = useTranslation_default(preferences?.i18n);
94
94
  const [components, setComponents] = useState([]);
@@ -98,7 +98,8 @@ const SignIn = ({ className, preferences, size = "medium", onSuccess, onError, v
98
98
  const challengeTokenRef = useRef(null);
99
99
  const [isStorageReady, setIsStorageReady] = useState(false);
100
100
  const [isFlowInitialized, setIsFlowInitialized] = useState(false);
101
- const [flowError, setFlowError] = useState(null);
101
+ const [flowErrorSource, setFlowErrorSource] = useState(null);
102
+ const flowError = useMemo(() => flowErrorSource === null ? null : resolveFlowError(flowErrorSource, t), [flowErrorSource, t]);
102
103
  const [isSubmitting, setIsSubmitting] = useState(false);
103
104
  const [isTimeoutDisabled, setIsTimeoutDisabled] = useState(false);
104
105
  const [passkeyState, setPasskeyState] = useState({
@@ -156,16 +157,13 @@ const SignIn = ({ className, preferences, size = "medium", onSuccess, onError, v
156
157
  * Clear all flow-related storage and state.
157
158
  */
158
159
  const clearFlowState = async () => {
160
+ const executionIdToClear = currentExecutionId ?? sessionStorage.getItem(`${vendor}_execution_id`);
159
161
  setExecutionId(null);
160
162
  setComponents([]);
161
163
  setAdditionalData({});
162
164
  setIsFlowInitialized(false);
163
165
  await setChallengeToken(null);
164
- try {
165
- await (await getStorageManager())?.removeHybridDataParameter?.("authId");
166
- } catch {
167
- logger.warn("Failed to clear authId from hybrid storage.");
168
- }
166
+ await clearAuthId(executionIdToClear);
169
167
  setIsTimeoutDisabled(false);
170
168
  oauthCodeProcessedRef.current = false;
171
169
  };
@@ -186,18 +184,29 @@ const SignIn = ({ className, preferences, size = "medium", onSuccess, onError, v
186
184
  };
187
185
  };
188
186
  /**
189
- * Handle authId from URL and persist it via the storage manager so it survives URL cleanup.
190
- * ThunderIDReactClient.signIn() reads authId from storageManager.getHybridDataParameter('authId'),
191
- * not from raw sessionStorage, so we must use the same storage path here.
187
+ * Persist the authId from the URL against its execution so it survives URL cleanup.
188
+ * ThunderIDReactClient.signIn() reads it back with storageManager.getFlowAuthId(executionId),
189
+ * so another tab's sign-in cannot replace it.
192
190
  */
193
- const handleAuthId = async (authId) => {
194
- if (authId) try {
195
- await (await getStorageManager())?.setHybridDataParameter?.("authId", authId);
191
+ const handleAuthId = async (authId, executionId) => {
192
+ if (authId && executionId) try {
193
+ await (await getStorageManager())?.setFlowAuthId?.(executionId, authId);
196
194
  } catch {
197
195
  logger.warn("Failed to store authId in hybrid storage.");
198
196
  }
199
197
  };
200
198
  /**
199
+ * Remove the authId stored for an execution, leaving other tabs' entries in place.
200
+ */
201
+ const clearAuthId = async (executionId) => {
202
+ if (!executionId) return;
203
+ try {
204
+ await (await getStorageManager())?.removeFlowAuthId?.(executionId);
205
+ } catch {
206
+ logger.warn("Failed to clear authId from hybrid storage.");
207
+ }
208
+ };
209
+ /**
201
210
  * Clean up OAuth-related URL parameters from the browser URL.
202
211
  */
203
212
  const cleanupOAuthUrlParams = (includeNonce = false) => {
@@ -226,10 +235,10 @@ const SignIn = ({ className, preferences, size = "medium", onSuccess, onError, v
226
235
  * Set error state and call onError callback.
227
236
  * Ensures isFlowInitialized is true so errors can be displayed in the UI.
228
237
  */
229
- const setError = (error) => {
230
- setFlowError(error);
238
+ const setError = (source) => {
239
+ setFlowErrorSource(() => source);
231
240
  setIsFlowInitialized(true);
232
- onError?.(error);
241
+ onError?.(resolveFlowError(source, t));
233
242
  };
234
243
  /**
235
244
  * Handle OAuth error from URL parameters.
@@ -249,7 +258,7 @@ const SignIn = ({ className, preferences, size = "medium", onSuccess, onError, v
249
258
  if (redirectURL && window?.location) {
250
259
  if (response.executionId) setExecutionId(response.executionId);
251
260
  await setChallengeToken(response.challengeToken ?? null);
252
- await handleAuthId(getUrlParams().authId);
261
+ await handleAuthId(getUrlParams().authId, response.executionId);
253
262
  initiateOAuthRedirect(redirectURL, vendor);
254
263
  return true;
255
264
  }
@@ -275,26 +284,23 @@ const SignIn = ({ className, preferences, size = "medium", onSuccess, onError, v
275
284
  setExecutionId(response.executionId);
276
285
  await setChallengeToken(response.challengeToken ?? null);
277
286
  setIsFlowInitialized(true);
278
- setFlowError(new Error(extractErrorMessage(response, t)));
287
+ setFlowErrorSource(response);
279
288
  return true;
280
289
  }
281
290
  await clearFlowState();
282
- setError(new Error(extractErrorMessage(response, t)));
291
+ setError(response);
283
292
  cleanupFlowUrlParams();
284
293
  return true;
285
294
  }
286
295
  if (response.flowStatus === EmbeddedSignInFlowStatus.Complete) {
287
296
  const finalRedirectUrl = response?.redirectUrl || response?.redirect_uri || afterSignInUrl;
288
297
  setIsSubmitting(false);
298
+ const completedExecutionId = response.executionId || currentExecutionId || sessionStorage.getItem(`${vendor}_execution_id`);
289
299
  setExecutionId(null);
290
300
  await setChallengeToken(null);
291
301
  setIsFlowInitialized(false);
292
302
  sessionStorage.removeItem(`${vendor}_execution_id`);
293
- try {
294
- await (await getStorageManager())?.removeHybridDataParameter?.("authId");
295
- } catch {
296
- logger.warn("Failed to clear authId from hybrid storage after completion.");
297
- }
303
+ await clearAuthId(completedExecutionId);
298
304
  cleanupOAuthUrlParams(true);
299
305
  if (onSuccess) onSuccess({
300
306
  redirectUrl: finalRedirectUrl,
@@ -313,7 +319,7 @@ const SignIn = ({ className, preferences, size = "medium", onSuccess, onError, v
313
319
  const urlParams = getUrlParams();
314
320
  oauthCodeProcessedRef.current = false;
315
321
  setServerFieldErrors(null);
316
- await handleAuthId(urlParams.authId);
322
+ await handleAuthId(urlParams.authId, urlParams.executionId);
317
323
  const effectiveApplicationId = applicationId || urlParams.applicationId;
318
324
  const storedExecutionId = !urlParams.executionId ? sessionStorage.getItem(`${vendor}_execution_id`) : null;
319
325
  const resumeExecutionId = urlParams.executionId || storedExecutionId;
@@ -322,7 +328,7 @@ const SignIn = ({ className, preferences, size = "medium", onSuccess, onError, v
322
328
  return;
323
329
  }
324
330
  try {
325
- setFlowError(null);
331
+ setFlowErrorSource(null);
326
332
  let response;
327
333
  if (resumeExecutionId) try {
328
334
  response = await signIn({
@@ -332,26 +338,25 @@ const SignIn = ({ className, preferences, size = "medium", onSuccess, onError, v
332
338
  } catch (resumeError) {
333
339
  if (storedExecutionId && resumeExecutionId === storedExecutionId && resumeError instanceof ThunderIDAPIError && resumeError.statusCode === 400) {
334
340
  setExecutionId(null);
335
- try {
336
- await (await getStorageManager())?.removeHybridDataParameter?.("authId");
337
- } catch {
338
- logger.warn("Failed to clear authId from hybrid storage.");
339
- }
341
+ await clearAuthId(resumeExecutionId);
340
342
  if (!effectiveApplicationId) {
341
- setError(new ThunderIDRuntimeError(t("errors.signin.session.expired") || "Your session has expired. Please return to the application and sign in again.", "SIGN_IN_ERROR", "react"));
343
+ const expiredError = (translate) => new ThunderIDRuntimeError(translate("errors.signin.session.expired") || "Your session has expired. Please return to the application and sign in again.", "SIGN_IN_ERROR", "react");
344
+ setError(expiredError);
342
345
  return;
343
346
  }
344
347
  response = await signIn({
345
348
  applicationId: effectiveApplicationId,
346
349
  flowType: EmbeddedFlowType.Authentication,
347
- ...scopes && { scopes }
350
+ ...scopes && { scopes },
351
+ ...organizationUnitId && { ouId: organizationUnitId }
348
352
  });
349
353
  } else throw resumeError;
350
354
  }
351
355
  else response = await signIn({
352
356
  applicationId: effectiveApplicationId,
353
357
  flowType: EmbeddedFlowType.Authentication,
354
- ...scopes && { scopes }
358
+ ...scopes && { scopes },
359
+ ...organizationUnitId && { ouId: organizationUnitId }
355
360
  });
356
361
  if (await handleRedirection(response)) return;
357
362
  if (await handleTerminalResponse(response)) {
@@ -366,12 +371,13 @@ const SignIn = ({ className, preferences, size = "medium", onSuccess, onError, v
366
371
  setAdditionalData(normalizedAdditionalData ?? {});
367
372
  setIsFlowInitialized(true);
368
373
  setIsTimeoutDisabled(false);
374
+ await handleAuthId(urlParams.authId, normalizedExecutionId);
369
375
  cleanupFlowUrlParams();
370
376
  }
371
377
  } catch (error) {
372
378
  const err = error;
373
379
  await clearFlowState();
374
- setError(err instanceof ThunderIDRuntimeError ? err : new Error(extractErrorMessage(err, t)));
380
+ setError(err);
375
381
  initializationAttemptedRef.current = false;
376
382
  }
377
383
  };
@@ -384,7 +390,7 @@ const SignIn = ({ className, preferences, size = "medium", onSuccess, onError, v
384
390
  handleOAuthError(urlParams.error, urlParams.errorDescription);
385
391
  return;
386
392
  }
387
- handleAuthId(urlParams.authId);
393
+ handleAuthId(urlParams.authId, urlParams.executionId);
388
394
  }, []);
389
395
  useEffect(() => {
390
396
  const currentUrlParams = getUrlParams();
@@ -436,7 +442,7 @@ const SignIn = ({ className, preferences, size = "medium", onSuccess, onError, v
436
442
  } catch (e) {}
437
443
  try {
438
444
  setIsSubmitting(true);
439
- setFlowError(null);
445
+ setFlowErrorSource(null);
440
446
  setServerFieldErrors(null);
441
447
  const response = await signIn({
442
448
  executionId: effectiveExecutionId,
@@ -473,12 +479,12 @@ const SignIn = ({ className, preferences, size = "medium", onSuccess, onError, v
473
479
  cleanupFlowUrlParams();
474
480
  const responseFieldErrors = response.data?.fieldErrors;
475
481
  if (responseFieldErrors && responseFieldErrors.length > 0) setServerFieldErrors(responseFieldErrors);
476
- if (response?.error) setFlowError(new Error(extractErrorMessage(response, t)));
482
+ if (response?.error) setFlowErrorSource(response);
477
483
  }
478
484
  } catch (error) {
479
485
  const err = error;
480
486
  await clearFlowState();
481
- setError(err instanceof ThunderIDRuntimeError ? err : new Error(extractErrorMessage(err, t)));
487
+ setError(err);
482
488
  return;
483
489
  } finally {
484
490
  setIsSubmitting(false);
@@ -505,7 +511,7 @@ const SignIn = ({ className, preferences, size = "medium", onSuccess, onError, v
505
511
  }
506
512
  const handleTimeout = () => {
507
513
  setIsTimeoutDisabled(true);
508
- const expiredError = () => new Error(t("errors.signin.timeout") || "Time allowed to complete the step has expired.");
514
+ const expiredError = (translate) => new Error(translate("errors.signin.timeout") || "Time allowed to complete the step has expired.");
509
515
  const context = timeoutContextRef.current;
510
516
  const actionId = context?.hasConsentPrompt ? findConsentSubmitActionId(context.components) : void 0;
511
517
  if (actionId && context && timeoutSubmittedForRef.current !== timeoutMs) {
@@ -513,10 +519,10 @@ const SignIn = ({ className, preferences, size = "medium", onSuccess, onError, v
513
519
  context.submit({
514
520
  action: actionId,
515
521
  inputs: { [CONSENT_REASON_KEY]: ConsentConstants.REASON_TIMEOUT }
516
- }).catch(() => setError(expiredError()));
522
+ }).catch(() => setError(expiredError));
517
523
  return;
518
524
  }
519
- setError(expiredError());
525
+ setError(expiredError);
520
526
  };
521
527
  const timerId = setTimeout(handleTimeout, Math.max(0, timeoutMs - Date.now()));
522
528
  return () => clearTimeout(timerId);
@@ -596,8 +602,7 @@ const SignIn = ({ className, preferences, size = "medium", onSuccess, onError, v
596
602
  error,
597
603
  isActive: false
598
604
  }));
599
- setFlowError(error);
600
- onError?.(error);
605
+ setError(error);
601
606
  });
602
607
  }, [
603
608
  passkeyState.isActive,
@@ -1 +1 @@
1
- {"version":3,"file":"SignIn.js","names":["submitActions: EmbeddedFlowComponent[]","SignIn: FC<SignInProps>","useThunderID","useTranslation","challengeTokenRef: any","initializationAttemptedRef: any","oauthCodeProcessedRef: any","passkeyProcessedRef: any","tempData: any","storageManager: any","urlParams: any","url: any","redirectURL: any","finalRedirectUrl: any","effectiveApplicationId: any","storedExecutionId: any","resumeExecutionId: any","response: EmbeddedSignInFlowResponse","err: any","currentUrlParams: any","effectiveExecutionId: any","processedInputs: Record<string, any>","consentReason: string | undefined","consentPromptRawData: any","purposes: any[]","found: any","submitAction: any","isConsentApprovalBlocked","reason: string | undefined","effectiveExecutionIdForPasskey: any","responseFieldErrors: FieldError[] | undefined","timeoutMs: number","actionId: string | undefined","timerId: ReturnType<typeof setTimeout>","inputs: Record<string, string>","passkeyResponse: any","passkeyResponseObj: any","renderPropFieldErrors: Record<string, string>","BaseSignIn"],"sources":["../../../../src/components/auth/SignIn/SignIn.tsx"],"sourcesContent":["// Copyright 2025-2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n ThunderIDRuntimeError,\n ThunderIDAPIError,\n ConsentConstants,\n EmbeddedFlowComponent,\n EmbeddedFlowType,\n EmbeddedSignInFlowResponse,\n EmbeddedSignInFlowRequest,\n EmbeddedSignInFlowStatus,\n EmbeddedSignInFlowType,\n FieldError,\n FlowMetadataResponse,\n Preferences,\n logger,\n compileConsentDecisions,\n} from '@thunderid/browser';\nimport {FC, ReactElement, useState, useEffect, useRef, ReactNode} from 'react';\n// eslint-disable-next-line import/no-named-as-default\nimport BaseSignIn, {BaseSignInProps} from './BaseSignIn';\nimport useThunderID from '../../../contexts/ThunderID/useThunderID';\nimport {useOAuthCallback} from '../../../hooks/auth/useOAuthCallback';\nimport useTranslation from '../../../hooks/useTranslation';\nimport {extractErrorMessage, normalizeFlowResponse} from '../../../utils/flowTransformer';\nimport isConsentApprovalBlocked from '../../../utils/isConsentApprovalBlocked';\nimport {initiateOAuthRedirect} from '../../../utils/oauth';\nimport {handlePasskeyAuthentication, handlePasskeyRegistration} from '../../../utils/passkey';\n\n/**\n * Render props function parameters\n */\nexport interface SignInRenderProps {\n /**\n * Additional data from the flow response containing contextual information\n * like consent prompt details and session timeouts.\n */\n additionalData?: Record<string, any>;\n\n /**\n * Current flow components\n */\n components: EmbeddedFlowComponent[];\n\n /**\n * Current error if any\n */\n error: Error | null;\n\n /**\n * Server-side field-level validation errors from the most recent flow response,\n * collapsed to one message per field (first error wins). Empty when no validation\n * failures are active. Render-prop consumers should display these alongside their\n * own client-side validation errors.\n */\n fieldErrors: Record<string, string>;\n\n /**\n * Function to manually initialize the flow\n */\n initialize: () => Promise<void>;\n\n /**\n * Whether the flow has been initialized\n */\n isInitialized: boolean;\n\n /**\n * Loading state indicator\n */\n isLoading: boolean;\n\n /**\n * Flag indicating whether the flow step timeout has expired.\n * Consuming components can use this to disable submit buttons.\n */\n isTimeoutDisabled?: boolean;\n\n /**\n * Flow metadata returned by the platform (v2 only). `null` while loading or unavailable.\n */\n meta: FlowMetadataResponse | null;\n\n /**\n * Function to submit authentication data (primary)\n */\n onSubmit: (payload: EmbeddedSignInFlowRequest) => Promise<void>;\n}\n\n/**\n * Props for the SignIn component.\n * Matches the interface from the main SignIn component for consistency.\n */\nexport interface SignInProps {\n /**\n * Render props function for custom UI\n */\n children?: (props: SignInRenderProps) => ReactNode;\n\n /**\n * Custom CSS class name for the form container.\n */\n className?: string;\n\n /**\n * Callback function called when authentication fails.\n * @param error - The error that occurred during authentication.\n */\n onError?: (error: Error) => void;\n\n /**\n * Callback function called when authentication is successful.\n * @param authData - The authentication data returned upon successful completion.\n */\n onSuccess?: (authData: Record<string, any>) => void;\n\n /**\n * Component-level preferences to override global i18n and theme settings.\n * Preferences are deep-merged with global ones, with component preferences\n * taking precedence. Affects this component and all its descendants.\n */\n preferences?: Preferences;\n\n /**\n * When a field has been blurred at least once, re-run validation on every subsequent\n * keystroke so a rendered error clears the moment the value becomes valid. Doesn't\n * affect fields that have never been blurred — the user isn't shown errors while\n * initially typing. Default `false` preserves prior behavior.\n */\n revalidateOnChangeAfterBlur?: boolean;\n\n /**\n * Size variant for the component.\n */\n size?: 'small' | 'medium' | 'large';\n\n /**\n * Theme variant for the component.\n */\n variant?: BaseSignInProps['variant'];\n}\n\n/**\n * State for tracking passkey registration\n */\ninterface PasskeyState {\n actionId: string | null;\n challenge: string | null;\n creationOptions: string | null;\n error: Error | null;\n executionId: string | null;\n isActive: boolean;\n}\n\n/**\n * Sentinel input key carrying the reason a consent prompt was submitted. It is folded into the\n * compiled `consent_decisions` payload and stripped from the inputs, like `__consent_opt__` keys.\n */\nconst CONSENT_REASON_KEY = '__consent_reason__';\n\n/** Flattens a component tree into a single list, parents before their children. */\nconst flattenComponents = (comps: EmbeddedFlowComponent[] | undefined): EmbeddedFlowComponent[] =>\n (comps ?? []).flatMap((comp: EmbeddedFlowComponent) => [comp, ...flattenComponents(comp.components)]);\n\n/**\n * Finds the action to submit an expired consent prompt with. A non-primary submit action is\n * preferred so the payload reads as a denial, falling back to any submit action because the server\n * needs an action to route the prompt node. Returns undefined when the view has neither.\n */\nconst findConsentSubmitActionId = (comps: EmbeddedFlowComponent[] | undefined): string | undefined => {\n const submitActions: EmbeddedFlowComponent[] = flattenComponents(comps).filter(\n (comp: EmbeddedFlowComponent) => comp.id && comp.eventType?.toUpperCase() === 'SUBMIT',\n );\n const denyAction: EmbeddedFlowComponent | undefined = submitActions.find(\n (comp: EmbeddedFlowComponent) => comp.variant?.toLowerCase() !== 'primary',\n );\n\n return (denyAction ?? submitActions[0])?.id;\n};\n\n/**\n * A component-driven SignIn component that provides authentication flow with pre-built styling.\n * This component handles the flow API calls for authentication and delegates UI logic to BaseSignIn.\n * It automatically transforms simple input-based responses into component-driven UI format.\n *\n * @example\n * // Default UI\n * ```tsx\n * import { SignIn } from '@thunderid/react/component-driven';\n *\n * const App = () => {\n * return (\n * <SignIn\n * onSuccess={(authData) => {\n * console.log('Authentication successful:', authData);\n * }}\n * onError={(error) => {\n * console.error('Authentication failed:', error);\n * }}\n * size=\"medium\"\n * variant=\"outlined\"\n * />\n * );\n * };\n * ```\n *\n * @example\n * // Custom UI with render props\n * ```tsx\n * import { SignIn } from '@thunderid/react/component-driven';\n *\n * const App = () => {\n * return (\n * <SignIn\n * onSuccess={(authData) => console.log('Success:', authData)}\n * onError={(error) => console.error('Error:', error)}\n * >\n * {({signIn, isLoading, components, error, isInitialized}) => (\n * <div className=\"custom-signin\">\n * <h1>Custom Sign In</h1>\n * {!isInitialized ? (\n * <p>Initializing...</p>\n * ) : error ? (\n * <div className=\"error\">{error.message}</div>\n * ) : (\n * <form onSubmit={(e) => {\n * e.preventDefault();\n * signIn({inputs: {username: 'user', password: 'pass'}});\n * }}>\n * <button type=\"submit\" disabled={isLoading}>\n * {isLoading ? 'Signing in...' : 'Sign In'}\n * </button>\n * </form>\n * )}\n * </div>\n * )}\n * </SignIn>\n * );\n * };\n * ```\n */\nconst SignIn: FC<SignInProps> = ({\n className,\n preferences,\n size = 'medium',\n onSuccess,\n onError,\n variant,\n children,\n revalidateOnChangeAfterBlur,\n}: SignInProps): ReactElement => {\n const {applicationId, afterSignInUrl, signIn, isInitialized, isLoading, meta, getStorageManager, scopes, vendor} =\n useThunderID();\n const {t} = useTranslation(preferences?.i18n);\n\n // State management for the flow\n const [components, setComponents] = useState<EmbeddedFlowComponent[]>([]);\n const [additionalData, setAdditionalData] = useState<Record<string, any>>({});\n // Server-side validation errors from the most recent flow response. Updated on every\n // submission; cleared when the next submission begins so stale errors don't linger.\n const [serverFieldErrors, setServerFieldErrors] = useState<FieldError[] | null>(null);\n const [currentExecutionId, setCurrentExecutionId] = useState<string | null>(null);\n const challengeTokenRef: any = useRef<string | null>(null);\n const [isStorageReady, setIsStorageReady] = useState(false);\n const [isFlowInitialized, setIsFlowInitialized] = useState(false);\n const [flowError, setFlowError] = useState<Error | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isTimeoutDisabled, setIsTimeoutDisabled] = useState<boolean>(false);\n const [passkeyState, setPasskeyState] = useState<PasskeyState>({\n actionId: null,\n challenge: null,\n creationOptions: null,\n error: null,\n executionId: null,\n isActive: false,\n });\n const initializationAttemptedRef: any = useRef(false);\n const oauthCodeProcessedRef: any = useRef(false);\n const passkeyProcessedRef: any = useRef(false);\n // Deadline this component has already auto-submitted for, so a re-run of the timeout effect\n // cannot submit the same expired step twice.\n const timeoutSubmittedForRef = useRef<number | null>(null);\n // The timeout effect is keyed on the deadline alone, so a step that arrives carrying the same\n // deadline would otherwise leave the pending timer holding the previous step's context.\n const timeoutContextRef = useRef<{\n components: EmbeddedFlowComponent[];\n hasConsentPrompt: boolean;\n submit: (payload: EmbeddedSignInFlowRequest) => Promise<void>;\n } | null>(null);\n /**\n * Sets executionId between sessionStorage and state.\n * This ensures both are always in sync.\n */\n const setExecutionId = (executionId: string | null): void => {\n setCurrentExecutionId(executionId);\n if (executionId) {\n sessionStorage.setItem(`${vendor}_execution_id`, executionId);\n } else {\n sessionStorage.removeItem(`${vendor}_execution_id`);\n }\n };\n\n /**\n * Restore any challenge token persisted before an OAuth redirect.\n * Waits for SDK initialization before reading from storage.\n */\n useEffect(() => {\n if (!isInitialized) return;\n\n (async (): Promise<void> => {\n try {\n const storageManager: any = await getStorageManager();\n const tempData: any = await storageManager?.getTemporaryData();\n if (tempData?.challengeToken) {\n challengeTokenRef.current = tempData.challengeToken as string;\n }\n } finally {\n setIsStorageReady(true);\n }\n })();\n }, [isInitialized]);\n\n /**\n * Updates challengeTokenRef immediately (stale-closure safe) and persists via\n * the provider's StorageManager so the token survives OAuth redirects.\n */\n const setChallengeToken = async (challengeToken: string | null): Promise<void> => {\n challengeTokenRef.current = challengeToken;\n try {\n const storageManager: any = await getStorageManager();\n if (storageManager) {\n if (challengeToken) {\n await storageManager.setTemporaryDataParameter('challengeToken', challengeToken);\n } else {\n await storageManager.removeTemporaryDataParameter('challengeToken');\n }\n }\n } catch {\n logger.warn('Failed to persist challenge token in storage.');\n }\n };\n\n /**\n * Clear all flow-related storage and state.\n */\n const clearFlowState = async (): Promise<void> => {\n // Clear the expired flow state to prevent rendering a stale form with a null executionId.\n // Kept before the first await so callers that do not await this function still apply the\n // reset in one batch, ahead of the setError that follows.\n setExecutionId(null);\n setComponents([]);\n setAdditionalData({});\n setIsFlowInitialized(false);\n await setChallengeToken(null);\n try {\n const storageManager: any = await getStorageManager();\n await storageManager?.removeHybridDataParameter?.('authId');\n } catch {\n logger.warn('Failed to clear authId from hybrid storage.');\n }\n setIsTimeoutDisabled(false);\n // Reset refs to allow new flows to start properly\n oauthCodeProcessedRef.current = false;\n };\n\n /**\n * Parse URL parameters used in flows.\n */\n const getUrlParams = (): any => {\n const urlParams: any = new URL(window?.location?.href ?? '').searchParams;\n\n return {\n applicationId: urlParams.get('applicationId'),\n authId: urlParams.get('authId'),\n code: urlParams.get('code'),\n error: urlParams.get('error'),\n errorDescription: urlParams.get('error_description'),\n executionId: urlParams.get('executionId'),\n nonce: urlParams.get('nonce'),\n state: urlParams.get('state'),\n };\n };\n\n /**\n * Handle authId from URL and persist it via the storage manager so it survives URL cleanup.\n * ThunderIDReactClient.signIn() reads authId from storageManager.getHybridDataParameter('authId'),\n * not from raw sessionStorage, so we must use the same storage path here.\n */\n const handleAuthId = async (authId: string | null): Promise<void> => {\n if (authId) {\n try {\n const storageManager: any = await getStorageManager();\n await storageManager?.setHybridDataParameter?.('authId', authId);\n } catch {\n logger.warn('Failed to store authId in hybrid storage.');\n }\n }\n };\n\n /**\n * Clean up OAuth-related URL parameters from the browser URL.\n */\n const cleanupOAuthUrlParams = (includeNonce = false): void => {\n if (!window?.location?.href) return;\n const url: any = new URL(window.location.href);\n url.searchParams.delete('error');\n url.searchParams.delete('error_description');\n url.searchParams.delete('code');\n url.searchParams.delete('state');\n if (includeNonce) {\n url.searchParams.delete('nonce');\n }\n window?.history?.replaceState({}, '', url.toString());\n };\n\n /**\n * Clean up flow-related URL parameters (executionId, authId) from the browser URL.\n * Used after executionId is set in state to prevent using invalidated executionId from URL.\n */\n const cleanupFlowUrlParams = (): void => {\n if (!window?.location?.href) return;\n const url: any = new URL(window.location.href);\n url.searchParams.delete('executionId');\n url.searchParams.delete('authId');\n url.searchParams.delete('applicationId');\n window?.history?.replaceState({}, '', url.toString());\n };\n\n /**\n * Set error state and call onError callback.\n * Ensures isFlowInitialized is true so errors can be displayed in the UI.\n */\n const setError = (error: Error): void => {\n setFlowError(error);\n setIsFlowInitialized(true);\n onError?.(error);\n };\n\n /**\n * Handle OAuth error from URL parameters.\n * Clears flow state, creates error, and cleans up URL.\n */\n const handleOAuthError = (error: string, errorDescription: string | null): void => {\n clearFlowState();\n const errorMessage: any = errorDescription || `OAuth error: ${error}`;\n const err: any = new ThunderIDRuntimeError(errorMessage, 'SIGN_IN_ERROR', 'react');\n setError(err);\n cleanupOAuthUrlParams(true);\n };\n\n /**\n * Handle REDIRECTION response by storing flow state and redirecting to OAuth provider.\n */\n const handleRedirection = async (response: EmbeddedSignInFlowResponse): Promise<boolean> => {\n if (response.type === EmbeddedSignInFlowType.Redirection) {\n const redirectURL: any = (response.data as any)?.redirectURL || (response as any)?.redirectURL;\n\n if (redirectURL && window?.location) {\n if (response.executionId) {\n setExecutionId(response.executionId);\n }\n await setChallengeToken(response.challengeToken ?? null);\n\n const urlParams: any = getUrlParams();\n await handleAuthId(urlParams.authId);\n\n initiateOAuthRedirect(redirectURL, vendor);\n return true;\n }\n }\n return false;\n };\n\n /**\n * Handle ERROR and COMPLETE responses. Returns true if fully handled.\n * ERROR + executionId: recoverable — session preserved for retry.\n * ERROR + no executionId: terminal — clear state and surface the error.\n */\n const handleTerminalResponse = async (response: EmbeddedSignInFlowResponse): Promise<boolean> => {\n if (response.flowStatus === EmbeddedSignInFlowStatus.Error) {\n // Propagate OAuth error to the client\n if (response.redirectUrl && window?.location) {\n setIsSubmitting(false);\n await clearFlowState();\n cleanupOAuthUrlParams(true);\n onError?.(new Error(extractErrorMessage(response, t)));\n window.location.href = response.redirectUrl;\n\n return true;\n }\n\n if (response.executionId) {\n // Recoverable: session still alive. Show inline error without firing onError.\n setExecutionId(response.executionId);\n await setChallengeToken(response.challengeToken ?? null);\n setIsFlowInitialized(true);\n setFlowError(new Error(extractErrorMessage(response, t)));\n return true;\n }\n // Terminal: backend invalidated the session — clear all state.\n await clearFlowState();\n setError(new Error(extractErrorMessage(response, t)));\n cleanupFlowUrlParams();\n return true;\n }\n\n if (response.flowStatus === EmbeddedSignInFlowStatus.Complete) {\n // Get redirectUrl from response (from /oauth2/auth/callback) or fall back to afterSignInUrl\n const redirectUrl: any = (response as any)?.redirectUrl || (response as any)?.redirect_uri;\n const finalRedirectUrl: any = redirectUrl || afterSignInUrl;\n\n // Clear submitting state before redirect\n setIsSubmitting(false);\n\n // Clear all OAuth-related storage on successful completion\n setExecutionId(null);\n await setChallengeToken(null);\n setIsFlowInitialized(false);\n sessionStorage.removeItem(`${vendor}_execution_id`);\n try {\n const storageManager: any = await getStorageManager();\n await storageManager?.removeHybridDataParameter?.('authId');\n } catch {\n logger.warn('Failed to clear authId from hybrid storage after completion.');\n }\n\n // Clean up OAuth URL params before redirect\n cleanupOAuthUrlParams(true);\n\n if (onSuccess) {\n onSuccess({\n redirectUrl: finalRedirectUrl,\n ...(response.data || {}),\n });\n }\n\n if (finalRedirectUrl && window?.location) {\n window.location.href = finalRedirectUrl;\n }\n\n return true;\n }\n\n return false;\n };\n\n /**\n * Initialize the authentication flow.\n * Priority: executionId > applicationId (from context) > applicationId (from URL)\n */\n const initializeFlow = async (): Promise<void> => {\n const urlParams: any = getUrlParams();\n\n // Reset OAuth code processed ref when starting a new flow\n oauthCodeProcessedRef.current = false;\n // Clear stale serverFieldErrors so the new flow doesn't inherit them via render-prop.\n setServerFieldErrors(null);\n\n await handleAuthId(urlParams.authId);\n\n const effectiveApplicationId: any = applicationId || urlParams.applicationId;\n\n // On a page refresh the executionId is no longer in the URL (it is scrubbed by\n // cleanupFlowUrlParams after the first load). Fall back to the executionId persisted in\n // sessionStorage so the in-progress flow can be resumed instead of starting a new flow.\n // This is required for authorization_code apps where direct new-flow initiation is blocked\n // server-side and the flow must be initiated through the OAuth /authorize endpoint.\n const storedExecutionId: any = !urlParams.executionId ? sessionStorage.getItem(`${vendor}_execution_id`) : null;\n const resumeExecutionId: any = urlParams.executionId || storedExecutionId;\n\n if (!resumeExecutionId && !effectiveApplicationId) {\n const error: any = new ThunderIDRuntimeError(\n 'Either executionId or applicationId is required for authentication',\n 'SIGN_IN_ERROR',\n 'react',\n );\n setError(error);\n\n return;\n }\n\n try {\n setFlowError(null);\n\n let response: EmbeddedSignInFlowResponse;\n\n if (resumeExecutionId) {\n try {\n response = (await signIn({\n executionId: resumeExecutionId,\n ...(challengeTokenRef.current ? {challengeToken: challengeTokenRef.current} : {}),\n })) as EmbeddedSignInFlowResponse;\n } catch (resumeError) {\n // Only treat a stale/expired session (HTTP 400 from the server, meaning the stored\n // executionId is no longer valid) as a recoverable condition. Transient failures\n // such as 5xx server errors or network errors are rethrown so they surface correctly.\n const isStaleSession: boolean =\n storedExecutionId &&\n resumeExecutionId === storedExecutionId &&\n resumeError instanceof ThunderIDAPIError &&\n resumeError.statusCode === 400;\n\n if (isStaleSession) {\n setExecutionId(null);\n try {\n const storageManager: any = await getStorageManager();\n await storageManager?.removeHybridDataParameter?.('authId');\n } catch {\n logger.warn('Failed to clear authId from hybrid storage.');\n }\n if (!effectiveApplicationId) {\n const expiredError: any = new ThunderIDRuntimeError(\n t('errors.signin.session.expired') ||\n 'Your session has expired. Please return to the application and sign in again.',\n 'SIGN_IN_ERROR',\n 'react',\n );\n setError(expiredError);\n return;\n }\n response = (await signIn({\n applicationId: effectiveApplicationId,\n flowType: EmbeddedFlowType.Authentication,\n ...(scopes && {scopes}),\n })) as EmbeddedSignInFlowResponse;\n } else {\n throw resumeError;\n }\n }\n } else {\n response = (await signIn({\n applicationId: effectiveApplicationId,\n flowType: EmbeddedFlowType.Authentication,\n ...(scopes && {scopes}),\n })) as EmbeddedSignInFlowResponse;\n }\n\n if (await handleRedirection(response)) {\n return;\n }\n\n // Handle a flow that completes (or errors) on the very first step — e.g. a reused SSO\n // session lets the backend return COMPLETE immediately with no UI components. Without\n // this the UI would fall through with no components and spin forever.\n if (await handleTerminalResponse(response)) {\n // Only reset the init gate for unrecoverable Error responses so the user can retry;\n // Complete-without-redirect would otherwise kick off a fresh flow unintentionally.\n if (response.flowStatus === EmbeddedSignInFlowStatus.Error && !response.executionId) {\n initializationAttemptedRef.current = false;\n }\n return;\n }\n\n const {\n executionId: normalizedExecutionId,\n components: normalizedComponents,\n additionalData: normalizedAdditionalData,\n } = normalizeFlowResponse(\n response,\n t,\n {\n resolveTranslations: false,\n },\n meta,\n );\n\n await setChallengeToken(response.challengeToken ?? null);\n\n if (normalizedExecutionId && normalizedComponents) {\n setExecutionId(normalizedExecutionId);\n setComponents(normalizedComponents);\n setAdditionalData(normalizedAdditionalData ?? {});\n setIsFlowInitialized(true);\n setIsTimeoutDisabled(false);\n // Clean up executionId from URL after setting it in state\n cleanupFlowUrlParams();\n }\n } catch (error) {\n const err: any = error;\n await clearFlowState();\n\n setError(err instanceof ThunderIDRuntimeError ? err : new Error(extractErrorMessage(err, t)));\n initializationAttemptedRef.current = false;\n }\n };\n\n /**\n * Initialize the flow and handle cleanup of stale flow state.\n */\n useEffect(() => {\n const urlParams: any = getUrlParams();\n\n // Check for OAuth error in URL\n if (urlParams.error) {\n handleOAuthError(urlParams.error, urlParams.errorDescription);\n return;\n }\n\n handleAuthId(urlParams.authId);\n\n // Skip OAuth code processing - let the dedicated OAuth useEffect handle it\n // No action needed here as the dedicated useEffect will handle it\n }, []);\n\n useEffect(() => {\n // Only initialize if we're not processing an OAuth callback or submission.\n // Wait for isStorageReady so the challenge token is restored from storage before\n // we attempt to resume a persisted executionId — the server requires it.\n const currentUrlParams: any = getUrlParams();\n if (\n isInitialized &&\n isStorageReady &&\n !isLoading &&\n !isFlowInitialized &&\n !initializationAttemptedRef.current &&\n !currentExecutionId &&\n !currentUrlParams.code &&\n !currentUrlParams.state &&\n !isSubmitting &&\n !oauthCodeProcessedRef.current\n ) {\n initializationAttemptedRef.current = true;\n initializeFlow();\n }\n }, [isInitialized, isStorageReady, isLoading, isFlowInitialized, currentExecutionId]);\n\n /**\n * Handle form submission from BaseSignIn or render props.\n */\n const handleSubmit = async (payload: EmbeddedSignInFlowRequest): Promise<void> => {\n // Use executionId from payload if available, otherwise fall back to currentExecutionId\n const effectiveExecutionId: any = payload.executionId || currentExecutionId;\n\n if (!effectiveExecutionId) {\n throw new Error('No active flow ID');\n }\n\n let processedInputs: Record<string, any> = {...payload.inputs};\n\n // Read and strip the sentinel up front so it can never reach the wire as an input\n const consentReason: string | undefined = processedInputs[CONSENT_REASON_KEY];\n delete processedInputs[CONSENT_REASON_KEY];\n\n // Auto-compile consent decisions if we are currently on a consent prompt step\n if (additionalData?.['consentPrompt']) {\n try {\n const consentPromptRawData: any = additionalData['consentPrompt'];\n const purposes: any[] =\n typeof consentPromptRawData === 'string'\n ? JSON.parse(consentPromptRawData)\n : consentPromptRawData.purposes || consentPromptRawData;\n\n // Find the action component to determine if it was a deny action\n let isDeny = false;\n if (payload.action) {\n // Flatten components to find the action\n const findAction = (comps: any[]): any => {\n if (!comps || comps.length === 0) return null;\n\n const found: any = comps.find((c: any) => c.id === payload.action);\n if (found) return found;\n\n return comps.reduce((acc: any, c: any) => {\n if (acc) return acc;\n if (c.components) return findAction(c.components);\n return null;\n }, null);\n };\n\n const submitAction: any = findAction(components);\n\n if (submitAction && submitAction.variant?.toLowerCase() !== 'primary') {\n isDeny = true;\n }\n }\n\n // An expired prompt is never an approval, whichever action carried the submission\n if (consentReason === ConsentConstants.REASON_TIMEOUT) {\n isDeny = true;\n }\n\n // Approval waits while an approved authorization detail shows a value that cannot be submitted\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n if (!isDeny && isConsentApprovalBlocked(purposes, processedInputs)) {\n return;\n }\n\n // An explicit denial carries a reason too, so the server never has to infer one\n const reason: string | undefined = consentReason ?? (isDeny ? ConsentConstants.REASON_USER_DENIED : undefined);\n\n processedInputs = compileConsentDecisions(processedInputs, purposes, {\n approved: !isDeny,\n ...(reason ? {reason} : {}),\n });\n } catch (e) {\n // Failed to construct consent_decisions payload automatically\n }\n }\n\n try {\n setIsSubmitting(true);\n setFlowError(null);\n // Clear any field errors from the previous response before the new round-trip.\n setServerFieldErrors(null);\n\n const response: EmbeddedSignInFlowResponse = (await signIn({\n executionId: effectiveExecutionId,\n ...payload,\n inputs: processedInputs,\n ...(challengeTokenRef.current ? {challengeToken: challengeTokenRef.current} : {}),\n })) as EmbeddedSignInFlowResponse;\n\n if (await handleRedirection(response)) {\n return;\n }\n if (\n response.data?.additionalData?.['passkeyChallenge'] ||\n response.data?.additionalData?.['passkeyCreationOptions']\n ) {\n const {passkeyChallenge, passkeyCreationOptions}: any = response.data.additionalData;\n const effectiveExecutionIdForPasskey: any = response.executionId || effectiveExecutionId;\n\n // Reset passkey processed ref to allow processing\n passkeyProcessedRef.current = false;\n\n await setChallengeToken(response.challengeToken ?? null);\n\n // Set passkey state to trigger the passkey\n setPasskeyState({\n actionId: 'submit',\n challenge: passkeyChallenge,\n creationOptions: passkeyCreationOptions,\n error: null,\n executionId: effectiveExecutionIdForPasskey,\n isActive: true,\n });\n setIsSubmitting(false);\n\n return;\n }\n\n // Handle terminal flow statuses before normalization.\n if (await handleTerminalResponse(response)) {\n return;\n }\n\n const {\n executionId: normalizedExecutionId,\n components: normalizedComponents,\n additionalData: normalizedAdditionalData,\n } = normalizeFlowResponse(\n response,\n t,\n {\n resolveTranslations: false,\n },\n meta,\n );\n\n // Always update challenge token on any INCOMPLETE response — token rotates every step.\n await setChallengeToken(response.challengeToken ?? null);\n\n // Update executionId if response contains a new one\n if (normalizedExecutionId && normalizedComponents) {\n setExecutionId(normalizedExecutionId);\n setComponents(normalizedComponents);\n setAdditionalData(normalizedAdditionalData ?? {});\n setIsTimeoutDisabled(false);\n // Ensure flow is marked as initialized when we have components\n setIsFlowInitialized(true);\n // Clean up executionId from URL after setting it in state\n cleanupFlowUrlParams();\n\n // Surface server-side validation failures so BaseSignIn can inject them into\n // the form-level fieldErrors state used by the render-prop / default UI.\n const responseFieldErrors: FieldError[] | undefined = (response.data as any)?.fieldErrors;\n if (responseFieldErrors && responseFieldErrors.length > 0) {\n setServerFieldErrors(responseFieldErrors);\n }\n\n // Display error from INCOMPLETE response\n if ((response as any)?.error) {\n setFlowError(new Error(extractErrorMessage(response, t)));\n }\n }\n } catch (error) {\n const err: any = error;\n await clearFlowState();\n\n setError(err instanceof ThunderIDRuntimeError ? err : new Error(extractErrorMessage(err, t)));\n return;\n } finally {\n setIsSubmitting(false);\n }\n };\n\n /**\n * Handle step timeout if configured in additionalData.\n *\n * An expired consent prompt is auto-submitted as a denial carrying the timeout reason, because its\n * actions no longer lead anywhere and the user would otherwise be stranded on the prompt. The\n * server discards those decisions and records nothing. Every other kind of step surfaces the\n * expiry error instead.\n */\n timeoutContextRef.current = {\n components,\n hasConsentPrompt: Boolean(additionalData?.['consentPrompt']),\n submit: handleSubmit,\n };\n\n useEffect(() => {\n const timeoutMs: number = Number(additionalData?.['stepTimeout']) || 0;\n if (timeoutMs <= 0 || !isFlowInitialized) {\n setIsTimeoutDisabled(false);\n return undefined;\n }\n\n const handleTimeout = (): void => {\n setIsTimeoutDisabled(true);\n\n const expiredError = (): Error =>\n new Error(t('errors.signin.timeout') || 'Time allowed to complete the step has expired.');\n\n // Read through the ref so the timer always sees the step that is on screen when it fires\n const context = timeoutContextRef.current;\n const actionId: string | undefined = context?.hasConsentPrompt\n ? findConsentSubmitActionId(context.components)\n : undefined;\n\n // Without an action the prompt node cannot be routed, so there is nothing to submit\n if (actionId && context && timeoutSubmittedForRef.current !== timeoutMs) {\n timeoutSubmittedForRef.current = timeoutMs;\n context\n .submit({action: actionId, inputs: {[CONSENT_REASON_KEY]: ConsentConstants.REASON_TIMEOUT}})\n .catch(() => setError(expiredError()));\n return;\n }\n\n setError(expiredError());\n };\n\n const timerId: ReturnType<typeof setTimeout> = setTimeout(handleTimeout, Math.max(0, timeoutMs - Date.now()));\n\n return () => clearTimeout(timerId);\n }, [additionalData?.['stepTimeout'], isFlowInitialized, t]);\n\n /**\n * Handle authentication errors.\n */\n const handleError = (error: Error): void => {\n setError(error);\n };\n\n useOAuthCallback({\n currentExecutionId,\n executionIdStorageKey: `${vendor}_execution_id`,\n isInitialized: isInitialized && !isLoading && isStorageReady,\n isSubmitting,\n onError: (err: any) => {\n clearFlowState();\n setError(err instanceof Error ? err : new Error(String(err)));\n },\n onSubmit: async (payload: any) => handleSubmit({executionId: payload.executionId, inputs: payload.inputs}),\n processedRef: oauthCodeProcessedRef,\n setExecutionId,\n });\n\n /**\n * Handle passkey authentication/registration when passkey state becomes active.\n * This effect auto-triggers the browser passkey popup and submits the result.\n */\n useEffect(() => {\n if (\n !passkeyState.isActive ||\n (!passkeyState.challenge && !passkeyState.creationOptions) ||\n !passkeyState.executionId\n ) {\n return;\n }\n\n // Prevent re-processing\n if (passkeyProcessedRef.current) {\n return;\n }\n passkeyProcessedRef.current = true;\n\n const performPasskeyProcess = async (): Promise<void> => {\n let inputs: Record<string, string>;\n\n if (passkeyState.challenge) {\n const passkeyResponse: any = await handlePasskeyAuthentication(passkeyState.challenge);\n const passkeyResponseObj: any = JSON.parse(passkeyResponse);\n\n inputs = {\n authenticatorData: passkeyResponseObj.response.authenticatorData,\n clientDataJSON: passkeyResponseObj.response.clientDataJSON,\n credentialId: passkeyResponseObj.id,\n signature: passkeyResponseObj.response.signature,\n userHandle: passkeyResponseObj.response.userHandle,\n };\n } else if (passkeyState.creationOptions) {\n const passkeyResponse: any = await handlePasskeyRegistration(passkeyState.creationOptions);\n const passkeyResponseObj: any = JSON.parse(passkeyResponse);\n\n inputs = {\n attestationObject: passkeyResponseObj.response.attestationObject,\n clientDataJSON: passkeyResponseObj.response.clientDataJSON,\n credentialId: passkeyResponseObj.id,\n };\n } else {\n throw new Error('No passkey challenge or creation options available');\n }\n\n await handleSubmit({\n executionId: passkeyState.executionId ?? undefined,\n inputs,\n });\n };\n\n performPasskeyProcess()\n .then(() => {\n setPasskeyState({\n actionId: null,\n challenge: null,\n creationOptions: null,\n error: null,\n executionId: null,\n isActive: false,\n });\n })\n .catch((error: any) => {\n setPasskeyState((prev: any) => ({...prev, error: error as Error, isActive: false}));\n setFlowError(error as Error);\n onError?.(error as Error);\n });\n }, [passkeyState.isActive, passkeyState.challenge, passkeyState.creationOptions, passkeyState.executionId]);\n\n if (children) {\n // Collapse the server FieldError[] array to a single message per field map for\n // render-prop consumers. First error per field wins. Multi-error cases per\n // field are rare in practice (server typically returns one rule failure per\n // field in current flows) and consumers needing the full array can still read\n // it from the raw flow response.\n const renderPropFieldErrors: Record<string, string> = {};\n if (serverFieldErrors) {\n for (const fe of serverFieldErrors) {\n if (!(fe.identifier in renderPropFieldErrors)) {\n renderPropFieldErrors[fe.identifier] = fe.message;\n }\n }\n }\n\n const renderProps: SignInRenderProps = {\n additionalData,\n components,\n error: flowError,\n fieldErrors: renderPropFieldErrors,\n initialize: initializeFlow,\n isInitialized: isFlowInitialized,\n isLoading: isLoading || isSubmitting || !isInitialized,\n isTimeoutDisabled,\n meta,\n onSubmit: handleSubmit,\n };\n\n return <>{children(renderProps)}</>;\n }\n // Otherwise, render the default BaseSignIn component\n return (\n <BaseSignIn\n additionalData={additionalData}\n components={components}\n isLoading={isLoading || !isInitialized || !isFlowInitialized}\n isTimeoutDisabled={isTimeoutDisabled}\n onSubmit={handleSubmit}\n onError={handleError}\n error={flowError}\n className={className}\n size={size}\n variant={variant}\n preferences={preferences}\n revalidateOnChangeAfterBlur={revalidateOnChangeAfterBlur}\n serverFieldErrors={serverFieldErrors}\n />\n );\n};\n\nexport default SignIn;\n"],"mappings":"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"}
1
+ {"version":3,"file":"SignIn.js","names":["submitActions: EmbeddedFlowComponent[]","SignIn: FC<SignInProps>","useThunderID","useTranslation","challengeTokenRef: any","flowError: Error | null","initializationAttemptedRef: any","oauthCodeProcessedRef: any","passkeyProcessedRef: any","tempData: any","storageManager: any","executionIdToClear: string | null","urlParams: any","url: any","redirectURL: any","finalRedirectUrl: any","completedExecutionId: string | null","effectiveApplicationId: any","storedExecutionId: any","resumeExecutionId: any","response: EmbeddedSignInFlowResponse","expiredError: FlowErrorBuilder","err: any","currentUrlParams: any","effectiveExecutionId: any","processedInputs: Record<string, any>","consentReason: string | undefined","consentPromptRawData: any","purposes: any[]","found: any","submitAction: any","isConsentApprovalBlocked","reason: string | undefined","effectiveExecutionIdForPasskey: any","responseFieldErrors: FieldError[] | undefined","timeoutMs: number","actionId: string | undefined","timerId: ReturnType<typeof setTimeout>","inputs: Record<string, string>","passkeyResponse: any","passkeyResponseObj: any","renderPropFieldErrors: Record<string, string>","BaseSignIn"],"sources":["../../../../src/components/auth/SignIn/SignIn.tsx"],"sourcesContent":["// Copyright 2025-2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n ThunderIDRuntimeError,\n ThunderIDAPIError,\n ConsentConstants,\n EmbeddedFlowComponent,\n EmbeddedFlowType,\n EmbeddedSignInFlowResponse,\n EmbeddedSignInFlowRequest,\n EmbeddedSignInFlowStatus,\n EmbeddedSignInFlowType,\n FieldError,\n FlowMetadataResponse,\n Preferences,\n logger,\n compileConsentDecisions,\n} from '@thunderid/browser';\nimport {FC, ReactElement, useState, useEffect, useMemo, useRef, ReactNode} from 'react';\n// eslint-disable-next-line import/no-named-as-default\nimport BaseSignIn, {BaseSignInProps} from './BaseSignIn';\nimport useThunderID from '../../../contexts/ThunderID/useThunderID';\nimport {useOAuthCallback} from '../../../hooks/auth/useOAuthCallback';\nimport useTranslation from '../../../hooks/useTranslation';\nimport {\n extractErrorMessage,\n FlowErrorBuilder,\n normalizeFlowResponse,\n resolveFlowError,\n} from '../../../utils/flowTransformer';\nimport isConsentApprovalBlocked from '../../../utils/isConsentApprovalBlocked';\nimport {initiateOAuthRedirect} from '../../../utils/oauth';\nimport {handlePasskeyAuthentication, handlePasskeyRegistration} from '../../../utils/passkey';\n\n/**\n * Render props function parameters\n */\nexport interface SignInRenderProps {\n /**\n * Additional data from the flow response containing contextual information\n * like consent prompt details and session timeouts.\n */\n additionalData?: Record<string, any>;\n\n /**\n * Current flow components\n */\n components: EmbeddedFlowComponent[];\n\n /**\n * Current error if any\n */\n error: Error | null;\n\n /**\n * Server-side field-level validation errors from the most recent flow response,\n * collapsed to one message per field (first error wins). Empty when no validation\n * failures are active. Render-prop consumers should display these alongside their\n * own client-side validation errors.\n */\n fieldErrors: Record<string, string>;\n\n /**\n * Function to manually initialize the flow\n */\n initialize: () => Promise<void>;\n\n /**\n * Whether the flow has been initialized\n */\n isInitialized: boolean;\n\n /**\n * Loading state indicator\n */\n isLoading: boolean;\n\n /**\n * Flag indicating whether the flow step timeout has expired.\n * Consuming components can use this to disable submit buttons.\n */\n isTimeoutDisabled?: boolean;\n\n /**\n * Flow metadata returned by the platform (v2 only). `null` while loading or unavailable.\n */\n meta: FlowMetadataResponse | null;\n\n /**\n * Function to submit authentication data (primary)\n */\n onSubmit: (payload: EmbeddedSignInFlowRequest) => Promise<void>;\n}\n\n/**\n * Props for the SignIn component.\n * Matches the interface from the main SignIn component for consistency.\n */\nexport interface SignInProps {\n /**\n * Render props function for custom UI\n */\n children?: (props: SignInRenderProps) => ReactNode;\n\n /**\n * Custom CSS class name for the form container.\n */\n className?: string;\n\n /**\n * Bounds the sign-in to this organization unit. Sent as `ouId` on the request that starts the\n * `AUTHENTICATION` flow only, never on a continuation.\n */\n organizationUnitId?: string;\n\n /**\n * Callback function called when authentication fails.\n * @param error - The error that occurred during authentication.\n */\n onError?: (error: Error) => void;\n\n /**\n * Callback function called when authentication is successful.\n * @param authData - The authentication data returned upon successful completion.\n */\n onSuccess?: (authData: Record<string, any>) => void;\n\n /**\n * Component-level preferences to override global i18n and theme settings.\n * Preferences are deep-merged with global ones, with component preferences\n * taking precedence. Affects this component and all its descendants.\n */\n preferences?: Preferences;\n\n /**\n * When a field has been blurred at least once, re-run validation on every subsequent\n * keystroke so a rendered error clears the moment the value becomes valid. Doesn't\n * affect fields that have never been blurred — the user isn't shown errors while\n * initially typing. Default `false` preserves prior behavior.\n */\n revalidateOnChangeAfterBlur?: boolean;\n\n /**\n * Size variant for the component.\n */\n size?: 'small' | 'medium' | 'large';\n\n /**\n * Theme variant for the component.\n */\n variant?: BaseSignInProps['variant'];\n}\n\n/**\n * State for tracking passkey registration\n */\ninterface PasskeyState {\n actionId: string | null;\n challenge: string | null;\n creationOptions: string | null;\n error: Error | null;\n executionId: string | null;\n isActive: boolean;\n}\n\n/**\n * Sentinel input key carrying the reason a consent prompt was submitted. It is folded into the\n * compiled `consent_decisions` payload and stripped from the inputs, like `__consent_opt__` keys.\n */\nconst CONSENT_REASON_KEY = '__consent_reason__';\n\n/** Flattens a component tree into a single list, parents before their children. */\nconst flattenComponents = (comps: EmbeddedFlowComponent[] | undefined): EmbeddedFlowComponent[] =>\n (comps ?? []).flatMap((comp: EmbeddedFlowComponent) => [comp, ...flattenComponents(comp.components)]);\n\n/**\n * Finds the action to submit an expired consent prompt with. A non-primary submit action is\n * preferred so the payload reads as a denial, falling back to any submit action because the server\n * needs an action to route the prompt node. Returns undefined when the view has neither.\n */\nconst findConsentSubmitActionId = (comps: EmbeddedFlowComponent[] | undefined): string | undefined => {\n const submitActions: EmbeddedFlowComponent[] = flattenComponents(comps).filter(\n (comp: EmbeddedFlowComponent) => comp.id && comp.eventType?.toUpperCase() === 'SUBMIT',\n );\n const denyAction: EmbeddedFlowComponent | undefined = submitActions.find(\n (comp: EmbeddedFlowComponent) => comp.variant?.toLowerCase() !== 'primary',\n );\n\n return (denyAction ?? submitActions[0])?.id;\n};\n\n/**\n * A component-driven SignIn component that provides authentication flow with pre-built styling.\n * This component handles the flow API calls for authentication and delegates UI logic to BaseSignIn.\n * It automatically transforms simple input-based responses into component-driven UI format.\n *\n * @example\n * // Default UI\n * ```tsx\n * import { SignIn } from '@thunderid/react/component-driven';\n *\n * const App = () => {\n * return (\n * <SignIn\n * onSuccess={(authData) => {\n * console.log('Authentication successful:', authData);\n * }}\n * onError={(error) => {\n * console.error('Authentication failed:', error);\n * }}\n * size=\"medium\"\n * variant=\"outlined\"\n * />\n * );\n * };\n * ```\n *\n * @example\n * // Custom UI with render props\n * ```tsx\n * import { SignIn } from '@thunderid/react/component-driven';\n *\n * const App = () => {\n * return (\n * <SignIn\n * onSuccess={(authData) => console.log('Success:', authData)}\n * onError={(error) => console.error('Error:', error)}\n * >\n * {({signIn, isLoading, components, error, isInitialized}) => (\n * <div className=\"custom-signin\">\n * <h1>Custom Sign In</h1>\n * {!isInitialized ? (\n * <p>Initializing...</p>\n * ) : error ? (\n * <div className=\"error\">{error.message}</div>\n * ) : (\n * <form onSubmit={(e) => {\n * e.preventDefault();\n * signIn({inputs: {username: 'user', password: 'pass'}});\n * }}>\n * <button type=\"submit\" disabled={isLoading}>\n * {isLoading ? 'Signing in...' : 'Sign In'}\n * </button>\n * </form>\n * )}\n * </div>\n * )}\n * </SignIn>\n * );\n * };\n * ```\n */\nconst SignIn: FC<SignInProps> = ({\n className,\n preferences,\n size = 'medium',\n onSuccess,\n onError,\n variant,\n children,\n revalidateOnChangeAfterBlur,\n organizationUnitId,\n}: SignInProps): ReactElement => {\n const {applicationId, afterSignInUrl, signIn, isInitialized, isLoading, meta, getStorageManager, scopes, vendor} =\n useThunderID();\n const {t} = useTranslation(preferences?.i18n);\n\n // State management for the flow\n const [components, setComponents] = useState<EmbeddedFlowComponent[]>([]);\n const [additionalData, setAdditionalData] = useState<Record<string, any>>({});\n // Server-side validation errors from the most recent flow response. Updated on every\n // submission; cleared when the next submission begins so stale errors don't linger.\n const [serverFieldErrors, setServerFieldErrors] = useState<FieldError[] | null>(null);\n const [currentExecutionId, setCurrentExecutionId] = useState<string | null>(null);\n const challengeTokenRef: any = useRef<string | null>(null);\n const [isStorageReady, setIsStorageReady] = useState(false);\n const [isFlowInitialized, setIsFlowInitialized] = useState(false);\n // Raw banner error source, resolved on render so the message follows a language change.\n const [flowErrorSource, setFlowErrorSource] = useState<unknown>(null);\n const flowError: Error | null = useMemo(\n () => (flowErrorSource === null ? null : resolveFlowError(flowErrorSource, t)),\n [flowErrorSource, t],\n );\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isTimeoutDisabled, setIsTimeoutDisabled] = useState<boolean>(false);\n const [passkeyState, setPasskeyState] = useState<PasskeyState>({\n actionId: null,\n challenge: null,\n creationOptions: null,\n error: null,\n executionId: null,\n isActive: false,\n });\n const initializationAttemptedRef: any = useRef(false);\n const oauthCodeProcessedRef: any = useRef(false);\n const passkeyProcessedRef: any = useRef(false);\n // Deadline this component has already auto-submitted for, so a re-run of the timeout effect\n // cannot submit the same expired step twice.\n const timeoutSubmittedForRef = useRef<number | null>(null);\n // The timeout effect is keyed on the deadline alone, so a step that arrives carrying the same\n // deadline would otherwise leave the pending timer holding the previous step's context.\n const timeoutContextRef = useRef<{\n components: EmbeddedFlowComponent[];\n hasConsentPrompt: boolean;\n submit: (payload: EmbeddedSignInFlowRequest) => Promise<void>;\n } | null>(null);\n /**\n * Sets executionId between sessionStorage and state.\n * This ensures both are always in sync.\n */\n const setExecutionId = (executionId: string | null): void => {\n setCurrentExecutionId(executionId);\n if (executionId) {\n sessionStorage.setItem(`${vendor}_execution_id`, executionId);\n } else {\n sessionStorage.removeItem(`${vendor}_execution_id`);\n }\n };\n\n /**\n * Restore any challenge token persisted before an OAuth redirect.\n * Waits for SDK initialization before reading from storage.\n */\n useEffect(() => {\n if (!isInitialized) return;\n\n (async (): Promise<void> => {\n try {\n const storageManager: any = await getStorageManager();\n const tempData: any = await storageManager?.getTemporaryData();\n if (tempData?.challengeToken) {\n challengeTokenRef.current = tempData.challengeToken as string;\n }\n } finally {\n setIsStorageReady(true);\n }\n })();\n }, [isInitialized]);\n\n /**\n * Updates challengeTokenRef immediately (stale-closure safe) and persists via\n * the provider's StorageManager so the token survives OAuth redirects.\n */\n const setChallengeToken = async (challengeToken: string | null): Promise<void> => {\n challengeTokenRef.current = challengeToken;\n try {\n const storageManager: any = await getStorageManager();\n if (storageManager) {\n if (challengeToken) {\n await storageManager.setTemporaryDataParameter('challengeToken', challengeToken);\n } else {\n await storageManager.removeTemporaryDataParameter('challengeToken');\n }\n }\n } catch {\n logger.warn('Failed to persist challenge token in storage.');\n }\n };\n\n /**\n * Clear all flow-related storage and state.\n */\n const clearFlowState = async (): Promise<void> => {\n // Clear the expired flow state to prevent rendering a stale form with a null executionId.\n // Kept before the first await so callers that do not await this function still apply the\n // reset in one batch, ahead of the setError that follows.\n const executionIdToClear: string | null = currentExecutionId ?? sessionStorage.getItem(`${vendor}_execution_id`);\n setExecutionId(null);\n setComponents([]);\n setAdditionalData({});\n setIsFlowInitialized(false);\n await setChallengeToken(null);\n await clearAuthId(executionIdToClear);\n setIsTimeoutDisabled(false);\n // Reset refs to allow new flows to start properly\n oauthCodeProcessedRef.current = false;\n };\n\n /**\n * Parse URL parameters used in flows.\n */\n const getUrlParams = (): any => {\n const urlParams: any = new URL(window?.location?.href ?? '').searchParams;\n\n return {\n applicationId: urlParams.get('applicationId'),\n authId: urlParams.get('authId'),\n code: urlParams.get('code'),\n error: urlParams.get('error'),\n errorDescription: urlParams.get('error_description'),\n executionId: urlParams.get('executionId'),\n nonce: urlParams.get('nonce'),\n state: urlParams.get('state'),\n };\n };\n\n /**\n * Persist the authId from the URL against its execution so it survives URL cleanup.\n * ThunderIDReactClient.signIn() reads it back with storageManager.getFlowAuthId(executionId),\n * so another tab's sign-in cannot replace it.\n */\n const handleAuthId = async (authId: string | null, executionId: string | null | undefined): Promise<void> => {\n if (authId && executionId) {\n try {\n const storageManager: any = await getStorageManager();\n await storageManager?.setFlowAuthId?.(executionId, authId);\n } catch {\n logger.warn('Failed to store authId in hybrid storage.');\n }\n }\n };\n\n /**\n * Remove the authId stored for an execution, leaving other tabs' entries in place.\n */\n const clearAuthId = async (executionId: string | null | undefined): Promise<void> => {\n if (!executionId) {\n return;\n }\n try {\n const storageManager: any = await getStorageManager();\n await storageManager?.removeFlowAuthId?.(executionId);\n } catch {\n logger.warn('Failed to clear authId from hybrid storage.');\n }\n };\n\n /**\n * Clean up OAuth-related URL parameters from the browser URL.\n */\n const cleanupOAuthUrlParams = (includeNonce = false): void => {\n if (!window?.location?.href) return;\n const url: any = new URL(window.location.href);\n url.searchParams.delete('error');\n url.searchParams.delete('error_description');\n url.searchParams.delete('code');\n url.searchParams.delete('state');\n if (includeNonce) {\n url.searchParams.delete('nonce');\n }\n window?.history?.replaceState({}, '', url.toString());\n };\n\n /**\n * Clean up flow-related URL parameters (executionId, authId) from the browser URL.\n * Used after executionId is set in state to prevent using invalidated executionId from URL.\n */\n const cleanupFlowUrlParams = (): void => {\n if (!window?.location?.href) return;\n const url: any = new URL(window.location.href);\n url.searchParams.delete('executionId');\n url.searchParams.delete('authId');\n url.searchParams.delete('applicationId');\n window?.history?.replaceState({}, '', url.toString());\n };\n\n /**\n * Set error state and call onError callback.\n * Ensures isFlowInitialized is true so errors can be displayed in the UI.\n */\n const setError = (source: unknown): void => {\n // Updater form, so React stores a FlowErrorBuilder instead of calling it.\n setFlowErrorSource(() => source);\n setIsFlowInitialized(true);\n onError?.(resolveFlowError(source, t));\n };\n\n /**\n * Handle OAuth error from URL parameters.\n * Clears flow state, creates error, and cleans up URL.\n */\n const handleOAuthError = (error: string, errorDescription: string | null): void => {\n clearFlowState();\n const errorMessage: any = errorDescription || `OAuth error: ${error}`;\n const err: any = new ThunderIDRuntimeError(errorMessage, 'SIGN_IN_ERROR', 'react');\n setError(err);\n cleanupOAuthUrlParams(true);\n };\n\n /**\n * Handle REDIRECTION response by storing flow state and redirecting to OAuth provider.\n */\n const handleRedirection = async (response: EmbeddedSignInFlowResponse): Promise<boolean> => {\n if (response.type === EmbeddedSignInFlowType.Redirection) {\n const redirectURL: any = (response.data as any)?.redirectURL || (response as any)?.redirectURL;\n\n if (redirectURL && window?.location) {\n if (response.executionId) {\n setExecutionId(response.executionId);\n }\n await setChallengeToken(response.challengeToken ?? null);\n\n const urlParams: any = getUrlParams();\n await handleAuthId(urlParams.authId, response.executionId);\n\n initiateOAuthRedirect(redirectURL, vendor);\n return true;\n }\n }\n return false;\n };\n\n /**\n * Handle ERROR and COMPLETE responses. Returns true if fully handled.\n * ERROR + executionId: recoverable — session preserved for retry.\n * ERROR + no executionId: terminal — clear state and surface the error.\n */\n const handleTerminalResponse = async (response: EmbeddedSignInFlowResponse): Promise<boolean> => {\n if (response.flowStatus === EmbeddedSignInFlowStatus.Error) {\n // Propagate OAuth error to the client\n if (response.redirectUrl && window?.location) {\n setIsSubmitting(false);\n await clearFlowState();\n cleanupOAuthUrlParams(true);\n onError?.(new Error(extractErrorMessage(response, t)));\n window.location.href = response.redirectUrl;\n\n return true;\n }\n\n if (response.executionId) {\n // Recoverable: session still alive. Show inline error without firing onError.\n setExecutionId(response.executionId);\n await setChallengeToken(response.challengeToken ?? null);\n setIsFlowInitialized(true);\n setFlowErrorSource(response);\n return true;\n }\n // Terminal: backend invalidated the session — clear all state.\n await clearFlowState();\n setError(response);\n cleanupFlowUrlParams();\n return true;\n }\n\n if (response.flowStatus === EmbeddedSignInFlowStatus.Complete) {\n // Get redirectUrl from response (from /oauth2/auth/callback) or fall back to afterSignInUrl\n const redirectUrl: any = (response as any)?.redirectUrl || (response as any)?.redirect_uri;\n const finalRedirectUrl: any = redirectUrl || afterSignInUrl;\n\n // Clear submitting state before redirect\n setIsSubmitting(false);\n\n // Clear all OAuth-related storage on successful completion\n const completedExecutionId: string | null =\n response.executionId || currentExecutionId || sessionStorage.getItem(`${vendor}_execution_id`);\n setExecutionId(null);\n await setChallengeToken(null);\n setIsFlowInitialized(false);\n sessionStorage.removeItem(`${vendor}_execution_id`);\n await clearAuthId(completedExecutionId);\n\n // Clean up OAuth URL params before redirect\n cleanupOAuthUrlParams(true);\n\n if (onSuccess) {\n onSuccess({\n redirectUrl: finalRedirectUrl,\n ...(response.data || {}),\n });\n }\n\n if (finalRedirectUrl && window?.location) {\n window.location.href = finalRedirectUrl;\n }\n\n return true;\n }\n\n return false;\n };\n\n /**\n * Initialize the authentication flow.\n * Priority: executionId > applicationId (from context) > applicationId (from URL)\n */\n const initializeFlow = async (): Promise<void> => {\n const urlParams: any = getUrlParams();\n\n // Reset OAuth code processed ref when starting a new flow\n oauthCodeProcessedRef.current = false;\n // Clear stale serverFieldErrors so the new flow doesn't inherit them via render-prop.\n setServerFieldErrors(null);\n\n await handleAuthId(urlParams.authId, urlParams.executionId);\n\n const effectiveApplicationId: any = applicationId || urlParams.applicationId;\n\n // On a page refresh the executionId is no longer in the URL (it is scrubbed by\n // cleanupFlowUrlParams after the first load). Fall back to the executionId persisted in\n // sessionStorage so the in-progress flow can be resumed instead of starting a new flow.\n // This is required for authorization_code apps where direct new-flow initiation is blocked\n // server-side and the flow must be initiated through the OAuth /authorize endpoint.\n const storedExecutionId: any = !urlParams.executionId ? sessionStorage.getItem(`${vendor}_execution_id`) : null;\n const resumeExecutionId: any = urlParams.executionId || storedExecutionId;\n\n if (!resumeExecutionId && !effectiveApplicationId) {\n const error: any = new ThunderIDRuntimeError(\n 'Either executionId or applicationId is required for authentication',\n 'SIGN_IN_ERROR',\n 'react',\n );\n setError(error);\n\n return;\n }\n\n try {\n setFlowErrorSource(null);\n\n let response: EmbeddedSignInFlowResponse;\n\n if (resumeExecutionId) {\n try {\n response = (await signIn({\n executionId: resumeExecutionId,\n ...(challengeTokenRef.current ? {challengeToken: challengeTokenRef.current} : {}),\n })) as EmbeddedSignInFlowResponse;\n } catch (resumeError) {\n // Only treat a stale/expired session (HTTP 400 from the server, meaning the stored\n // executionId is no longer valid) as a recoverable condition. Transient failures\n // such as 5xx server errors or network errors are rethrown so they surface correctly.\n const isStaleSession: boolean =\n storedExecutionId &&\n resumeExecutionId === storedExecutionId &&\n resumeError instanceof ThunderIDAPIError &&\n resumeError.statusCode === 400;\n\n if (isStaleSession) {\n setExecutionId(null);\n await clearAuthId(resumeExecutionId);\n if (!effectiveApplicationId) {\n const expiredError: FlowErrorBuilder = (translate) =>\n new ThunderIDRuntimeError(\n translate('errors.signin.session.expired') ||\n 'Your session has expired. Please return to the application and sign in again.',\n 'SIGN_IN_ERROR',\n 'react',\n );\n setError(expiredError);\n return;\n }\n response = (await signIn({\n applicationId: effectiveApplicationId,\n flowType: EmbeddedFlowType.Authentication,\n ...(scopes && {scopes}),\n ...(organizationUnitId && {ouId: organizationUnitId}),\n })) as EmbeddedSignInFlowResponse;\n } else {\n throw resumeError;\n }\n }\n } else {\n response = (await signIn({\n applicationId: effectiveApplicationId,\n flowType: EmbeddedFlowType.Authentication,\n ...(scopes && {scopes}),\n ...(organizationUnitId && {ouId: organizationUnitId}),\n })) as EmbeddedSignInFlowResponse;\n }\n\n if (await handleRedirection(response)) {\n return;\n }\n\n // Handle a flow that completes (or errors) on the very first step — e.g. a reused SSO\n // session lets the backend return COMPLETE immediately with no UI components. Without\n // this the UI would fall through with no components and spin forever.\n if (await handleTerminalResponse(response)) {\n // Only reset the init gate for unrecoverable Error responses so the user can retry;\n // Complete-without-redirect would otherwise kick off a fresh flow unintentionally.\n if (response.flowStatus === EmbeddedSignInFlowStatus.Error && !response.executionId) {\n initializationAttemptedRef.current = false;\n }\n return;\n }\n\n const {\n executionId: normalizedExecutionId,\n components: normalizedComponents,\n additionalData: normalizedAdditionalData,\n } = normalizeFlowResponse(\n response,\n t,\n {\n resolveTranslations: false,\n },\n meta,\n );\n\n await setChallengeToken(response.challengeToken ?? null);\n\n if (normalizedExecutionId && normalizedComponents) {\n setExecutionId(normalizedExecutionId);\n setComponents(normalizedComponents);\n setAdditionalData(normalizedAdditionalData ?? {});\n setIsFlowInitialized(true);\n setIsTimeoutDisabled(false);\n // The URL's authId belongs to this execution even when the URL had no executionId.\n await handleAuthId(urlParams.authId, normalizedExecutionId);\n // Clean up executionId from URL after setting it in state\n cleanupFlowUrlParams();\n }\n } catch (error) {\n const err: any = error;\n await clearFlowState();\n\n setError(err);\n initializationAttemptedRef.current = false;\n }\n };\n\n /**\n * Initialize the flow and handle cleanup of stale flow state.\n */\n useEffect(() => {\n const urlParams: any = getUrlParams();\n\n // Check for OAuth error in URL\n if (urlParams.error) {\n handleOAuthError(urlParams.error, urlParams.errorDescription);\n return;\n }\n\n handleAuthId(urlParams.authId, urlParams.executionId);\n\n // Skip OAuth code processing - let the dedicated OAuth useEffect handle it\n // No action needed here as the dedicated useEffect will handle it\n }, []);\n\n useEffect(() => {\n // Only initialize if we're not processing an OAuth callback or submission.\n // Wait for isStorageReady so the challenge token is restored from storage before\n // we attempt to resume a persisted executionId — the server requires it.\n const currentUrlParams: any = getUrlParams();\n if (\n isInitialized &&\n isStorageReady &&\n !isLoading &&\n !isFlowInitialized &&\n !initializationAttemptedRef.current &&\n !currentExecutionId &&\n !currentUrlParams.code &&\n !currentUrlParams.state &&\n !isSubmitting &&\n !oauthCodeProcessedRef.current\n ) {\n initializationAttemptedRef.current = true;\n initializeFlow();\n }\n }, [isInitialized, isStorageReady, isLoading, isFlowInitialized, currentExecutionId]);\n\n /**\n * Handle form submission from BaseSignIn or render props.\n */\n const handleSubmit = async (payload: EmbeddedSignInFlowRequest): Promise<void> => {\n // Use executionId from payload if available, otherwise fall back to currentExecutionId\n const effectiveExecutionId: any = payload.executionId || currentExecutionId;\n\n if (!effectiveExecutionId) {\n throw new Error('No active flow ID');\n }\n\n let processedInputs: Record<string, any> = {...payload.inputs};\n\n // Read and strip the sentinel up front so it can never reach the wire as an input\n const consentReason: string | undefined = processedInputs[CONSENT_REASON_KEY];\n delete processedInputs[CONSENT_REASON_KEY];\n\n // Auto-compile consent decisions if we are currently on a consent prompt step\n if (additionalData?.['consentPrompt']) {\n try {\n const consentPromptRawData: any = additionalData['consentPrompt'];\n const purposes: any[] =\n typeof consentPromptRawData === 'string'\n ? JSON.parse(consentPromptRawData)\n : consentPromptRawData.purposes || consentPromptRawData;\n\n // Find the action component to determine if it was a deny action\n let isDeny = false;\n if (payload.action) {\n // Flatten components to find the action\n const findAction = (comps: any[]): any => {\n if (!comps || comps.length === 0) return null;\n\n const found: any = comps.find((c: any) => c.id === payload.action);\n if (found) return found;\n\n return comps.reduce((acc: any, c: any) => {\n if (acc) return acc;\n if (c.components) return findAction(c.components);\n return null;\n }, null);\n };\n\n const submitAction: any = findAction(components);\n\n if (submitAction && submitAction.variant?.toLowerCase() !== 'primary') {\n isDeny = true;\n }\n }\n\n // An expired prompt is never an approval, whichever action carried the submission\n if (consentReason === ConsentConstants.REASON_TIMEOUT) {\n isDeny = true;\n }\n\n // Approval waits while an approved authorization detail shows a value that cannot be submitted\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n if (!isDeny && isConsentApprovalBlocked(purposes, processedInputs)) {\n return;\n }\n\n // An explicit denial carries a reason too, so the server never has to infer one\n const reason: string | undefined = consentReason ?? (isDeny ? ConsentConstants.REASON_USER_DENIED : undefined);\n\n processedInputs = compileConsentDecisions(processedInputs, purposes, {\n approved: !isDeny,\n ...(reason ? {reason} : {}),\n });\n } catch (e) {\n // Failed to construct consent_decisions payload automatically\n }\n }\n\n try {\n setIsSubmitting(true);\n setFlowErrorSource(null);\n // Clear any field errors from the previous response before the new round-trip.\n setServerFieldErrors(null);\n\n const response: EmbeddedSignInFlowResponse = (await signIn({\n executionId: effectiveExecutionId,\n ...payload,\n inputs: processedInputs,\n ...(challengeTokenRef.current ? {challengeToken: challengeTokenRef.current} : {}),\n })) as EmbeddedSignInFlowResponse;\n\n if (await handleRedirection(response)) {\n return;\n }\n if (\n response.data?.additionalData?.['passkeyChallenge'] ||\n response.data?.additionalData?.['passkeyCreationOptions']\n ) {\n const {passkeyChallenge, passkeyCreationOptions}: any = response.data.additionalData;\n const effectiveExecutionIdForPasskey: any = response.executionId || effectiveExecutionId;\n\n // Reset passkey processed ref to allow processing\n passkeyProcessedRef.current = false;\n\n await setChallengeToken(response.challengeToken ?? null);\n\n // Set passkey state to trigger the passkey\n setPasskeyState({\n actionId: 'submit',\n challenge: passkeyChallenge,\n creationOptions: passkeyCreationOptions,\n error: null,\n executionId: effectiveExecutionIdForPasskey,\n isActive: true,\n });\n setIsSubmitting(false);\n\n return;\n }\n\n // Handle terminal flow statuses before normalization.\n if (await handleTerminalResponse(response)) {\n return;\n }\n\n const {\n executionId: normalizedExecutionId,\n components: normalizedComponents,\n additionalData: normalizedAdditionalData,\n } = normalizeFlowResponse(\n response,\n t,\n {\n resolveTranslations: false,\n },\n meta,\n );\n\n // Always update challenge token on any INCOMPLETE response — token rotates every step.\n await setChallengeToken(response.challengeToken ?? null);\n\n // Update executionId if response contains a new one\n if (normalizedExecutionId && normalizedComponents) {\n setExecutionId(normalizedExecutionId);\n setComponents(normalizedComponents);\n setAdditionalData(normalizedAdditionalData ?? {});\n setIsTimeoutDisabled(false);\n // Ensure flow is marked as initialized when we have components\n setIsFlowInitialized(true);\n // Clean up executionId from URL after setting it in state\n cleanupFlowUrlParams();\n\n // Surface server-side validation failures so BaseSignIn can inject them into\n // the form-level fieldErrors state used by the render-prop / default UI.\n const responseFieldErrors: FieldError[] | undefined = (response.data as any)?.fieldErrors;\n if (responseFieldErrors && responseFieldErrors.length > 0) {\n setServerFieldErrors(responseFieldErrors);\n }\n\n // Display error from INCOMPLETE response\n if ((response as any)?.error) {\n setFlowErrorSource(response);\n }\n }\n } catch (error) {\n const err: any = error;\n await clearFlowState();\n\n setError(err);\n return;\n } finally {\n setIsSubmitting(false);\n }\n };\n\n /**\n * Handle step timeout if configured in additionalData.\n *\n * An expired consent prompt is auto-submitted as a denial carrying the timeout reason, because its\n * actions no longer lead anywhere and the user would otherwise be stranded on the prompt. The\n * server discards those decisions and records nothing. Every other kind of step surfaces the\n * expiry error instead.\n */\n timeoutContextRef.current = {\n components,\n hasConsentPrompt: Boolean(additionalData?.['consentPrompt']),\n submit: handleSubmit,\n };\n\n useEffect(() => {\n const timeoutMs: number = Number(additionalData?.['stepTimeout']) || 0;\n if (timeoutMs <= 0 || !isFlowInitialized) {\n setIsTimeoutDisabled(false);\n return undefined;\n }\n\n const handleTimeout = (): void => {\n setIsTimeoutDisabled(true);\n\n const expiredError: FlowErrorBuilder = (translate) =>\n new Error(translate('errors.signin.timeout') || 'Time allowed to complete the step has expired.');\n\n // Read through the ref so the timer always sees the step that is on screen when it fires\n const context = timeoutContextRef.current;\n const actionId: string | undefined = context?.hasConsentPrompt\n ? findConsentSubmitActionId(context.components)\n : undefined;\n\n // Without an action the prompt node cannot be routed, so there is nothing to submit\n if (actionId && context && timeoutSubmittedForRef.current !== timeoutMs) {\n timeoutSubmittedForRef.current = timeoutMs;\n context\n .submit({action: actionId, inputs: {[CONSENT_REASON_KEY]: ConsentConstants.REASON_TIMEOUT}})\n .catch(() => setError(expiredError));\n return;\n }\n\n setError(expiredError);\n };\n\n const timerId: ReturnType<typeof setTimeout> = setTimeout(handleTimeout, Math.max(0, timeoutMs - Date.now()));\n\n return () => clearTimeout(timerId);\n }, [additionalData?.['stepTimeout'], isFlowInitialized, t]);\n\n /**\n * Handle authentication errors.\n */\n const handleError = (error: Error): void => {\n setError(error);\n };\n\n useOAuthCallback({\n currentExecutionId,\n executionIdStorageKey: `${vendor}_execution_id`,\n isInitialized: isInitialized && !isLoading && isStorageReady,\n isSubmitting,\n onError: (err: any) => {\n clearFlowState();\n setError(err instanceof Error ? err : new Error(String(err)));\n },\n onSubmit: async (payload: any) => handleSubmit({executionId: payload.executionId, inputs: payload.inputs}),\n processedRef: oauthCodeProcessedRef,\n setExecutionId,\n });\n\n /**\n * Handle passkey authentication/registration when passkey state becomes active.\n * This effect auto-triggers the browser passkey popup and submits the result.\n */\n useEffect(() => {\n if (\n !passkeyState.isActive ||\n (!passkeyState.challenge && !passkeyState.creationOptions) ||\n !passkeyState.executionId\n ) {\n return;\n }\n\n // Prevent re-processing\n if (passkeyProcessedRef.current) {\n return;\n }\n passkeyProcessedRef.current = true;\n\n const performPasskeyProcess = async (): Promise<void> => {\n let inputs: Record<string, string>;\n\n if (passkeyState.challenge) {\n const passkeyResponse: any = await handlePasskeyAuthentication(passkeyState.challenge);\n const passkeyResponseObj: any = JSON.parse(passkeyResponse);\n\n inputs = {\n authenticatorData: passkeyResponseObj.response.authenticatorData,\n clientDataJSON: passkeyResponseObj.response.clientDataJSON,\n credentialId: passkeyResponseObj.id,\n signature: passkeyResponseObj.response.signature,\n userHandle: passkeyResponseObj.response.userHandle,\n };\n } else if (passkeyState.creationOptions) {\n const passkeyResponse: any = await handlePasskeyRegistration(passkeyState.creationOptions);\n const passkeyResponseObj: any = JSON.parse(passkeyResponse);\n\n inputs = {\n attestationObject: passkeyResponseObj.response.attestationObject,\n clientDataJSON: passkeyResponseObj.response.clientDataJSON,\n credentialId: passkeyResponseObj.id,\n };\n } else {\n throw new Error('No passkey challenge or creation options available');\n }\n\n await handleSubmit({\n executionId: passkeyState.executionId ?? undefined,\n inputs,\n });\n };\n\n performPasskeyProcess()\n .then(() => {\n setPasskeyState({\n actionId: null,\n challenge: null,\n creationOptions: null,\n error: null,\n executionId: null,\n isActive: false,\n });\n })\n .catch((error: any) => {\n setPasskeyState((prev: any) => ({...prev, error: error as Error, isActive: false}));\n setError(error);\n });\n }, [passkeyState.isActive, passkeyState.challenge, passkeyState.creationOptions, passkeyState.executionId]);\n\n if (children) {\n // Collapse the server FieldError[] array to a single message per field map for\n // render-prop consumers. First error per field wins. Multi-error cases per\n // field are rare in practice (server typically returns one rule failure per\n // field in current flows) and consumers needing the full array can still read\n // it from the raw flow response.\n const renderPropFieldErrors: Record<string, string> = {};\n if (serverFieldErrors) {\n for (const fe of serverFieldErrors) {\n if (!(fe.identifier in renderPropFieldErrors)) {\n renderPropFieldErrors[fe.identifier] = fe.message;\n }\n }\n }\n\n const renderProps: SignInRenderProps = {\n additionalData,\n components,\n error: flowError,\n fieldErrors: renderPropFieldErrors,\n initialize: initializeFlow,\n isInitialized: isFlowInitialized,\n isLoading: isLoading || isSubmitting || !isInitialized,\n isTimeoutDisabled,\n meta,\n onSubmit: handleSubmit,\n };\n\n return <>{children(renderProps)}</>;\n }\n // Otherwise, render the default BaseSignIn component\n return (\n <BaseSignIn\n additionalData={additionalData}\n components={components}\n isLoading={isLoading || !isInitialized || !isFlowInitialized}\n isTimeoutDisabled={isTimeoutDisabled}\n onSubmit={handleSubmit}\n onError={handleError}\n error={flowError}\n className={className}\n size={size}\n variant={variant}\n preferences={preferences}\n revalidateOnChangeAfterBlur={revalidateOnChangeAfterBlur}\n serverFieldErrors={serverFieldErrors}\n />\n );\n};\n\nexport default SignIn;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"BaseSignUp.d.ts","sourceRoot":"","sources":["../../../../src/components/auth/SignUp/BaseSignUp.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BaseSignUp.d.ts","sourceRoot":"","sources":["../../../../src/components/auth/SignUp/BaseSignUp.tsx"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ import useFlow_default from "../../../contexts/Flow/useFlow.js";
6
6
  import useTheme_default from "../../../contexts/Theme/useTheme.js";
7
7
  import ComponentPreferencesContext_default from "../../../contexts/I18n/ComponentPreferencesContext.js";
8
8
  import useTranslation_default from "../../../hooks/useTranslation.js";
9
- import { extractErrorMessage, normalizeFlowResponse } from "../../../utils/flowTransformer.js";
9
+ import { extractErrorMessage, normalizeFlowResponse, resolveFlowError } from "../../../utils/flowTransformer.js";
10
10
  import { useForm } from "../../../hooks/useForm.js";
11
11
  import Spinner_default from "../../primitives/Spinner/Spinner.js";
12
12
  import Typography_default from "../../primitives/Typography/Typography.js";
@@ -37,7 +37,8 @@ const BaseSignUpContent = ({ afterSignUpUrl, onInitialize, onSubmit, onError, on
37
37
  const [isLoading, setIsLoading] = useState(false);
38
38
  const [isFlowInitialized, setIsFlowInitialized] = useState(false);
39
39
  const [currentFlow, setCurrentFlow] = useState(null);
40
- const [apiError, setApiError] = useState(null);
40
+ const [apiErrorSource, setApiErrorSource] = useState(null);
41
+ const apiError = useMemo(() => apiErrorSource === null ? null : resolveFlowError(apiErrorSource, t), [apiErrorSource, t]);
41
42
  const [isStorageReady, setIsStorageReady] = useState(false);
42
43
  const [passkeyState, setPasskeyState] = useState({
43
44
  actionId: null,
@@ -81,19 +82,22 @@ const BaseSignUpContent = ({ afterSignUpUrl, onInitialize, onSubmit, onError, on
81
82
  }
82
83
  };
83
84
  /**
84
- * Handle error responses and extract meaningful error messages
85
- * Uses the transformer's extractErrorMessage function.
85
+ * Handle error responses. The message is resolved from the stored source on render.
86
86
  */
87
87
  const handleError = useCallback((error) => {
88
- const errorMessage = extractErrorMessage(error, t);
89
- setApiError(error instanceof Error ? error : new Error(errorMessage));
88
+ setApiErrorSource(error);
89
+ }, []);
90
+ const apiErrorMessage = apiError?.message;
91
+ useEffect(() => {
92
+ if (!apiErrorMessage) return;
90
93
  clearMessages();
91
94
  addMessage({
92
- message: errorMessage,
95
+ message: apiErrorMessage,
93
96
  type: "error"
94
97
  });
95
98
  }, [
96
- t,
99
+ apiErrorSource,
100
+ apiErrorMessage,
97
101
  addMessage,
98
102
  clearMessages
99
103
  ]);
@@ -374,7 +378,7 @@ const BaseSignUpContent = ({ afterSignUpUrl, onInitialize, onSubmit, onError, on
374
378
  if (!validateForm().isValid) return;
375
379
  }
376
380
  setIsLoading(true);
377
- setApiError(null);
381
+ setApiErrorSource(null);
378
382
  clearMessages();
379
383
  try {
380
384
  const composedData = data ? composeAffixedInputs_default(data, vendor) : void 0;
@@ -546,7 +550,7 @@ const BaseSignUpContent = ({ afterSignUpUrl, onInitialize, onSubmit, onError, on
546
550
  initializationAttemptedRef.current = true;
547
551
  (async () => {
548
552
  setIsLoading(true);
549
- setApiError(null);
553
+ setApiErrorSource(null);
550
554
  clearMessages();
551
555
  try {
552
556
  const payload = challengeTokenRef.current ? { challengeToken: challengeTokenRef.current } : void 0;