@thunderid/react 1.7.0 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/account/UserProfile/BaseUserProfile.cjs +1 -1
- package/dist/cjs/components/admin/AgentCreate/AgentCreate.cjs +15 -4
- package/dist/cjs/components/admin/AgentCreate/AgentCreate.cjs.map +1 -1
- package/dist/cjs/components/admin/AgentDetails/AgentDetails.cjs +49 -10
- package/dist/cjs/components/admin/AgentDetails/AgentDetails.cjs.map +1 -1
- package/dist/cjs/components/admin/AgentDetails/BaseAgentDetails.cjs +25 -7
- package/dist/cjs/components/admin/AgentDetails/BaseAgentDetails.cjs.map +1 -1
- package/dist/cjs/components/admin/AgentList/AgentList.cjs +13 -4
- package/dist/cjs/components/admin/AgentList/AgentList.cjs.map +1 -1
- package/dist/cjs/components/admin/ApplicationCreate/ApplicationCreate.cjs +70 -0
- package/dist/cjs/components/admin/ApplicationCreate/ApplicationCreate.cjs.map +1 -0
- package/dist/cjs/components/admin/ApplicationCreate/BaseApplicationCreate.cjs +135 -0
- package/dist/cjs/components/admin/ApplicationCreate/BaseApplicationCreate.cjs.map +1 -0
- package/dist/cjs/components/admin/ApplicationDetails/ApplicationDetails.cjs +95 -0
- package/dist/cjs/components/admin/ApplicationDetails/ApplicationDetails.cjs.map +1 -0
- package/dist/cjs/components/admin/ApplicationDetails/BaseApplicationDetails.cjs +255 -0
- package/dist/cjs/components/admin/ApplicationDetails/BaseApplicationDetails.cjs.map +1 -0
- package/dist/cjs/components/admin/ApplicationList/ApplicationList.cjs +55 -0
- package/dist/cjs/components/admin/ApplicationList/ApplicationList.cjs.map +1 -0
- package/dist/cjs/components/admin/ApplicationList/BaseApplicationList.cjs +95 -0
- package/dist/cjs/components/admin/ApplicationList/BaseApplicationList.cjs.map +1 -0
- package/dist/cjs/components/admin/GroupCreate/GroupCreate.cjs +8 -2
- package/dist/cjs/components/admin/GroupCreate/GroupCreate.cjs.map +1 -1
- package/dist/cjs/components/admin/GroupList/GroupList.cjs +10 -3
- package/dist/cjs/components/admin/GroupList/GroupList.cjs.map +1 -1
- package/dist/cjs/components/admin/GroupMembers/GroupMembers.cjs +49 -11
- package/dist/cjs/components/admin/GroupMembers/GroupMembers.cjs.map +1 -1
- package/dist/cjs/components/admin/RoleAssignments/RoleAssignments.cjs +50 -15
- package/dist/cjs/components/admin/RoleAssignments/RoleAssignments.cjs.map +1 -1
- package/dist/cjs/components/admin/RoleCreate/RoleCreate.cjs +8 -2
- package/dist/cjs/components/admin/RoleCreate/RoleCreate.cjs.map +1 -1
- package/dist/cjs/components/admin/RoleList/RoleList.cjs +10 -3
- package/dist/cjs/components/admin/RoleList/RoleList.cjs.map +1 -1
- package/dist/cjs/components/admin/RolePermissions/RolePermissions.cjs +8 -2
- package/dist/cjs/components/admin/RolePermissions/RolePermissions.cjs.map +1 -1
- package/dist/cjs/components/admin/UserCreate/UserCreate.cjs +15 -4
- package/dist/cjs/components/admin/UserCreate/UserCreate.cjs.map +1 -1
- package/dist/cjs/components/admin/UserDetails/BaseUserDetails.cjs +32 -14
- package/dist/cjs/components/admin/UserDetails/BaseUserDetails.cjs.map +1 -1
- package/dist/cjs/components/admin/UserDetails/UserDetails.cjs +45 -10
- package/dist/cjs/components/admin/UserDetails/UserDetails.cjs.map +1 -1
- package/dist/cjs/components/admin/UserList/UserList.cjs +13 -4
- package/dist/cjs/components/admin/UserList/UserList.cjs.map +1 -1
- package/dist/cjs/components/admin/shared/AccountLifecycleParts.cjs +105 -0
- package/dist/cjs/components/admin/shared/AccountLifecycleParts.cjs.map +1 -0
- package/dist/cjs/components/admin/shared/ApplicationFormFields.cjs +62 -0
- package/dist/cjs/components/admin/shared/ApplicationFormFields.cjs.map +1 -0
- package/dist/cjs/components/admin/shared/ClientSecretNotice.cjs +49 -0
- package/dist/cjs/components/admin/shared/ClientSecretNotice.cjs.map +1 -0
- package/dist/cjs/components/auth/AcceptInvite/BaseAcceptInvite.cjs +4 -5
- package/dist/cjs/components/auth/AcceptInvite/BaseAcceptInvite.cjs.map +1 -1
- package/dist/cjs/components/auth/InviteUser/InviteUser.cjs +1 -1
- package/dist/cjs/components/auth/SignIn/SignIn.cjs +5 -5
- package/dist/cjs/components/auth/SignIn/SignIn.cjs.map +1 -1
- package/dist/cjs/components/auth/flow/AuthOptionFactory.cjs +4 -5
- package/dist/cjs/components/auth/flow/AuthOptionFactory.cjs.map +1 -1
- package/dist/cjs/components/auth/flow/Consent.cjs +53 -28
- package/dist/cjs/components/auth/flow/Consent.cjs.map +1 -1
- package/dist/cjs/components/auth/flow/ConsentAuthorizationDetail.cjs +104 -0
- package/dist/cjs/components/auth/flow/ConsentAuthorizationDetail.cjs.map +1 -0
- package/dist/cjs/components/auth/flow/ConsentAuthorizationDetail.styles.cjs +59 -0
- package/dist/cjs/components/auth/flow/ConsentAuthorizationDetail.styles.cjs.map +1 -0
- package/dist/cjs/components/auth/flow/ConsentDetailField.cjs +171 -0
- package/dist/cjs/components/auth/flow/ConsentDetailField.cjs.map +1 -0
- package/dist/cjs/components/auth/flow/ConsentDetailField.styles.cjs +85 -0
- package/dist/cjs/components/auth/flow/ConsentDetailField.styles.cjs.map +1 -0
- package/dist/cjs/components/auth/flow/ConsentDetailText.cjs +63 -0
- package/dist/cjs/components/auth/flow/ConsentDetailText.cjs.map +1 -0
- package/dist/cjs/components/auth/flow/ConsentDetailText.styles.cjs +83 -0
- package/dist/cjs/components/auth/flow/ConsentDetailText.styles.cjs.map +1 -0
- package/dist/cjs/components/auth/flow/FieldFactory.cjs +1 -1
- package/dist/cjs/components/auth/flow/resolveConsentText.cjs +25 -0
- package/dist/cjs/components/auth/flow/resolveConsentText.cjs.map +1 -0
- package/dist/cjs/components/primitives/KeyValueInput/KeyValueInput.cjs +1 -1
- package/dist/cjs/components/primitives/MultiInput/MultiInput.cjs +1 -1
- package/dist/cjs/components/primitives/PasswordField/PasswordField.cjs +1 -1
- package/dist/cjs/hooks/auth/useConsentDetailField.cjs +357 -0
- package/dist/cjs/hooks/auth/useConsentDetailField.cjs.map +1 -0
- package/dist/cjs/hooks/management/useAccountLifecycle.cjs +59 -0
- package/dist/cjs/hooks/management/useAccountLifecycle.cjs.map +1 -0
- package/dist/cjs/hooks/management/useManagementEndpoint.cjs.map +1 -1
- package/dist/cjs/hooks/management/useManagementRequestConfig.cjs +41 -0
- package/dist/cjs/hooks/management/useManagementRequestConfig.cjs.map +1 -0
- package/dist/cjs/index.cjs +1130 -187
- package/dist/cjs/utils/formatConsentDetailValue.cjs +26 -0
- package/dist/cjs/utils/formatConsentDetailValue.cjs.map +1 -0
- package/dist/cjs/utils/getConsentDetailLayout.cjs +44 -0
- package/dist/cjs/utils/getConsentDetailLayout.cjs.map +1 -0
- package/dist/cjs/utils/getConsentDetailListDisplay.cjs +30 -0
- package/dist/cjs/utils/getConsentDetailListDisplay.cjs.map +1 -0
- package/dist/cjs/utils/isConsentApprovalBlocked.cjs +41 -0
- package/dist/cjs/utils/isConsentApprovalBlocked.cjs.map +1 -0
- package/dist/cjs/utils/isConsentDetailPlainList.cjs +24 -0
- package/dist/cjs/utils/isConsentDetailPlainList.cjs.map +1 -0
- package/dist/cjs/utils/isConsentDetailStructured.cjs +15 -0
- package/dist/cjs/utils/isConsentDetailStructured.cjs.map +1 -0
- package/dist/cjs/utils/isConsentDetailTextClamped.cjs +25 -0
- package/dist/cjs/utils/isConsentDetailTextClamped.cjs.map +1 -0
- package/dist/components/account/UserProfile/BaseUserProfile.js +1 -1
- package/dist/components/admin/AgentCreate/AgentCreate.d.ts.map +1 -1
- package/dist/components/admin/AgentCreate/AgentCreate.js +16 -5
- package/dist/components/admin/AgentCreate/AgentCreate.js.map +1 -1
- package/dist/components/admin/AgentDetails/AgentDetails.d.ts +8 -1
- package/dist/components/admin/AgentDetails/AgentDetails.d.ts.map +1 -1
- package/dist/components/admin/AgentDetails/AgentDetails.js +50 -11
- package/dist/components/admin/AgentDetails/AgentDetails.js.map +1 -1
- package/dist/components/admin/AgentDetails/BaseAgentDetails.d.ts +21 -1
- package/dist/components/admin/AgentDetails/BaseAgentDetails.d.ts.map +1 -1
- package/dist/components/admin/AgentDetails/BaseAgentDetails.js +25 -7
- package/dist/components/admin/AgentDetails/BaseAgentDetails.js.map +1 -1
- package/dist/components/admin/AgentList/AgentList.d.ts.map +1 -1
- package/dist/components/admin/AgentList/AgentList.js +14 -5
- package/dist/components/admin/AgentList/AgentList.js.map +1 -1
- package/dist/components/admin/ApplicationCreate/ApplicationCreate.d.ts +30 -0
- package/dist/components/admin/ApplicationCreate/ApplicationCreate.d.ts.map +1 -0
- package/dist/components/admin/ApplicationCreate/ApplicationCreate.js +66 -0
- package/dist/components/admin/ApplicationCreate/ApplicationCreate.js.map +1 -0
- package/dist/components/admin/ApplicationCreate/BaseApplicationCreate.d.ts +80 -0
- package/dist/components/admin/ApplicationCreate/BaseApplicationCreate.d.ts.map +1 -0
- package/dist/components/admin/ApplicationCreate/BaseApplicationCreate.js +131 -0
- package/dist/components/admin/ApplicationCreate/BaseApplicationCreate.js.map +1 -0
- package/dist/components/admin/ApplicationDetails/ApplicationDetails.d.ts +64 -0
- package/dist/components/admin/ApplicationDetails/ApplicationDetails.d.ts.map +1 -0
- package/dist/components/admin/ApplicationDetails/ApplicationDetails.js +92 -0
- package/dist/components/admin/ApplicationDetails/ApplicationDetails.js.map +1 -0
- package/dist/components/admin/ApplicationDetails/BaseApplicationDetails.d.ts +111 -0
- package/dist/components/admin/ApplicationDetails/BaseApplicationDetails.d.ts.map +1 -0
- package/dist/components/admin/ApplicationDetails/BaseApplicationDetails.js +251 -0
- package/dist/components/admin/ApplicationDetails/BaseApplicationDetails.js.map +1 -0
- package/dist/components/admin/ApplicationList/ApplicationList.d.ts +18 -0
- package/dist/components/admin/ApplicationList/ApplicationList.d.ts.map +1 -0
- package/dist/components/admin/ApplicationList/ApplicationList.js +51 -0
- package/dist/components/admin/ApplicationList/ApplicationList.js.map +1 -0
- package/dist/components/admin/ApplicationList/BaseApplicationList.d.ts +55 -0
- package/dist/components/admin/ApplicationList/BaseApplicationList.d.ts.map +1 -0
- package/dist/components/admin/ApplicationList/BaseApplicationList.js +93 -0
- package/dist/components/admin/ApplicationList/BaseApplicationList.js.map +1 -0
- package/dist/components/admin/GroupCreate/GroupCreate.d.ts.map +1 -1
- package/dist/components/admin/GroupCreate/GroupCreate.js +9 -3
- package/dist/components/admin/GroupCreate/GroupCreate.js.map +1 -1
- package/dist/components/admin/GroupList/GroupList.d.ts.map +1 -1
- package/dist/components/admin/GroupList/GroupList.js +11 -4
- package/dist/components/admin/GroupList/GroupList.js.map +1 -1
- package/dist/components/admin/GroupMembers/GroupMembers.d.ts +7 -0
- package/dist/components/admin/GroupMembers/GroupMembers.d.ts.map +1 -1
- package/dist/components/admin/GroupMembers/GroupMembers.js +50 -12
- package/dist/components/admin/GroupMembers/GroupMembers.js.map +1 -1
- package/dist/components/admin/RoleAssignments/RoleAssignments.d.ts +7 -0
- package/dist/components/admin/RoleAssignments/RoleAssignments.d.ts.map +1 -1
- package/dist/components/admin/RoleAssignments/RoleAssignments.js +51 -16
- package/dist/components/admin/RoleAssignments/RoleAssignments.js.map +1 -1
- package/dist/components/admin/RoleCreate/RoleCreate.d.ts.map +1 -1
- package/dist/components/admin/RoleCreate/RoleCreate.js +9 -3
- package/dist/components/admin/RoleCreate/RoleCreate.js.map +1 -1
- package/dist/components/admin/RoleList/RoleList.d.ts.map +1 -1
- package/dist/components/admin/RoleList/RoleList.js +11 -4
- package/dist/components/admin/RoleList/RoleList.js.map +1 -1
- package/dist/components/admin/RolePermissions/RolePermissions.d.ts.map +1 -1
- package/dist/components/admin/RolePermissions/RolePermissions.js +9 -3
- package/dist/components/admin/RolePermissions/RolePermissions.js.map +1 -1
- package/dist/components/admin/UserCreate/UserCreate.d.ts.map +1 -1
- package/dist/components/admin/UserCreate/UserCreate.js +16 -5
- package/dist/components/admin/UserCreate/UserCreate.js.map +1 -1
- package/dist/components/admin/UserDetails/BaseUserDetails.d.ts +22 -1
- package/dist/components/admin/UserDetails/BaseUserDetails.d.ts.map +1 -1
- package/dist/components/admin/UserDetails/BaseUserDetails.js +32 -14
- package/dist/components/admin/UserDetails/BaseUserDetails.js.map +1 -1
- package/dist/components/admin/UserDetails/UserDetails.d.ts +15 -1
- package/dist/components/admin/UserDetails/UserDetails.d.ts.map +1 -1
- package/dist/components/admin/UserDetails/UserDetails.js +46 -11
- package/dist/components/admin/UserDetails/UserDetails.js.map +1 -1
- package/dist/components/admin/UserList/UserList.d.ts.map +1 -1
- package/dist/components/admin/UserList/UserList.js +14 -5
- package/dist/components/admin/UserList/UserList.js.map +1 -1
- package/dist/components/admin/shared/AccountLifecycleParts.d.ts +32 -0
- package/dist/components/admin/shared/AccountLifecycleParts.d.ts.map +1 -0
- package/dist/components/admin/shared/AccountLifecycleParts.js +101 -0
- package/dist/components/admin/shared/AccountLifecycleParts.js.map +1 -0
- package/dist/components/admin/shared/ApplicationFormFields.d.ts +35 -0
- package/dist/components/admin/shared/ApplicationFormFields.d.ts.map +1 -0
- package/dist/components/admin/shared/ApplicationFormFields.js +59 -0
- package/dist/components/admin/shared/ApplicationFormFields.js.map +1 -0
- package/dist/components/admin/shared/ClientSecretNotice.d.ts +16 -0
- package/dist/components/admin/shared/ClientSecretNotice.d.ts.map +1 -0
- package/dist/components/admin/shared/ClientSecretNotice.js +47 -0
- package/dist/components/admin/shared/ClientSecretNotice.js.map +1 -0
- package/dist/components/auth/AcceptInvite/BaseAcceptInvite.d.ts.map +1 -1
- package/dist/components/auth/AcceptInvite/BaseAcceptInvite.js +5 -6
- package/dist/components/auth/AcceptInvite/BaseAcceptInvite.js.map +1 -1
- package/dist/components/auth/InviteUser/InviteUser.js +1 -1
- package/dist/components/auth/SignIn/SignIn.d.ts.map +1 -1
- package/dist/components/auth/SignIn/SignIn.js +6 -6
- package/dist/components/auth/SignIn/SignIn.js.map +1 -1
- package/dist/components/auth/flow/AuthOptionFactory.d.ts.map +1 -1
- package/dist/components/auth/flow/AuthOptionFactory.js +5 -6
- package/dist/components/auth/flow/AuthOptionFactory.js.map +1 -1
- package/dist/components/auth/flow/Consent.d.ts +6 -0
- package/dist/components/auth/flow/Consent.d.ts.map +1 -1
- package/dist/components/auth/flow/Consent.js +54 -29
- package/dist/components/auth/flow/Consent.js.map +1 -1
- package/dist/components/auth/flow/ConsentAuthorizationDetail.d.ts +68 -0
- package/dist/components/auth/flow/ConsentAuthorizationDetail.d.ts.map +1 -0
- package/dist/components/auth/flow/ConsentAuthorizationDetail.js +100 -0
- package/dist/components/auth/flow/ConsentAuthorizationDetail.js.map +1 -0
- package/dist/components/auth/flow/ConsentAuthorizationDetail.styles.d.ts +10 -0
- package/dist/components/auth/flow/ConsentAuthorizationDetail.styles.d.ts.map +1 -0
- package/dist/components/auth/flow/ConsentAuthorizationDetail.styles.js +57 -0
- package/dist/components/auth/flow/ConsentAuthorizationDetail.styles.js.map +1 -0
- package/dist/components/auth/flow/ConsentDetailField.d.ts +39 -0
- package/dist/components/auth/flow/ConsentDetailField.d.ts.map +1 -0
- package/dist/components/auth/flow/ConsentDetailField.js +168 -0
- package/dist/components/auth/flow/ConsentDetailField.js.map +1 -0
- package/dist/components/auth/flow/ConsentDetailField.styles.d.ts +11 -0
- package/dist/components/auth/flow/ConsentDetailField.styles.d.ts.map +1 -0
- package/dist/components/auth/flow/ConsentDetailField.styles.js +83 -0
- package/dist/components/auth/flow/ConsentDetailField.styles.js.map +1 -0
- package/dist/components/auth/flow/ConsentDetailText.d.ts +53 -0
- package/dist/components/auth/flow/ConsentDetailText.d.ts.map +1 -0
- package/dist/components/auth/flow/ConsentDetailText.js +58 -0
- package/dist/components/auth/flow/ConsentDetailText.js.map +1 -0
- package/dist/components/auth/flow/ConsentDetailText.styles.d.ts +20 -0
- package/dist/components/auth/flow/ConsentDetailText.styles.d.ts.map +1 -0
- package/dist/components/auth/flow/ConsentDetailText.styles.js +80 -0
- package/dist/components/auth/flow/ConsentDetailText.styles.js.map +1 -0
- package/dist/components/auth/flow/FieldFactory.js +1 -1
- package/dist/components/auth/flow/resolveConsentText.d.ts +13 -0
- package/dist/components/auth/flow/resolveConsentText.d.ts.map +1 -0
- package/dist/components/auth/flow/resolveConsentText.js +23 -0
- package/dist/components/auth/flow/resolveConsentText.js.map +1 -0
- package/dist/components/primitives/KeyValueInput/KeyValueInput.js +1 -1
- package/dist/components/primitives/MultiInput/MultiInput.js +1 -1
- package/dist/components/primitives/PasswordField/PasswordField.js +1 -1
- package/dist/hooks/auth/useConsentDetailField.d.ts +130 -0
- package/dist/hooks/auth/useConsentDetailField.d.ts.map +1 -0
- package/dist/hooks/auth/useConsentDetailField.js +354 -0
- package/dist/hooks/auth/useConsentDetailField.js.map +1 -0
- package/dist/hooks/management/useAccountLifecycle.d.ts +49 -0
- package/dist/hooks/management/useAccountLifecycle.d.ts.map +1 -0
- package/dist/hooks/management/useAccountLifecycle.js +56 -0
- package/dist/hooks/management/useAccountLifecycle.js.map +1 -0
- package/dist/hooks/management/useManagementEndpoint.d.ts +5 -1
- package/dist/hooks/management/useManagementEndpoint.d.ts.map +1 -1
- package/dist/hooks/management/useManagementEndpoint.js.map +1 -1
- package/dist/hooks/management/useManagementRequestConfig.d.ts +22 -0
- package/dist/hooks/management/useManagementRequestConfig.d.ts.map +1 -0
- package/dist/hooks/management/useManagementRequestConfig.js +39 -0
- package/dist/hooks/management/useManagementRequestConfig.js.map +1 -0
- package/dist/index.d.ts +35 -56
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -42
- package/dist/models/config.d.ts +3 -4
- package/dist/models/config.d.ts.map +1 -1
- package/dist/utils/formatConsentDetailValue.d.ts +16 -0
- package/dist/utils/formatConsentDetailValue.d.ts.map +1 -0
- package/dist/utils/formatConsentDetailValue.js +25 -0
- package/dist/utils/formatConsentDetailValue.js.map +1 -0
- package/dist/utils/getConsentDetailLayout.d.ts +32 -0
- package/dist/utils/getConsentDetailLayout.d.ts.map +1 -0
- package/dist/utils/getConsentDetailLayout.js +43 -0
- package/dist/utils/getConsentDetailLayout.js.map +1 -0
- package/dist/utils/getConsentDetailListDisplay.d.ts +30 -0
- package/dist/utils/getConsentDetailListDisplay.d.ts.map +1 -0
- package/dist/utils/getConsentDetailListDisplay.js +30 -0
- package/dist/utils/getConsentDetailListDisplay.js.map +1 -0
- package/dist/utils/isConsentApprovalBlocked.d.ts +17 -0
- package/dist/utils/isConsentApprovalBlocked.d.ts.map +1 -0
- package/dist/utils/isConsentApprovalBlocked.js +39 -0
- package/dist/utils/isConsentApprovalBlocked.js.map +1 -0
- package/dist/utils/isConsentDetailPlainList.d.ts +15 -0
- package/dist/utils/isConsentDetailPlainList.d.ts.map +1 -0
- package/dist/utils/isConsentDetailPlainList.js +23 -0
- package/dist/utils/isConsentDetailPlainList.js.map +1 -0
- package/dist/utils/isConsentDetailStructured.d.ts +10 -0
- package/dist/utils/isConsentDetailStructured.d.ts.map +1 -0
- package/dist/utils/isConsentDetailStructured.js +14 -0
- package/dist/utils/isConsentDetailStructured.js.map +1 -0
- package/dist/utils/isConsentDetailTextClamped.d.ts +20 -0
- package/dist/utils/isConsentDetailTextClamped.d.ts.map +1 -0
- package/dist/utils/isConsentDetailTextClamped.js +24 -0
- package/dist/utils/isConsentDetailTextClamped.js.map +1 -0
- package/package.json +2 -2
- package/dist/cjs/hooks/management/agents/useCreateAgent.cjs +0 -26
- package/dist/cjs/hooks/management/agents/useCreateAgent.cjs.map +0 -1
- package/dist/cjs/hooks/management/agents/useDeleteAgent.cjs +0 -26
- package/dist/cjs/hooks/management/agents/useDeleteAgent.cjs.map +0 -1
- package/dist/cjs/hooks/management/agents/useGetAgent.cjs +0 -30
- package/dist/cjs/hooks/management/agents/useGetAgent.cjs.map +0 -1
- package/dist/cjs/hooks/management/agents/useGetAgentGroups.cjs +0 -41
- package/dist/cjs/hooks/management/agents/useGetAgentGroups.cjs.map +0 -1
- package/dist/cjs/hooks/management/agents/useGetAgentRoles.cjs +0 -42
- package/dist/cjs/hooks/management/agents/useGetAgentRoles.cjs.map +0 -1
- package/dist/cjs/hooks/management/agents/useGetAgentTypes.cjs +0 -31
- package/dist/cjs/hooks/management/agents/useGetAgentTypes.cjs.map +0 -1
- package/dist/cjs/hooks/management/agents/useGetAgents.cjs +0 -33
- package/dist/cjs/hooks/management/agents/useGetAgents.cjs.map +0 -1
- package/dist/cjs/hooks/management/agents/useUpdateAgent.cjs +0 -27
- package/dist/cjs/hooks/management/agents/useUpdateAgent.cjs.map +0 -1
- package/dist/cjs/hooks/management/applications/useCreateApplication.cjs +0 -31
- package/dist/cjs/hooks/management/applications/useCreateApplication.cjs.map +0 -1
- package/dist/cjs/hooks/management/applications/useDeleteApplication.cjs +0 -26
- package/dist/cjs/hooks/management/applications/useDeleteApplication.cjs.map +0 -1
- package/dist/cjs/hooks/management/applications/useGetApplication.cjs +0 -35
- package/dist/cjs/hooks/management/applications/useGetApplication.cjs.map +0 -1
- package/dist/cjs/hooks/management/applications/useGetApplications.cjs +0 -36
- package/dist/cjs/hooks/management/applications/useGetApplications.cjs.map +0 -1
- package/dist/cjs/hooks/management/applications/useUpdateApplication.cjs +0 -27
- package/dist/cjs/hooks/management/applications/useUpdateApplication.cjs.map +0 -1
- package/dist/cjs/hooks/management/groups/useAddGroupMembers.cjs +0 -32
- package/dist/cjs/hooks/management/groups/useAddGroupMembers.cjs.map +0 -1
- package/dist/cjs/hooks/management/groups/useCreateGroup.cjs +0 -26
- package/dist/cjs/hooks/management/groups/useCreateGroup.cjs.map +0 -1
- package/dist/cjs/hooks/management/groups/useDeleteGroup.cjs +0 -30
- package/dist/cjs/hooks/management/groups/useDeleteGroup.cjs.map +0 -1
- package/dist/cjs/hooks/management/groups/useGetGroup.cjs +0 -30
- package/dist/cjs/hooks/management/groups/useGetGroup.cjs.map +0 -1
- package/dist/cjs/hooks/management/groups/useGetGroupMembers.cjs +0 -40
- package/dist/cjs/hooks/management/groups/useGetGroupMembers.cjs.map +0 -1
- package/dist/cjs/hooks/management/groups/useGetGroups.cjs +0 -31
- package/dist/cjs/hooks/management/groups/useGetGroups.cjs.map +0 -1
- package/dist/cjs/hooks/management/groups/useRemoveGroupMembers.cjs +0 -32
- package/dist/cjs/hooks/management/groups/useRemoveGroupMembers.cjs.map +0 -1
- package/dist/cjs/hooks/management/groups/useUpdateGroup.cjs +0 -31
- package/dist/cjs/hooks/management/groups/useUpdateGroup.cjs.map +0 -1
- package/dist/cjs/hooks/management/roles/useAddRoleAssignments.cjs +0 -27
- package/dist/cjs/hooks/management/roles/useAddRoleAssignments.cjs.map +0 -1
- package/dist/cjs/hooks/management/roles/useCreateRole.cjs +0 -26
- package/dist/cjs/hooks/management/roles/useCreateRole.cjs.map +0 -1
- package/dist/cjs/hooks/management/roles/useDeleteRole.cjs +0 -26
- package/dist/cjs/hooks/management/roles/useDeleteRole.cjs.map +0 -1
- package/dist/cjs/hooks/management/roles/useGetRole.cjs +0 -30
- package/dist/cjs/hooks/management/roles/useGetRole.cjs.map +0 -1
- package/dist/cjs/hooks/management/roles/useGetRoleAssignments.cjs +0 -42
- package/dist/cjs/hooks/management/roles/useGetRoleAssignments.cjs.map +0 -1
- package/dist/cjs/hooks/management/roles/useGetRoles.cjs +0 -31
- package/dist/cjs/hooks/management/roles/useGetRoles.cjs.map +0 -1
- package/dist/cjs/hooks/management/roles/useRemoveRoleAssignments.cjs +0 -27
- package/dist/cjs/hooks/management/roles/useRemoveRoleAssignments.cjs.map +0 -1
- package/dist/cjs/hooks/management/roles/useUpdateRole.cjs +0 -27
- package/dist/cjs/hooks/management/roles/useUpdateRole.cjs.map +0 -1
- package/dist/cjs/hooks/management/users/useCreateUser.cjs +0 -26
- package/dist/cjs/hooks/management/users/useCreateUser.cjs.map +0 -1
- package/dist/cjs/hooks/management/users/useDeleteUser.cjs +0 -26
- package/dist/cjs/hooks/management/users/useDeleteUser.cjs.map +0 -1
- package/dist/cjs/hooks/management/users/useGetUser.cjs +0 -30
- package/dist/cjs/hooks/management/users/useGetUser.cjs.map +0 -1
- package/dist/cjs/hooks/management/users/useGetUserGroups.cjs +0 -41
- package/dist/cjs/hooks/management/users/useGetUserGroups.cjs.map +0 -1
- package/dist/cjs/hooks/management/users/useGetUserTypes.cjs +0 -31
- package/dist/cjs/hooks/management/users/useGetUserTypes.cjs.map +0 -1
- package/dist/cjs/hooks/management/users/useGetUsers.cjs +0 -38
- package/dist/cjs/hooks/management/users/useGetUsers.cjs.map +0 -1
- package/dist/cjs/hooks/management/users/useUpdateUser.cjs +0 -27
- package/dist/cjs/hooks/management/users/useUpdateUser.cjs.map +0 -1
- package/dist/hooks/management/agents/useCreateAgent.d.ts +0 -11
- package/dist/hooks/management/agents/useCreateAgent.d.ts.map +0 -1
- package/dist/hooks/management/agents/useCreateAgent.js +0 -24
- package/dist/hooks/management/agents/useCreateAgent.js.map +0 -1
- package/dist/hooks/management/agents/useDeleteAgent.d.ts +0 -10
- package/dist/hooks/management/agents/useDeleteAgent.d.ts.map +0 -1
- package/dist/hooks/management/agents/useDeleteAgent.js +0 -24
- package/dist/hooks/management/agents/useDeleteAgent.js.map +0 -1
- package/dist/hooks/management/agents/useGetAgent.d.ts +0 -12
- package/dist/hooks/management/agents/useGetAgent.d.ts.map +0 -1
- package/dist/hooks/management/agents/useGetAgent.js +0 -28
- package/dist/hooks/management/agents/useGetAgent.js.map +0 -1
- package/dist/hooks/management/agents/useGetAgentGroups.d.ts +0 -16
- package/dist/hooks/management/agents/useGetAgentGroups.d.ts.map +0 -1
- package/dist/hooks/management/agents/useGetAgentGroups.js +0 -39
- package/dist/hooks/management/agents/useGetAgentGroups.js.map +0 -1
- package/dist/hooks/management/agents/useGetAgentRoles.d.ts +0 -17
- package/dist/hooks/management/agents/useGetAgentRoles.d.ts.map +0 -1
- package/dist/hooks/management/agents/useGetAgentRoles.js +0 -40
- package/dist/hooks/management/agents/useGetAgentRoles.js.map +0 -1
- package/dist/hooks/management/agents/useGetAgentTypes.d.ts +0 -15
- package/dist/hooks/management/agents/useGetAgentTypes.d.ts.map +0 -1
- package/dist/hooks/management/agents/useGetAgentTypes.js +0 -29
- package/dist/hooks/management/agents/useGetAgentTypes.js.map +0 -1
- package/dist/hooks/management/agents/useGetAgents.d.ts +0 -23
- package/dist/hooks/management/agents/useGetAgents.d.ts.map +0 -1
- package/dist/hooks/management/agents/useGetAgents.js +0 -31
- package/dist/hooks/management/agents/useGetAgents.js.map +0 -1
- package/dist/hooks/management/agents/useUpdateAgent.d.ts +0 -18
- package/dist/hooks/management/agents/useUpdateAgent.d.ts.map +0 -1
- package/dist/hooks/management/agents/useUpdateAgent.js +0 -25
- package/dist/hooks/management/agents/useUpdateAgent.js.map +0 -1
- package/dist/hooks/management/applications/useCreateApplication.d.ts +0 -16
- package/dist/hooks/management/applications/useCreateApplication.d.ts.map +0 -1
- package/dist/hooks/management/applications/useCreateApplication.js +0 -29
- package/dist/hooks/management/applications/useCreateApplication.js.map +0 -1
- package/dist/hooks/management/applications/useDeleteApplication.d.ts +0 -10
- package/dist/hooks/management/applications/useDeleteApplication.d.ts.map +0 -1
- package/dist/hooks/management/applications/useDeleteApplication.js +0 -24
- package/dist/hooks/management/applications/useDeleteApplication.js.map +0 -1
- package/dist/hooks/management/applications/useGetApplication.d.ts +0 -17
- package/dist/hooks/management/applications/useGetApplication.d.ts.map +0 -1
- package/dist/hooks/management/applications/useGetApplication.js +0 -33
- package/dist/hooks/management/applications/useGetApplication.js.map +0 -1
- package/dist/hooks/management/applications/useGetApplications.d.ts +0 -24
- package/dist/hooks/management/applications/useGetApplications.d.ts.map +0 -1
- package/dist/hooks/management/applications/useGetApplications.js +0 -34
- package/dist/hooks/management/applications/useGetApplications.js.map +0 -1
- package/dist/hooks/management/applications/useUpdateApplication.d.ts +0 -18
- package/dist/hooks/management/applications/useUpdateApplication.d.ts.map +0 -1
- package/dist/hooks/management/applications/useUpdateApplication.js +0 -25
- package/dist/hooks/management/applications/useUpdateApplication.js.map +0 -1
- package/dist/hooks/management/groups/useAddGroupMembers.d.ts +0 -24
- package/dist/hooks/management/groups/useAddGroupMembers.d.ts.map +0 -1
- package/dist/hooks/management/groups/useAddGroupMembers.js +0 -30
- package/dist/hooks/management/groups/useAddGroupMembers.js.map +0 -1
- package/dist/hooks/management/groups/useCreateGroup.d.ts +0 -11
- package/dist/hooks/management/groups/useCreateGroup.d.ts.map +0 -1
- package/dist/hooks/management/groups/useCreateGroup.js +0 -24
- package/dist/hooks/management/groups/useCreateGroup.js.map +0 -1
- package/dist/hooks/management/groups/useDeleteGroup.d.ts +0 -10
- package/dist/hooks/management/groups/useDeleteGroup.d.ts.map +0 -1
- package/dist/hooks/management/groups/useDeleteGroup.js +0 -28
- package/dist/hooks/management/groups/useDeleteGroup.js.map +0 -1
- package/dist/hooks/management/groups/useGetGroup.d.ts +0 -12
- package/dist/hooks/management/groups/useGetGroup.d.ts.map +0 -1
- package/dist/hooks/management/groups/useGetGroup.js +0 -28
- package/dist/hooks/management/groups/useGetGroup.js.map +0 -1
- package/dist/hooks/management/groups/useGetGroupMembers.d.ts +0 -20
- package/dist/hooks/management/groups/useGetGroupMembers.d.ts.map +0 -1
- package/dist/hooks/management/groups/useGetGroupMembers.js +0 -38
- package/dist/hooks/management/groups/useGetGroupMembers.js.map +0 -1
- package/dist/hooks/management/groups/useGetGroups.d.ts +0 -19
- package/dist/hooks/management/groups/useGetGroups.d.ts.map +0 -1
- package/dist/hooks/management/groups/useGetGroups.js +0 -29
- package/dist/hooks/management/groups/useGetGroups.js.map +0 -1
- package/dist/hooks/management/groups/useRemoveGroupMembers.d.ts +0 -12
- package/dist/hooks/management/groups/useRemoveGroupMembers.d.ts.map +0 -1
- package/dist/hooks/management/groups/useRemoveGroupMembers.js +0 -30
- package/dist/hooks/management/groups/useRemoveGroupMembers.js.map +0 -1
- package/dist/hooks/management/groups/useUpdateGroup.d.ts +0 -24
- package/dist/hooks/management/groups/useUpdateGroup.d.ts.map +0 -1
- package/dist/hooks/management/groups/useUpdateGroup.js +0 -29
- package/dist/hooks/management/groups/useUpdateGroup.js.map +0 -1
- package/dist/hooks/management/roles/useAddRoleAssignments.d.ts +0 -24
- package/dist/hooks/management/roles/useAddRoleAssignments.d.ts.map +0 -1
- package/dist/hooks/management/roles/useAddRoleAssignments.js +0 -25
- package/dist/hooks/management/roles/useAddRoleAssignments.js.map +0 -1
- package/dist/hooks/management/roles/useCreateRole.d.ts +0 -11
- package/dist/hooks/management/roles/useCreateRole.d.ts.map +0 -1
- package/dist/hooks/management/roles/useCreateRole.js +0 -24
- package/dist/hooks/management/roles/useCreateRole.js.map +0 -1
- package/dist/hooks/management/roles/useDeleteRole.d.ts +0 -10
- package/dist/hooks/management/roles/useDeleteRole.d.ts.map +0 -1
- package/dist/hooks/management/roles/useDeleteRole.js +0 -24
- package/dist/hooks/management/roles/useDeleteRole.js.map +0 -1
- package/dist/hooks/management/roles/useGetRole.d.ts +0 -12
- package/dist/hooks/management/roles/useGetRole.d.ts.map +0 -1
- package/dist/hooks/management/roles/useGetRole.js +0 -28
- package/dist/hooks/management/roles/useGetRole.js.map +0 -1
- package/dist/hooks/management/roles/useGetRoleAssignments.d.ts +0 -24
- package/dist/hooks/management/roles/useGetRoleAssignments.d.ts.map +0 -1
- package/dist/hooks/management/roles/useGetRoleAssignments.js +0 -40
- package/dist/hooks/management/roles/useGetRoleAssignments.js.map +0 -1
- package/dist/hooks/management/roles/useGetRoles.d.ts +0 -19
- package/dist/hooks/management/roles/useGetRoles.d.ts.map +0 -1
- package/dist/hooks/management/roles/useGetRoles.js +0 -29
- package/dist/hooks/management/roles/useGetRoles.js.map +0 -1
- package/dist/hooks/management/roles/useRemoveRoleAssignments.d.ts +0 -11
- package/dist/hooks/management/roles/useRemoveRoleAssignments.d.ts.map +0 -1
- package/dist/hooks/management/roles/useRemoveRoleAssignments.js +0 -25
- package/dist/hooks/management/roles/useRemoveRoleAssignments.js.map +0 -1
- package/dist/hooks/management/roles/useUpdateRole.d.ts +0 -24
- package/dist/hooks/management/roles/useUpdateRole.d.ts.map +0 -1
- package/dist/hooks/management/roles/useUpdateRole.js +0 -25
- package/dist/hooks/management/roles/useUpdateRole.js.map +0 -1
- package/dist/hooks/management/users/useCreateUser.d.ts +0 -11
- package/dist/hooks/management/users/useCreateUser.d.ts.map +0 -1
- package/dist/hooks/management/users/useCreateUser.js +0 -24
- package/dist/hooks/management/users/useCreateUser.js.map +0 -1
- package/dist/hooks/management/users/useDeleteUser.d.ts +0 -10
- package/dist/hooks/management/users/useDeleteUser.d.ts.map +0 -1
- package/dist/hooks/management/users/useDeleteUser.js +0 -24
- package/dist/hooks/management/users/useDeleteUser.js.map +0 -1
- package/dist/hooks/management/users/useGetUser.d.ts +0 -12
- package/dist/hooks/management/users/useGetUser.d.ts.map +0 -1
- package/dist/hooks/management/users/useGetUser.js +0 -28
- package/dist/hooks/management/users/useGetUser.js.map +0 -1
- package/dist/hooks/management/users/useGetUserGroups.d.ts +0 -16
- package/dist/hooks/management/users/useGetUserGroups.d.ts.map +0 -1
- package/dist/hooks/management/users/useGetUserGroups.js +0 -39
- package/dist/hooks/management/users/useGetUserGroups.js.map +0 -1
- package/dist/hooks/management/users/useGetUserTypes.d.ts +0 -15
- package/dist/hooks/management/users/useGetUserTypes.d.ts.map +0 -1
- package/dist/hooks/management/users/useGetUserTypes.js +0 -29
- package/dist/hooks/management/users/useGetUserTypes.js.map +0 -1
- package/dist/hooks/management/users/useGetUsers.d.ts +0 -17
- package/dist/hooks/management/users/useGetUsers.d.ts.map +0 -1
- package/dist/hooks/management/users/useGetUsers.js +0 -36
- package/dist/hooks/management/users/useGetUsers.js.map +0 -1
- package/dist/hooks/management/users/useUpdateUser.d.ts +0 -18
- package/dist/hooks/management/users/useUpdateUser.d.ts.map +0 -1
- package/dist/hooks/management/users/useUpdateUser.js +0 -25
- package/dist/hooks/management/users/useUpdateUser.js.map +0 -1
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
import resolveConsentText_default from "../../components/auth/flow/resolveConsentText.js";
|
|
2
|
+
import getConsentDetailListDisplay_default from "../../utils/getConsentDetailListDisplay.js";
|
|
3
|
+
import isConsentDetailPlainList_default from "../../utils/isConsentDetailPlainList.js";
|
|
4
|
+
import { getConsentInvalidKey, getConsentModifiedKey } from "@thunderid/browser";
|
|
5
|
+
import { useState } from "react";
|
|
6
|
+
|
|
7
|
+
//#region src/hooks/auth/useConsentDetailField.ts
|
|
8
|
+
const DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
|
|
9
|
+
/**
|
|
10
|
+
* Reports whether a value the user entered for an authorization detail field stays within the value
|
|
11
|
+
* that was shown, in the direction the field may move.
|
|
12
|
+
*
|
|
13
|
+
* @param modification - `decrease` or `increase`.
|
|
14
|
+
* @param candidate - Value the user entered.
|
|
15
|
+
* @param shown - Value that was shown.
|
|
16
|
+
* @returns Whether the candidate is allowed.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* isWithinConsentBound('decrease', 20, 35) // returns true
|
|
21
|
+
* isWithinConsentBound('decrease', 40, 35) // returns false
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
const isWithinConsentBound = (modification, candidate, shown) => modification === "decrease" ? candidate <= shown : candidate >= shown;
|
|
25
|
+
/**
|
|
26
|
+
* Checks the text a user entered for an authorization detail field that may be decreased or increased: a
|
|
27
|
+
* number, or a date in `YYYY-MM-DD` form. The text must be a value of the field's kind and stay within the
|
|
28
|
+
* value that was shown, in the direction the field may move.
|
|
29
|
+
*
|
|
30
|
+
* @param row - The field, carrying the shown value and its modification.
|
|
31
|
+
* @param text - The text the user entered.
|
|
32
|
+
* @returns The error to show, or `undefined` when the text may be submitted.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* getConsentDetailInputError({label: 'Amount', modification: 'decrease', path: 'amount', value: 35}, '50')
|
|
37
|
+
* // returns {key: 'consent.authorization_details.number_max', params: {value: '35'}}
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
const getConsentDetailInputError = (row, text) => {
|
|
41
|
+
const modification = row.modification ?? "";
|
|
42
|
+
const params = { value: String(row.value) };
|
|
43
|
+
if (typeof row.value === "number") {
|
|
44
|
+
const entered = Number(text);
|
|
45
|
+
if (text.trim() === "" || !Number.isFinite(entered)) return {
|
|
46
|
+
key: "consent.authorization_details.invalid_number",
|
|
47
|
+
params
|
|
48
|
+
};
|
|
49
|
+
if (!isWithinConsentBound(modification, entered, row.value)) return {
|
|
50
|
+
key: modification === "decrease" ? "consent.authorization_details.number_max" : "consent.authorization_details.number_min",
|
|
51
|
+
params
|
|
52
|
+
};
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (!DATE_PATTERN.test(text) || Number.isNaN(Date.parse(text))) return {
|
|
56
|
+
key: "consent.authorization_details.invalid_date",
|
|
57
|
+
params
|
|
58
|
+
};
|
|
59
|
+
if (!isWithinConsentBound(modification, text, String(row.value))) return {
|
|
60
|
+
key: modification === "decrease" ? "consent.authorization_details.date_max" : "consent.authorization_details.date_min",
|
|
61
|
+
params
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Tells how the user may change one field of an authorization detail on the consent screen. A number may
|
|
66
|
+
* be lowered or raised, a date in `YYYY-MM-DD` form moved earlier or later, and items of a plain list
|
|
67
|
+
* removed (when it has more than one) or added. A date and time is never changed by the user.
|
|
68
|
+
*
|
|
69
|
+
* @param row - The field.
|
|
70
|
+
* @returns The kind of input the field takes, or `undefined` when the field is read-only.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```typescript
|
|
74
|
+
* getConsentDetailInputKind({label: 'Amount', modification: 'decrease', path: 'amount', value: 35}) // returns 'number'
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
const getConsentDetailInputKind = (row) => {
|
|
78
|
+
const isOrdered = row.modification === "decrease" || row.modification === "increase";
|
|
79
|
+
if (isOrdered && typeof row.value === "number") return "number";
|
|
80
|
+
if (isOrdered && row.as === "date" && typeof row.value === "string" && DATE_PATTERN.test(row.value)) return "date";
|
|
81
|
+
if (row.modification === "removeItems" && isConsentDetailPlainList_default(row.value) && row.value.length > 1) return "removeItems";
|
|
82
|
+
if (row.modification === "addItems" && isConsentDetailPlainList_default(row.value)) return "addItems";
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Gives the text a `number` or `date` authorization detail field shows when the user is not typing into it:
|
|
86
|
+
* the value the user chose, or the value that was shown when the user has not changed it.
|
|
87
|
+
*
|
|
88
|
+
* @param purposeId - The identifier of the consent purpose the authorization detail belongs to.
|
|
89
|
+
* @param detailId - The identifier of the authorization detail, its consent element name.
|
|
90
|
+
* @param row - The field.
|
|
91
|
+
* @param formValues - Form values, holding the JSON text of each changed field under its modified key.
|
|
92
|
+
* @returns The text to show.
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```typescript
|
|
96
|
+
* getConsentDetailInputText('p1', 'd-1', amountRow, {'__consent_modified__p1__d-1__amount': '20'}) // returns '20'
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
const getConsentDetailInputText = (purposeId, detailId, row, formValues) => {
|
|
100
|
+
const raw = formValues[getConsentModifiedKey(purposeId, detailId, row.path)];
|
|
101
|
+
if (typeof raw === "string" && raw !== "") try {
|
|
102
|
+
const value = JSON.parse(raw);
|
|
103
|
+
if (typeof value === "number" || typeof value === "string") return String(value);
|
|
104
|
+
} catch {}
|
|
105
|
+
return String(row.value);
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Turns the text a user entered into a `number` or `date` authorization detail field into the form values
|
|
109
|
+
* to write. Text within the field's bound becomes the field's modified value. Any other text clears the
|
|
110
|
+
* modified value, so a value entered earlier is never submitted in its place, and marks the field invalid,
|
|
111
|
+
* which blocks approval until the user corrects it.
|
|
112
|
+
*
|
|
113
|
+
* @param purposeId - The identifier of the consent purpose the authorization detail belongs to.
|
|
114
|
+
* @param detailId - The identifier of the authorization detail, its consent element name.
|
|
115
|
+
* @param row - The field, carrying the shown value and its modification.
|
|
116
|
+
* @param text - The text the user entered.
|
|
117
|
+
* @returns The error, if any, and the form values to write.
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```typescript
|
|
121
|
+
* parseConsentDetailInput('p1', 'd-1', amountRow, '20')
|
|
122
|
+
* // returns {isValid: true, formValues: {'__consent_modified__p1__d-1__amount': '20', '__consent_invalid__p1__d-1__amount': ''}}
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
const parseConsentDetailInput = (purposeId, detailId, row, text) => {
|
|
126
|
+
const modifiedKey = getConsentModifiedKey(purposeId, detailId, row.path);
|
|
127
|
+
const invalidKey = getConsentInvalidKey(purposeId, detailId, row.path);
|
|
128
|
+
const error = getConsentDetailInputError(row, text);
|
|
129
|
+
if (error) return {
|
|
130
|
+
error,
|
|
131
|
+
formValues: {
|
|
132
|
+
[invalidKey]: "true",
|
|
133
|
+
[modifiedKey]: ""
|
|
134
|
+
},
|
|
135
|
+
isValid: false
|
|
136
|
+
};
|
|
137
|
+
const value = typeof row.value === "number" ? Number(text) : text;
|
|
138
|
+
return {
|
|
139
|
+
formValues: {
|
|
140
|
+
[invalidKey]: "",
|
|
141
|
+
[modifiedKey]: JSON.stringify(value)
|
|
142
|
+
},
|
|
143
|
+
isValid: true
|
|
144
|
+
};
|
|
145
|
+
};
|
|
146
|
+
/**
|
|
147
|
+
* Gives the form values that return an authorization detail field to the value that was shown: no
|
|
148
|
+
* modified value and no invalid marker. A field the user left empty is reset this way when it loses focus.
|
|
149
|
+
*
|
|
150
|
+
* @param purposeId - The identifier of the consent purpose the authorization detail belongs to.
|
|
151
|
+
* @param detailId - The identifier of the authorization detail, its consent element name.
|
|
152
|
+
* @param path - Dot-separated location of the field within the detail.
|
|
153
|
+
* @returns The form values to write, keyed by form key.
|
|
154
|
+
*
|
|
155
|
+
* @example
|
|
156
|
+
* ```typescript
|
|
157
|
+
* resetConsentDetailInput('p1', 'd-1', 'amount')
|
|
158
|
+
* // returns {'__consent_modified__p1__d-1__amount': '', '__consent_invalid__p1__d-1__amount': ''}
|
|
159
|
+
* ```
|
|
160
|
+
*/
|
|
161
|
+
const resetConsentDetailInput = (purposeId, detailId, path) => ({
|
|
162
|
+
[getConsentInvalidKey(purposeId, detailId, path)]: "",
|
|
163
|
+
[getConsentModifiedKey(purposeId, detailId, path)]: ""
|
|
164
|
+
});
|
|
165
|
+
/**
|
|
166
|
+
* Lists the items of a `removeItems` or `addItems` authorization detail field as the consent screen offers
|
|
167
|
+
* them. For `removeItems`, every shown item is listed, selected while kept; a kept item can be removed
|
|
168
|
+
* unless it is the last one, and a removed item can be added back. For `addItems`, the shown items are
|
|
169
|
+
* selected and fixed, the items the user added are selected and can be taken out again, and the values the
|
|
170
|
+
* type allows are offered unselected.
|
|
171
|
+
*
|
|
172
|
+
* @param purposeId - The identifier of the consent purpose the authorization detail belongs to.
|
|
173
|
+
* @param detailId - The identifier of the authorization detail, its consent element name.
|
|
174
|
+
* @param row - The list field.
|
|
175
|
+
* @param formValues - Form values, holding the JSON text of each changed field under its modified key.
|
|
176
|
+
* @returns The items, in display order.
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* ```typescript
|
|
180
|
+
* getConsentDetailListItems('p1', 'd-1', {label: 'Actions', modification: 'removeItems', path: 'actions', value: ['a', 'b']}, {})
|
|
181
|
+
* // returns [{origin: 'shown', selected: true, toggleable: true, value: 'a'}, {origin: 'shown', selected: true, toggleable: true, value: 'b'}]
|
|
182
|
+
* ```
|
|
183
|
+
*/
|
|
184
|
+
const getConsentDetailListItems = (purposeId, detailId, row, formValues) => {
|
|
185
|
+
const shown = isConsentDetailPlainList_default(row.value) ? row.value : [];
|
|
186
|
+
let current = shown;
|
|
187
|
+
const raw = formValues[getConsentModifiedKey(purposeId, detailId, row.path)];
|
|
188
|
+
if (typeof raw === "string" && raw !== "") try {
|
|
189
|
+
const parsed = JSON.parse(raw);
|
|
190
|
+
if (isConsentDetailPlainList_default(parsed)) current = parsed;
|
|
191
|
+
} catch {}
|
|
192
|
+
if (row.modification === "removeItems") {
|
|
193
|
+
const keptCount = shown.filter((item) => current.includes(item)).length;
|
|
194
|
+
return shown.map((value) => {
|
|
195
|
+
const selected = current.includes(value);
|
|
196
|
+
return {
|
|
197
|
+
origin: "shown",
|
|
198
|
+
selected,
|
|
199
|
+
toggleable: !selected || keptCount > 1,
|
|
200
|
+
value
|
|
201
|
+
};
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
const added = current.filter((item) => !shown.includes(item));
|
|
205
|
+
const offered = (isConsentDetailPlainList_default(row.options) ? row.options : []).filter((option) => !shown.includes(option) && !added.includes(option));
|
|
206
|
+
return [
|
|
207
|
+
...shown.map((value) => ({
|
|
208
|
+
origin: "shown",
|
|
209
|
+
selected: true,
|
|
210
|
+
toggleable: false,
|
|
211
|
+
value
|
|
212
|
+
})),
|
|
213
|
+
...added.map((value) => ({
|
|
214
|
+
origin: "added",
|
|
215
|
+
selected: true,
|
|
216
|
+
toggleable: true,
|
|
217
|
+
value
|
|
218
|
+
})),
|
|
219
|
+
...offered.map((value) => ({
|
|
220
|
+
origin: "offered",
|
|
221
|
+
selected: false,
|
|
222
|
+
toggleable: true,
|
|
223
|
+
value
|
|
224
|
+
}))
|
|
225
|
+
];
|
|
226
|
+
};
|
|
227
|
+
/**
|
|
228
|
+
* Toggles one item of a `removeItems` or `addItems` authorization detail field: a selected item is taken
|
|
229
|
+
* out and an unselected one put in, within what the field's rule allows.
|
|
230
|
+
*
|
|
231
|
+
* @param purposeId - The identifier of the consent purpose the authorization detail belongs to.
|
|
232
|
+
* @param detailId - The identifier of the authorization detail, its consent element name.
|
|
233
|
+
* @param row - The list field.
|
|
234
|
+
* @param formValues - Form values, holding the JSON text of each changed field under its modified key.
|
|
235
|
+
* @param item - The item to toggle.
|
|
236
|
+
* @returns The form values to write, keyed by form key, or `undefined` when the item cannot be toggled.
|
|
237
|
+
*
|
|
238
|
+
* @example
|
|
239
|
+
* ```typescript
|
|
240
|
+
* toggleConsentDetailListItem('p1', 'd-1', actionsRow, {}, 'status') // returns {'__consent_modified__p1__d-1__actions': '["initiate"]'}
|
|
241
|
+
* ```
|
|
242
|
+
*/
|
|
243
|
+
const toggleConsentDetailListItem = (purposeId, detailId, row, formValues, item) => {
|
|
244
|
+
const items = getConsentDetailListItems(purposeId, detailId, row, formValues);
|
|
245
|
+
const target = items.find((entry) => entry.value === item);
|
|
246
|
+
if (!target?.toggleable) return void 0;
|
|
247
|
+
const next = items.filter((entry) => entry === target ? !entry.selected : entry.selected).map((entry) => entry.value);
|
|
248
|
+
return { [getConsentModifiedKey(purposeId, detailId, row.path)]: JSON.stringify(next) };
|
|
249
|
+
};
|
|
250
|
+
/**
|
|
251
|
+
* Adds a typed value to an `addItems` authorization detail field whose type allows any value. The text is
|
|
252
|
+
* trimmed, and read as a number when every shown item is a number.
|
|
253
|
+
*
|
|
254
|
+
* @param purposeId - The identifier of the consent purpose the authorization detail belongs to.
|
|
255
|
+
* @param detailId - The identifier of the authorization detail, its consent element name.
|
|
256
|
+
* @param row - The list field.
|
|
257
|
+
* @param formValues - Form values, holding the JSON text of each changed field under its modified key.
|
|
258
|
+
* @param text - The text the user typed.
|
|
259
|
+
* @returns The form values to write, keyed by form key, or `undefined` when the text is empty, not a
|
|
260
|
+
* number where one is needed, already listed, or the field does not take typed values.
|
|
261
|
+
*
|
|
262
|
+
* @example
|
|
263
|
+
* ```typescript
|
|
264
|
+
* addConsentDetailListItem('p1', 'd-1', blockedRow, {}, ' y ') // returns {'__consent_modified__p1__d-1__blocked': '["x","y"]'}
|
|
265
|
+
* ```
|
|
266
|
+
*/
|
|
267
|
+
const addConsentDetailListItem = (purposeId, detailId, row, formValues, text) => {
|
|
268
|
+
if (row.modification !== "addItems" || row.options !== void 0 || !Array.isArray(row.value)) return void 0;
|
|
269
|
+
const trimmed = text.trim();
|
|
270
|
+
if (!trimmed) return void 0;
|
|
271
|
+
const numeric = row.value.length > 0 && row.value.every((item) => typeof item === "number");
|
|
272
|
+
const value = numeric ? Number(trimmed) : trimmed;
|
|
273
|
+
const selected = getConsentDetailListItems(purposeId, detailId, row, formValues).filter((entry) => entry.selected).map((entry) => entry.value);
|
|
274
|
+
if (numeric && !Number.isFinite(value) || selected.includes(value)) return void 0;
|
|
275
|
+
return { [getConsentModifiedKey(purposeId, detailId, row.path)]: JSON.stringify([...selected, value]) };
|
|
276
|
+
};
|
|
277
|
+
/**
|
|
278
|
+
* Headless state of one authorization detail field on the consent screen. A `number` or `date` field keeps
|
|
279
|
+
* the text the user typed, writes it to the decision only while it stays within the field's bound, and
|
|
280
|
+
* otherwise clears the field's modification and marks the field invalid, which blocks approval (see
|
|
281
|
+
* `isConsentApprovalBlocked`). A list field exposes its items and toggles them as its rule allows.
|
|
282
|
+
*
|
|
283
|
+
* @param props - The field and the consent form state.
|
|
284
|
+
* @returns The field's state and handlers.
|
|
285
|
+
*
|
|
286
|
+
* @example
|
|
287
|
+
* ```tsx
|
|
288
|
+
* const field = useConsentDetailField({purposeId, detailId, row, formValues, onInputChange});
|
|
289
|
+
* <input value={field.text} onChange={(e) => field.handleChange(e.target.value)} onBlur={field.handleBlur} />
|
|
290
|
+
* ```
|
|
291
|
+
*/
|
|
292
|
+
const useConsentDetailField = ({ detailId, formValues, onInputChange, purposeId, row, t }) => {
|
|
293
|
+
const [draft, setDraft] = useState(void 0);
|
|
294
|
+
const [isListExpanded, setListExpanded] = useState(false);
|
|
295
|
+
const kind = getConsentDetailInputKind(row);
|
|
296
|
+
const isScalar = kind === "number" || kind === "date";
|
|
297
|
+
const isList = kind === "removeItems" || kind === "addItems";
|
|
298
|
+
const items = isList ? getConsentDetailListItems(purposeId, detailId, row, formValues) : [];
|
|
299
|
+
const isPlainList = isConsentDetailPlainList_default(row.value);
|
|
300
|
+
let listCount = 0;
|
|
301
|
+
if (isList) listCount = items.length;
|
|
302
|
+
else if (isConsentDetailPlainList_default(row.value)) listCount = row.value.length;
|
|
303
|
+
const find = (item) => items.find((entry) => entry.value === item);
|
|
304
|
+
const write = (values) => {
|
|
305
|
+
Object.entries(values ?? {}).forEach(([name, value]) => onInputChange(name, value));
|
|
306
|
+
};
|
|
307
|
+
const inputError = isScalar && draft !== void 0 ? getConsentDetailInputError(row, draft) : void 0;
|
|
308
|
+
return {
|
|
309
|
+
error: inputError && {
|
|
310
|
+
...inputError,
|
|
311
|
+
message: resolveConsentText_default(t, inputError.key, inputError.params)
|
|
312
|
+
},
|
|
313
|
+
handleAdd: (text) => {
|
|
314
|
+
const values = addConsentDetailListItem(purposeId, detailId, row, formValues, text);
|
|
315
|
+
write(values);
|
|
316
|
+
if (values) setDraft(void 0);
|
|
317
|
+
return Boolean(values);
|
|
318
|
+
},
|
|
319
|
+
handleBlur: () => {
|
|
320
|
+
if (!isScalar || draft === void 0) return;
|
|
321
|
+
if (draft.trim() === "") {
|
|
322
|
+
write(resetConsentDetailInput(purposeId, detailId, row.path));
|
|
323
|
+
setDraft(void 0);
|
|
324
|
+
} else if (!getConsentDetailInputError(row, draft)) setDraft(void 0);
|
|
325
|
+
},
|
|
326
|
+
handleChange: (text) => {
|
|
327
|
+
setDraft(text);
|
|
328
|
+
if (isScalar) write(parseConsentDetailInput(purposeId, detailId, row, text).formValues);
|
|
329
|
+
},
|
|
330
|
+
handleListToggle: setListExpanded,
|
|
331
|
+
handleToggle: (item) => {
|
|
332
|
+
write(toggleConsentDetailListItem(purposeId, detailId, row, formValues, item));
|
|
333
|
+
},
|
|
334
|
+
inputId: `consent_modify_${purposeId}_${detailId}_${row.path}`,
|
|
335
|
+
isListExpanded,
|
|
336
|
+
isPlainList,
|
|
337
|
+
isSelected: (item) => Boolean(find(item)?.selected),
|
|
338
|
+
isToggleable: (item) => Boolean(find(item)?.toggleable),
|
|
339
|
+
isTypedItemAllowed: kind === "addItems" && row.options === void 0,
|
|
340
|
+
isValid: !inputError,
|
|
341
|
+
items,
|
|
342
|
+
kind,
|
|
343
|
+
label: row.label || row.path,
|
|
344
|
+
listDisplay: getConsentDetailListDisplay_default(listCount, isListExpanded),
|
|
345
|
+
max: isScalar && row.modification === "decrease" ? String(row.value) : void 0,
|
|
346
|
+
min: isScalar && row.modification === "increase" ? String(row.value) : void 0,
|
|
347
|
+
text: draft ?? (isScalar ? getConsentDetailInputText(purposeId, detailId, row, formValues) : "")
|
|
348
|
+
};
|
|
349
|
+
};
|
|
350
|
+
var useConsentDetailField_default = useConsentDetailField;
|
|
351
|
+
|
|
352
|
+
//#endregion
|
|
353
|
+
export { useConsentDetailField_default as default };
|
|
354
|
+
//# sourceMappingURL=useConsentDetailField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useConsentDetailField.js","names":["modification: string","params: Record<string, string>","isOrdered: boolean","isConsentDetailPlainList","raw: unknown","value: unknown","modifiedKey: string","invalidKey: string","error: ConsentDetailInputError | undefined","value: number | string","shown: PlainItem[]","current: PlainItem[]","parsed: unknown","keptCount: number","selected: boolean","added: PlainItem[]","offered: PlainItem[]","items: ConsentDetailListItem[]","target: ConsentDetailListItem | undefined","next: (string | number | boolean)[]","trimmed: string","numeric: boolean","value: string | number","selected: (string | number | boolean)[]","kind: ConsentDetailInputKind | undefined","isScalar: boolean","isList: boolean","isPlainList: boolean","inputError: ConsentDetailInputError | undefined","resolveConsentText","values: Record<string, string> | undefined","getConsentDetailListDisplay"],"sources":["../../../src/hooks/auth/useConsentDetailField.ts"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {type ConsentDetailRow, getConsentInvalidKey, getConsentModifiedKey} from '@thunderid/browser';\nimport {useState} from 'react';\nimport resolveConsentText from '../../components/auth/flow/resolveConsentText';\nimport getConsentDetailListDisplay, {type ConsentDetailListDisplay} from '../../utils/getConsentDetailListDisplay';\nimport isConsentDetailPlainList from '../../utils/isConsentDetailPlainList';\nimport {UseTranslation} from '../useTranslation';\n\n/**\n * How the user may change one field of an authorization detail on the consent screen: type a lower or\n * higher `number` or `date`, or toggle items of a list whose rule is `removeItems` or `addItems`.\n *\n * @experimental This type may change in future versions\n */\nexport type ConsentDetailInputKind = 'number' | 'date' | 'removeItems' | 'addItems';\n\n/**\n * Error shown for text a user entered into an authorization detail field, as a translation key and the\n * values to substitute into its text.\n *\n * @experimental This interface may change in future versions\n */\nexport interface ConsentDetailInputError {\n /** Translation key of the message. */\n key: string;\n /** Values to substitute into the message: `value` is the value that was shown. */\n params: Record<string, string>;\n}\n\n/**\n * Outcome of the text a user entered into a `number` or `date` authorization detail field.\n *\n * @experimental This interface may change in future versions\n */\ninterface ConsentDetailInputResult {\n /** Why the text cannot be submitted, absent when it can. */\n error?: ConsentDetailInputError;\n /**\n * Form values to write, keyed by form key: the field's modified value, cleared when the text cannot be\n * submitted, and its invalid marker.\n */\n formValues: Record<string, string>;\n /** Whether the text may be submitted. */\n isValid: boolean;\n}\n\n/**\n * One item of a list field of an authorization detail, as the consent screen offers it.\n *\n * @experimental This interface may change in future versions\n */\nexport interface ConsentDetailListItem {\n /**\n * Where the item comes from: `shown` in the requested detail, `added` by the user, or `offered` by the\n * type for the user to add.\n */\n origin: 'shown' | 'added' | 'offered';\n /** Whether the item is part of the value that would be granted. */\n selected: boolean;\n /** Whether the user may toggle the item. */\n toggleable: boolean;\n /** The item. */\n value: string | number | boolean;\n}\n\nconst DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/;\n\ntype PlainItem = string | number | boolean;\n\n/**\n * Reports whether a value the user entered for an authorization detail field stays within the value\n * that was shown, in the direction the field may move.\n *\n * @param modification - `decrease` or `increase`.\n * @param candidate - Value the user entered.\n * @param shown - Value that was shown.\n * @returns Whether the candidate is allowed.\n *\n * @example\n * ```typescript\n * isWithinConsentBound('decrease', 20, 35) // returns true\n * isWithinConsentBound('decrease', 40, 35) // returns false\n * ```\n */\nconst isWithinConsentBound = <T extends number | string>(modification: string, candidate: T, shown: T): boolean =>\n modification === 'decrease' ? candidate <= shown : candidate >= shown;\n\n/**\n * Checks the text a user entered for an authorization detail field that may be decreased or increased: a\n * number, or a date in `YYYY-MM-DD` form. The text must be a value of the field's kind and stay within the\n * value that was shown, in the direction the field may move.\n *\n * @param row - The field, carrying the shown value and its modification.\n * @param text - The text the user entered.\n * @returns The error to show, or `undefined` when the text may be submitted.\n *\n * @example\n * ```typescript\n * getConsentDetailInputError({label: 'Amount', modification: 'decrease', path: 'amount', value: 35}, '50')\n * // returns {key: 'consent.authorization_details.number_max', params: {value: '35'}}\n * ```\n */\nconst getConsentDetailInputError = (row: ConsentDetailRow, text: string): ConsentDetailInputError | undefined => {\n const modification: string = row.modification ?? '';\n const params: Record<string, string> = {value: String(row.value)};\n\n if (typeof row.value === 'number') {\n const entered = Number(text);\n if (text.trim() === '' || !Number.isFinite(entered)) {\n return {key: 'consent.authorization_details.invalid_number', params};\n }\n if (!isWithinConsentBound(modification, entered, row.value)) {\n return {\n key:\n modification === 'decrease'\n ? 'consent.authorization_details.number_max'\n : 'consent.authorization_details.number_min',\n params,\n };\n }\n\n return undefined;\n }\n\n if (!DATE_PATTERN.test(text) || Number.isNaN(Date.parse(text))) {\n return {key: 'consent.authorization_details.invalid_date', params};\n }\n if (!isWithinConsentBound(modification, text, String(row.value))) {\n return {\n key:\n modification === 'decrease'\n ? 'consent.authorization_details.date_max'\n : 'consent.authorization_details.date_min',\n params,\n };\n }\n\n return undefined;\n};\n\n/**\n * Tells how the user may change one field of an authorization detail on the consent screen. A number may\n * be lowered or raised, a date in `YYYY-MM-DD` form moved earlier or later, and items of a plain list\n * removed (when it has more than one) or added. A date and time is never changed by the user.\n *\n * @param row - The field.\n * @returns The kind of input the field takes, or `undefined` when the field is read-only.\n *\n * @example\n * ```typescript\n * getConsentDetailInputKind({label: 'Amount', modification: 'decrease', path: 'amount', value: 35}) // returns 'number'\n * ```\n */\nconst getConsentDetailInputKind = (row: ConsentDetailRow): ConsentDetailInputKind | undefined => {\n const isOrdered: boolean = row.modification === 'decrease' || row.modification === 'increase';\n\n if (isOrdered && typeof row.value === 'number') return 'number';\n if (isOrdered && row.as === 'date' && typeof row.value === 'string' && DATE_PATTERN.test(row.value)) return 'date';\n if (row.modification === 'removeItems' && isConsentDetailPlainList(row.value) && row.value.length > 1)\n return 'removeItems';\n if (row.modification === 'addItems' && isConsentDetailPlainList(row.value)) return 'addItems';\n\n return undefined;\n};\n\n/**\n * Gives the text a `number` or `date` authorization detail field shows when the user is not typing into it:\n * the value the user chose, or the value that was shown when the user has not changed it.\n *\n * @param purposeId - The identifier of the consent purpose the authorization detail belongs to.\n * @param detailId - The identifier of the authorization detail, its consent element name.\n * @param row - The field.\n * @param formValues - Form values, holding the JSON text of each changed field under its modified key.\n * @returns The text to show.\n *\n * @example\n * ```typescript\n * getConsentDetailInputText('p1', 'd-1', amountRow, {'__consent_modified__p1__d-1__amount': '20'}) // returns '20'\n * ```\n */\nconst getConsentDetailInputText = (\n purposeId: string,\n detailId: string,\n row: ConsentDetailRow,\n formValues: Record<string, unknown>,\n): string => {\n const raw: unknown = formValues[getConsentModifiedKey(purposeId, detailId, row.path)];\n if (typeof raw === 'string' && raw !== '') {\n try {\n const value: unknown = JSON.parse(raw);\n if (typeof value === 'number' || typeof value === 'string') return String(value);\n } catch {\n // Not a value the field wrote; show the value that was shown instead.\n }\n }\n\n return String(row.value);\n};\n\n/**\n * Turns the text a user entered into a `number` or `date` authorization detail field into the form values\n * to write. Text within the field's bound becomes the field's modified value. Any other text clears the\n * modified value, so a value entered earlier is never submitted in its place, and marks the field invalid,\n * which blocks approval until the user corrects it.\n *\n * @param purposeId - The identifier of the consent purpose the authorization detail belongs to.\n * @param detailId - The identifier of the authorization detail, its consent element name.\n * @param row - The field, carrying the shown value and its modification.\n * @param text - The text the user entered.\n * @returns The error, if any, and the form values to write.\n *\n * @example\n * ```typescript\n * parseConsentDetailInput('p1', 'd-1', amountRow, '20')\n * // returns {isValid: true, formValues: {'__consent_modified__p1__d-1__amount': '20', '__consent_invalid__p1__d-1__amount': ''}}\n * ```\n */\nconst parseConsentDetailInput = (\n purposeId: string,\n detailId: string,\n row: ConsentDetailRow,\n text: string,\n): ConsentDetailInputResult => {\n const modifiedKey: string = getConsentModifiedKey(purposeId, detailId, row.path);\n const invalidKey: string = getConsentInvalidKey(purposeId, detailId, row.path);\n const error: ConsentDetailInputError | undefined = getConsentDetailInputError(row, text);\n\n if (error) {\n return {error, formValues: {[invalidKey]: 'true', [modifiedKey]: ''}, isValid: false};\n }\n\n const value: number | string = typeof row.value === 'number' ? Number(text) : text;\n\n return {formValues: {[invalidKey]: '', [modifiedKey]: JSON.stringify(value)}, isValid: true};\n};\n\n/**\n * Gives the form values that return an authorization detail field to the value that was shown: no\n * modified value and no invalid marker. A field the user left empty is reset this way when it loses focus.\n *\n * @param purposeId - The identifier of the consent purpose the authorization detail belongs to.\n * @param detailId - The identifier of the authorization detail, its consent element name.\n * @param path - Dot-separated location of the field within the detail.\n * @returns The form values to write, keyed by form key.\n *\n * @example\n * ```typescript\n * resetConsentDetailInput('p1', 'd-1', 'amount')\n * // returns {'__consent_modified__p1__d-1__amount': '', '__consent_invalid__p1__d-1__amount': ''}\n * ```\n */\nconst resetConsentDetailInput = (purposeId: string, detailId: string, path: string): Record<string, string> => ({\n [getConsentInvalidKey(purposeId, detailId, path)]: '',\n [getConsentModifiedKey(purposeId, detailId, path)]: '',\n});\n\n/**\n * Lists the items of a `removeItems` or `addItems` authorization detail field as the consent screen offers\n * them. For `removeItems`, every shown item is listed, selected while kept; a kept item can be removed\n * unless it is the last one, and a removed item can be added back. For `addItems`, the shown items are\n * selected and fixed, the items the user added are selected and can be taken out again, and the values the\n * type allows are offered unselected.\n *\n * @param purposeId - The identifier of the consent purpose the authorization detail belongs to.\n * @param detailId - The identifier of the authorization detail, its consent element name.\n * @param row - The list field.\n * @param formValues - Form values, holding the JSON text of each changed field under its modified key.\n * @returns The items, in display order.\n *\n * @example\n * ```typescript\n * getConsentDetailListItems('p1', 'd-1', {label: 'Actions', modification: 'removeItems', path: 'actions', value: ['a', 'b']}, {})\n * // returns [{origin: 'shown', selected: true, toggleable: true, value: 'a'}, {origin: 'shown', selected: true, toggleable: true, value: 'b'}]\n * ```\n */\nconst getConsentDetailListItems = (\n purposeId: string,\n detailId: string,\n row: ConsentDetailRow,\n formValues: Record<string, unknown>,\n): ConsentDetailListItem[] => {\n const shown: PlainItem[] = isConsentDetailPlainList(row.value) ? row.value : [];\n let current: PlainItem[] = shown;\n const raw: unknown = formValues[getConsentModifiedKey(purposeId, detailId, row.path)];\n if (typeof raw === 'string' && raw !== '') {\n try {\n const parsed: unknown = JSON.parse(raw);\n if (isConsentDetailPlainList(parsed)) current = parsed;\n } catch {\n // Not a list the field wrote; the shown list stands.\n }\n }\n\n if (row.modification === 'removeItems') {\n const keptCount: number = shown.filter((item: PlainItem) => current.includes(item)).length;\n return shown.map((value: PlainItem) => {\n const selected: boolean = current.includes(value);\n return {origin: 'shown', selected, toggleable: !selected || keptCount > 1, value};\n });\n }\n\n const added: PlainItem[] = current.filter((item: PlainItem) => !shown.includes(item));\n const offered: PlainItem[] = (isConsentDetailPlainList(row.options) ? row.options : []).filter(\n (option: PlainItem) => !shown.includes(option) && !added.includes(option),\n );\n\n return [\n ...shown.map(\n (value: PlainItem): ConsentDetailListItem => ({origin: 'shown', selected: true, toggleable: false, value}),\n ),\n ...added.map(\n (value: PlainItem): ConsentDetailListItem => ({origin: 'added', selected: true, toggleable: true, value}),\n ),\n ...offered.map(\n (value: PlainItem): ConsentDetailListItem => ({origin: 'offered', selected: false, toggleable: true, value}),\n ),\n ];\n};\n\n/**\n * Toggles one item of a `removeItems` or `addItems` authorization detail field: a selected item is taken\n * out and an unselected one put in, within what the field's rule allows.\n *\n * @param purposeId - The identifier of the consent purpose the authorization detail belongs to.\n * @param detailId - The identifier of the authorization detail, its consent element name.\n * @param row - The list field.\n * @param formValues - Form values, holding the JSON text of each changed field under its modified key.\n * @param item - The item to toggle.\n * @returns The form values to write, keyed by form key, or `undefined` when the item cannot be toggled.\n *\n * @example\n * ```typescript\n * toggleConsentDetailListItem('p1', 'd-1', actionsRow, {}, 'status') // returns {'__consent_modified__p1__d-1__actions': '[\"initiate\"]'}\n * ```\n */\nconst toggleConsentDetailListItem = (\n purposeId: string,\n detailId: string,\n row: ConsentDetailRow,\n formValues: Record<string, unknown>,\n item: string | number | boolean,\n): Record<string, string> | undefined => {\n const items: ConsentDetailListItem[] = getConsentDetailListItems(purposeId, detailId, row, formValues);\n const target: ConsentDetailListItem | undefined = items.find((entry: ConsentDetailListItem) => entry.value === item);\n if (!target?.toggleable) return undefined;\n\n const next: (string | number | boolean)[] = items\n .filter((entry: ConsentDetailListItem) => (entry === target ? !entry.selected : entry.selected))\n .map((entry: ConsentDetailListItem) => entry.value);\n\n return {[getConsentModifiedKey(purposeId, detailId, row.path)]: JSON.stringify(next)};\n};\n\n/**\n * Adds a typed value to an `addItems` authorization detail field whose type allows any value. The text is\n * trimmed, and read as a number when every shown item is a number.\n *\n * @param purposeId - The identifier of the consent purpose the authorization detail belongs to.\n * @param detailId - The identifier of the authorization detail, its consent element name.\n * @param row - The list field.\n * @param formValues - Form values, holding the JSON text of each changed field under its modified key.\n * @param text - The text the user typed.\n * @returns The form values to write, keyed by form key, or `undefined` when the text is empty, not a\n * number where one is needed, already listed, or the field does not take typed values.\n *\n * @example\n * ```typescript\n * addConsentDetailListItem('p1', 'd-1', blockedRow, {}, ' y ') // returns {'__consent_modified__p1__d-1__blocked': '[\"x\",\"y\"]'}\n * ```\n */\nconst addConsentDetailListItem = (\n purposeId: string,\n detailId: string,\n row: ConsentDetailRow,\n formValues: Record<string, unknown>,\n text: string,\n): Record<string, string> | undefined => {\n if (row.modification !== 'addItems' || row.options !== undefined || !Array.isArray(row.value)) return undefined;\n const trimmed: string = text.trim();\n if (!trimmed) return undefined;\n\n const numeric: boolean = row.value.length > 0 && row.value.every((item: unknown) => typeof item === 'number');\n const value: string | number = numeric ? Number(trimmed) : trimmed;\n const selected: (string | number | boolean)[] = getConsentDetailListItems(purposeId, detailId, row, formValues)\n .filter((entry: ConsentDetailListItem) => entry.selected)\n .map((entry: ConsentDetailListItem) => entry.value);\n if ((numeric && !Number.isFinite(value)) || selected.includes(value)) return undefined;\n\n return {[getConsentModifiedKey(purposeId, detailId, row.path)]: JSON.stringify([...selected, value])};\n};\n\n/**\n * Props for the useConsentDetailField hook.\n */\nexport interface UseConsentDetailFieldProps {\n /** The identifier of the consent purpose the authorization detail belongs to. */\n purposeId: string;\n /** The identifier of the authorization detail the field belongs to, its consent element name. */\n detailId: string;\n /** Current consent form values. */\n formValues: Record<string, string>;\n /** Callback that writes one consent form value. */\n onInputChange: (name: string, value: string) => void;\n /** The field. */\n row: ConsentDetailRow;\n /** Translator for the error message; the SDK's default bundle is used without one. */\n t?: UseTranslation['t'];\n}\n\n/**\n * Error of a field, with its message resolved.\n */\nexport interface ConsentDetailFieldError extends ConsentDetailInputError {\n /** Translated message. */\n message: string;\n}\n\n/**\n * State and handlers of one authorization detail field, for drawing it in any UI.\n */\nexport interface UseConsentDetailFieldResult {\n /** Why the text shown cannot be submitted, absent when it can. */\n error?: ConsentDetailFieldError;\n /** Adds a typed item to an `addItems` list that takes typed values; returns whether it was added. */\n handleAdd: (text: string) => boolean;\n /** Call when the field loses focus: an empty field returns to the value that was shown. */\n handleBlur: () => void;\n /** Call with the text the user entered into a `number` or `date` field, or the item typed into a list. */\n handleChange: (text: string) => void;\n /** Expands or collapses the field's list. */\n handleListToggle: (expanded: boolean) => void;\n /** Toggles an item of a list field, within what its rule allows. */\n handleToggle: (item: string | number | boolean) => void;\n /** Identifier for the field's input element. */\n inputId: string;\n /** Whether the user expanded the field's list past `CONSENT_DETAIL_DISPLAY_LIMITS.listItems`. */\n isListExpanded: boolean;\n /** Whether the field's value is a list of plain values, shown as a list rather than as structured JSON. */\n isPlainList: boolean;\n /** Whether an item of a list field is part of the value that would be granted. */\n isSelected: (item: string | number | boolean) => boolean;\n /** Whether the user may toggle an item of a list field. */\n isToggleable: (item: string | number | boolean) => boolean;\n /** Whether the field takes typed items: an `addItems` list whose type offers no fixed values. */\n isTypedItemAllowed: boolean;\n /** Whether the field's text may be submitted. Always true for a list or a read-only field. */\n isValid: boolean;\n /** Items of a list field, in display order; empty for any other field. */\n items: ConsentDetailListItem[];\n /** How the user may change the field, or `undefined` when it is read-only. */\n kind?: ConsentDetailInputKind;\n /** Label of the field. */\n label: string;\n /**\n * How many items of the field's list to show and hide: the items of a list the user may change, or the\n * values of a read-only plain list. Nothing is hidden for any other field.\n */\n listDisplay: ConsentDetailListDisplay;\n /** Upper bound of a `number` or `date` field that may be decreased. */\n max?: string;\n /** Lower bound of a `number` or `date` field that may be increased. */\n min?: string;\n /** Text to show: the typed text of a `number` or `date` field, or the item being typed into a list. */\n text: string;\n}\n\n/**\n * Headless state of one authorization detail field on the consent screen. A `number` or `date` field keeps\n * the text the user typed, writes it to the decision only while it stays within the field's bound, and\n * otherwise clears the field's modification and marks the field invalid, which blocks approval (see\n * `isConsentApprovalBlocked`). A list field exposes its items and toggles them as its rule allows.\n *\n * @param props - The field and the consent form state.\n * @returns The field's state and handlers.\n *\n * @example\n * ```tsx\n * const field = useConsentDetailField({purposeId, detailId, row, formValues, onInputChange});\n * <input value={field.text} onChange={(e) => field.handleChange(e.target.value)} onBlur={field.handleBlur} />\n * ```\n */\nconst useConsentDetailField = ({\n detailId,\n formValues,\n onInputChange,\n purposeId,\n row,\n t,\n}: UseConsentDetailFieldProps): UseConsentDetailFieldResult => {\n // The text the user typed, kept as typed even when it cannot be submitted.\n const [draft, setDraft] = useState<string | undefined>(undefined);\n const [isListExpanded, setListExpanded] = useState<boolean>(false);\n const kind: ConsentDetailInputKind | undefined = getConsentDetailInputKind(row);\n const isScalar: boolean = kind === 'number' || kind === 'date';\n const isList: boolean = kind === 'removeItems' || kind === 'addItems';\n const items: ConsentDetailListItem[] = isList ? getConsentDetailListItems(purposeId, detailId, row, formValues) : [];\n const isPlainList: boolean = isConsentDetailPlainList(row.value);\n let listCount = 0;\n if (isList) {\n listCount = items.length;\n } else if (isConsentDetailPlainList(row.value)) {\n listCount = row.value.length;\n }\n const find = (item: string | number | boolean): ConsentDetailListItem | undefined =>\n items.find((entry: ConsentDetailListItem) => entry.value === item);\n\n const write = (values: Record<string, string> | undefined): void => {\n Object.entries(values ?? {}).forEach(([name, value]: [string, string]) => onInputChange(name, value));\n };\n\n const inputError: ConsentDetailInputError | undefined =\n isScalar && draft !== undefined ? getConsentDetailInputError(row, draft) : undefined;\n\n return {\n error: inputError && {...inputError, message: resolveConsentText(t, inputError.key, inputError.params)},\n handleAdd: (text: string): boolean => {\n const values: Record<string, string> | undefined = addConsentDetailListItem(\n purposeId,\n detailId,\n row,\n formValues,\n text,\n );\n write(values);\n if (values) setDraft(undefined);\n return Boolean(values);\n },\n handleBlur: (): void => {\n if (!isScalar || draft === undefined) return;\n if (draft.trim() === '') {\n write(resetConsentDetailInput(purposeId, detailId, row.path));\n setDraft(undefined);\n } else if (!getConsentDetailInputError(row, draft)) {\n setDraft(undefined);\n }\n },\n handleChange: (text: string): void => {\n setDraft(text);\n if (isScalar) write(parseConsentDetailInput(purposeId, detailId, row, text).formValues);\n },\n handleListToggle: setListExpanded,\n handleToggle: (item: string | number | boolean): void => {\n write(toggleConsentDetailListItem(purposeId, detailId, row, formValues, item));\n },\n inputId: `consent_modify_${purposeId}_${detailId}_${row.path}`,\n isListExpanded,\n isPlainList,\n isSelected: (item: string | number | boolean): boolean => Boolean(find(item)?.selected),\n isToggleable: (item: string | number | boolean): boolean => Boolean(find(item)?.toggleable),\n isTypedItemAllowed: kind === 'addItems' && row.options === undefined,\n isValid: !inputError,\n items,\n kind,\n label: row.label || row.path,\n listDisplay: getConsentDetailListDisplay(listCount, isListExpanded),\n max: isScalar && row.modification === 'decrease' ? String(row.value) : undefined,\n min: isScalar && row.modification === 'increase' ? String(row.value) : undefined,\n text: draft ?? (isScalar ? getConsentDetailInputText(purposeId, detailId, row, formValues) : ''),\n };\n};\n\nexport default useConsentDetailField;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { AccessStatusValue, AccountLifecycleAction, AccountLifecycleSubjectKind, ResourceQueryKey } from '@thunderid/browser';
|
|
2
|
+
export interface AccountLifecycleOptions {
|
|
3
|
+
/**
|
|
4
|
+
* Whether to offer the actions at all. The configured flows are read only when it is on.
|
|
5
|
+
*/
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Query keys to refetch after an action, such as the record and the list it appears in.
|
|
9
|
+
*/
|
|
10
|
+
invalidatedKeys: ResourceQueryKey[];
|
|
11
|
+
kind: AccountLifecycleSubjectKind;
|
|
12
|
+
/**
|
|
13
|
+
* The identity's effective access status, from the read that rendered it.
|
|
14
|
+
*/
|
|
15
|
+
status: AccessStatusValue | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Identifier of the user, agent or application.
|
|
18
|
+
*/
|
|
19
|
+
subject: string;
|
|
20
|
+
}
|
|
21
|
+
export interface AccountLifecycleState {
|
|
22
|
+
/**
|
|
23
|
+
* The actions to offer now: allowed by the status and backed by a configured flow.
|
|
24
|
+
*/
|
|
25
|
+
actions: AccountLifecycleAction[];
|
|
26
|
+
/**
|
|
27
|
+
* Why the last action failed.
|
|
28
|
+
*/
|
|
29
|
+
error: Error | null;
|
|
30
|
+
isRunning: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Why the configured flows could not be read, so no action can be offered.
|
|
33
|
+
*/
|
|
34
|
+
loadError: Error | null;
|
|
35
|
+
run: (action: AccountLifecycleAction, operatorNote?: string) => void;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Offers the account lifecycle actions (suspend, unsuspend, unlock) of a user, agent or application and
|
|
39
|
+
* runs them. These actions have no management API endpoint: they run only through the administration
|
|
40
|
+
* flows the server configures, so an action is offered only when its flow is configured.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```tsx
|
|
44
|
+
* const lifecycle = useAccountLifecycle({enabled: true, invalidatedKeys: [[UserQueryKeys.USER, id]], kind: 'user', status, subject: id});
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
declare const useAccountLifecycle: ({ enabled, invalidatedKeys, kind, status, subject, }: AccountLifecycleOptions) => AccountLifecycleState;
|
|
48
|
+
export default useAccountLifecycle;
|
|
49
|
+
//# sourceMappingURL=useAccountLifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAccountLifecycle.d.ts","sourceRoot":"","sources":["../../../src/hooks/management/useAccountLifecycle.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EAGtB,2BAA2B,EAC3B,gBAAgB,EAIjB,MAAM,oBAAoB,CAAC;AAW5B,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,eAAe,EAAE,gBAAgB,EAAE,CAAC;IACpC,IAAI,EAAE,2BAA2B,CAAC;IAClC;;OAEG;IACH,MAAM,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACtC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAClC;;OAEG;IACH,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;IACxB,GAAG,EAAE,CAAC,MAAM,EAAE,sBAAsB,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACtE;AAED;;;;;;;;;GASG;AACH,QAAA,MAAM,mBAAmB,GAAI,sDAM1B,uBAAuB,KAAG,qBAyB5B,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import useThunderID_default from "../../contexts/ThunderID/useThunderID.js";
|
|
2
|
+
import useResourceQuery_default from "./useResourceQuery.js";
|
|
3
|
+
import useResourceMutation_default from "./useResourceMutation.js";
|
|
4
|
+
import { AccountLifecycleFlowConfigKey, getAccountLifecycleActions, resolveAdministrationFlows, runAccountLifecycleAction } from "@thunderid/browser";
|
|
5
|
+
import { useMemo } from "react";
|
|
6
|
+
|
|
7
|
+
//#region src/hooks/management/useAccountLifecycle.ts
|
|
8
|
+
/**
|
|
9
|
+
* Offers the account lifecycle actions (suspend, unsuspend, unlock) of a user, agent or application and
|
|
10
|
+
* runs them. These actions have no management API endpoint: they run only through the administration
|
|
11
|
+
* flows the server configures, so an action is offered only when its flow is configured.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* const lifecycle = useAccountLifecycle({enabled: true, invalidatedKeys: [[UserQueryKeys.USER, id]], kind: 'user', status, subject: id});
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
const useAccountLifecycle = ({ enabled, invalidatedKeys, kind, status, subject }) => {
|
|
19
|
+
const { baseUrl } = useThunderID_default();
|
|
20
|
+
const flows = useResourceQuery_default([
|
|
21
|
+
"administration-flows",
|
|
22
|
+
"account-lifecycle",
|
|
23
|
+
kind
|
|
24
|
+
], (fetcher) => resolveAdministrationFlows({
|
|
25
|
+
baseUrl,
|
|
26
|
+
fetcher
|
|
27
|
+
}, Object.values(AccountLifecycleFlowConfigKey[kind])), { enabled });
|
|
28
|
+
const execution = useResourceMutation_default(({ action, operatorNote }, fetcher) => runAccountLifecycleAction({
|
|
29
|
+
action,
|
|
30
|
+
baseUrl,
|
|
31
|
+
fetcher,
|
|
32
|
+
kind,
|
|
33
|
+
operatorNote,
|
|
34
|
+
subject
|
|
35
|
+
}), () => invalidatedKeys);
|
|
36
|
+
return {
|
|
37
|
+
actions: useMemo(() => enabled && flows.data ? getAccountLifecycleActions(kind, status, flows.data) : [], [
|
|
38
|
+
enabled,
|
|
39
|
+
flows.data,
|
|
40
|
+
kind,
|
|
41
|
+
status
|
|
42
|
+
]),
|
|
43
|
+
error: execution.error,
|
|
44
|
+
isRunning: execution.isLoading,
|
|
45
|
+
loadError: flows.error,
|
|
46
|
+
run: (action, operatorNote) => void execution.mutate({
|
|
47
|
+
action,
|
|
48
|
+
operatorNote
|
|
49
|
+
})
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
var useAccountLifecycle_default = useAccountLifecycle;
|
|
53
|
+
|
|
54
|
+
//#endregion
|
|
55
|
+
export { useAccountLifecycle_default as default };
|
|
56
|
+
//# sourceMappingURL=useAccountLifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAccountLifecycle.js","names":["useThunderID","flows: ResourceQueryResult<Record<string, string>>","useResourceQuery","execution: ResourceMutationResult<AccountLifecycleResult, AccountLifecycleVariables>","useResourceMutation"],"sources":["../../../src/hooks/management/useAccountLifecycle.ts"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n AccessStatusValue,\n AccountLifecycleAction,\n AccountLifecycleFlowConfigKey,\n AccountLifecycleResult,\n AccountLifecycleSubjectKind,\n ResourceQueryKey,\n getAccountLifecycleActions,\n resolveAdministrationFlows,\n runAccountLifecycleAction,\n} from '@thunderid/browser';\nimport {useMemo} from 'react';\nimport useResourceMutation, {ResourceMutationResult} from './useResourceMutation';\nimport useResourceQuery, {ResourceQueryResult} from './useResourceQuery';\nimport useThunderID from '../../contexts/ThunderID/useThunderID';\n\ninterface AccountLifecycleVariables {\n action: AccountLifecycleAction;\n operatorNote?: string;\n}\n\nexport interface AccountLifecycleOptions {\n /**\n * Whether to offer the actions at all. The configured flows are read only when it is on.\n */\n enabled: boolean;\n /**\n * Query keys to refetch after an action, such as the record and the list it appears in.\n */\n invalidatedKeys: ResourceQueryKey[];\n kind: AccountLifecycleSubjectKind;\n /**\n * The identity's effective access status, from the read that rendered it.\n */\n status: AccessStatusValue | undefined;\n /**\n * Identifier of the user, agent or application.\n */\n subject: string;\n}\n\nexport interface AccountLifecycleState {\n /**\n * The actions to offer now: allowed by the status and backed by a configured flow.\n */\n actions: AccountLifecycleAction[];\n /**\n * Why the last action failed.\n */\n error: Error | null;\n isRunning: boolean;\n /**\n * Why the configured flows could not be read, so no action can be offered.\n */\n loadError: Error | null;\n run: (action: AccountLifecycleAction, operatorNote?: string) => void;\n}\n\n/**\n * Offers the account lifecycle actions (suspend, unsuspend, unlock) of a user, agent or application and\n * runs them. These actions have no management API endpoint: they run only through the administration\n * flows the server configures, so an action is offered only when its flow is configured.\n *\n * @example\n * ```tsx\n * const lifecycle = useAccountLifecycle({enabled: true, invalidatedKeys: [[UserQueryKeys.USER, id]], kind: 'user', status, subject: id});\n * ```\n */\nconst useAccountLifecycle = ({\n enabled,\n invalidatedKeys,\n kind,\n status,\n subject,\n}: AccountLifecycleOptions): AccountLifecycleState => {\n const {baseUrl} = useThunderID();\n const flows: ResourceQueryResult<Record<string, string>> = useResourceQuery(\n ['administration-flows', 'account-lifecycle', kind],\n (fetcher) => resolveAdministrationFlows({baseUrl, fetcher}, Object.values(AccountLifecycleFlowConfigKey[kind])),\n {enabled},\n );\n const execution: ResourceMutationResult<AccountLifecycleResult, AccountLifecycleVariables> = useResourceMutation(\n ({action, operatorNote}: AccountLifecycleVariables, fetcher) =>\n runAccountLifecycleAction({action, baseUrl, fetcher, kind, operatorNote, subject}),\n () => invalidatedKeys,\n );\n\n const actions: AccountLifecycleAction[] = useMemo(\n () => (enabled && flows.data ? getAccountLifecycleActions(kind, status, flows.data) : []),\n [enabled, flows.data, kind, status],\n );\n\n return {\n actions,\n error: execution.error,\n isRunning: execution.isLoading,\n loadError: flows.error,\n run: (action: AccountLifecycleAction, operatorNote?: string): void => void execution.mutate({action, operatorNote}),\n };\n};\n\nexport default useAccountLifecycle;\n"],"mappings":";;;;;;;;;;;;;;;;;AAuEA,MAAM,uBAAuB,EAC3B,SACA,iBACA,MACA,QACA,cACoD;CACpD,MAAM,EAAC,YAAWA,sBAAc;CAChC,MAAMC,QAAqDC,yBACzD;EAAC;EAAwB;EAAqB;EAAK,GAClD,YAAY,2BAA2B;EAAC;EAAS;EAAQ,EAAE,OAAO,OAAO,8BAA8B,MAAM,CAAC,EAC/G,EAAC,SAAQ,CACV;CACD,MAAMC,YAAuFC,6BAC1F,EAAC,QAAQ,gBAA0C,YAClD,0BAA0B;EAAC;EAAQ;EAAS;EAAS;EAAM;EAAc;EAAQ,CAAC,QAC9E,gBACP;AAOD,QAAO;EACL,SANwC,cACjC,WAAW,MAAM,OAAO,2BAA2B,MAAM,QAAQ,MAAM,KAAK,GAAG,EAAE,EACxF;GAAC;GAAS,MAAM;GAAM;GAAM;GAAO,CACpC;EAIC,OAAO,UAAU;EACjB,WAAW,UAAU;EACrB,WAAW,MAAM;EACjB,MAAM,QAAgC,iBAAgC,KAAK,UAAU,OAAO;GAAC;GAAQ;GAAa,CAAC;EACpH;;AAGH,kCAAe"}
|
|
@@ -10,6 +10,10 @@ export interface ManagementEndpoint {
|
|
|
10
10
|
*/
|
|
11
11
|
url: string | undefined;
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* The management collections an app can call through the SDK's API functions.
|
|
15
|
+
*/
|
|
16
|
+
export type ManagementCollection = Extract<ResourceEndpointKey, 'agents' | 'agentTypes' | 'applications' | 'configurationVersions' | 'connections' | 'design' | 'export' | 'flows' | 'gateways' | 'groups' | 'i18n' | 'import' | 'notificationTemplates' | 'organizationUnits' | 'resourceServers' | 'roles' | 'secrets' | 'serverConfig' | 'users' | 'userTypes' | 'variables'>;
|
|
13
17
|
/**
|
|
14
18
|
* Resolves where a management resource collection lives, honoring the provider's `endpoints`
|
|
15
19
|
* override so the management API can run on a different host from the authorization server.
|
|
@@ -17,6 +21,6 @@ export interface ManagementEndpoint {
|
|
|
17
21
|
* @param key - The resource collection.
|
|
18
22
|
* @returns The base URL and optional collection URL override.
|
|
19
23
|
*/
|
|
20
|
-
declare const useManagementEndpoint: (key:
|
|
24
|
+
declare const useManagementEndpoint: (key: ManagementCollection) => ManagementEndpoint;
|
|
21
25
|
export default useManagementEndpoint;
|
|
22
26
|
//# sourceMappingURL=useManagementEndpoint.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useManagementEndpoint.d.ts","sourceRoot":"","sources":["../../../src/hooks/management/useManagementEndpoint.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,mBAAmB,EAA0B,MAAM,oBAAoB,CAAC;AAGhF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B;;;OAGG;IACH,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB;AAED
|
|
1
|
+
{"version":3,"file":"useManagementEndpoint.d.ts","sourceRoot":"","sources":["../../../src/hooks/management/useManagementEndpoint.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,mBAAmB,EAA0B,MAAM,oBAAoB,CAAC;AAGhF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B;;;OAGG;IACH,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,CACxC,mBAAmB,EACjB,QAAQ,GACR,YAAY,GACZ,cAAc,GACd,uBAAuB,GACvB,aAAa,GACb,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,UAAU,GACV,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,uBAAuB,GACvB,mBAAmB,GACnB,iBAAiB,GACjB,OAAO,GACP,SAAS,GACT,cAAc,GACd,OAAO,GACP,WAAW,GACX,WAAW,CACd,CAAC;AAEF;;;;;;GAMG;AACH,QAAA,MAAM,qBAAqB,GAAI,KAAK,oBAAoB,KAAG,kBAI1D,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useManagementEndpoint.js","names":["useThunderID"],"sources":["../../../src/hooks/management/useManagementEndpoint.ts"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {ResourceEndpointKey, resolveResourceEndpoint} from '@thunderid/browser';\nimport useThunderID from '../../contexts/ThunderID/useThunderID';\n\n/**\n * The URL inputs a management API function needs.\n */\nexport interface ManagementEndpoint {\n baseUrl: string | undefined;\n /**\n * The collection URL from `endpoints` when overridden, otherwise `undefined` so the API function\n * falls back to `{baseUrl}/{collection}`.\n */\n url: string | undefined;\n}\n\n/**\n * Resolves where a management resource collection lives, honoring the provider's `endpoints`\n * override so the management API can run on a different host from the authorization server.\n *\n * @param key - The resource collection.\n * @returns The base URL and optional collection URL override.\n */\nconst useManagementEndpoint = (
|
|
1
|
+
{"version":3,"file":"useManagementEndpoint.js","names":["useThunderID"],"sources":["../../../src/hooks/management/useManagementEndpoint.ts"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {ResourceEndpointKey, resolveResourceEndpoint} from '@thunderid/browser';\nimport useThunderID from '../../contexts/ThunderID/useThunderID';\n\n/**\n * The URL inputs a management API function needs.\n */\nexport interface ManagementEndpoint {\n baseUrl: string | undefined;\n /**\n * The collection URL from `endpoints` when overridden, otherwise `undefined` so the API function\n * falls back to `{baseUrl}/{collection}`.\n */\n url: string | undefined;\n}\n\n/**\n * The management collections an app can call through the SDK's API functions.\n */\nexport type ManagementCollection = Extract<\n ResourceEndpointKey,\n | 'agents'\n | 'agentTypes'\n | 'applications'\n | 'configurationVersions'\n | 'connections'\n | 'design'\n | 'export'\n | 'flows'\n | 'gateways'\n | 'groups'\n | 'i18n'\n | 'import'\n | 'notificationTemplates'\n | 'organizationUnits'\n | 'resourceServers'\n | 'roles'\n | 'secrets'\n | 'serverConfig'\n | 'users'\n | 'userTypes'\n | 'variables'\n>;\n\n/**\n * Resolves where a management resource collection lives, honoring the provider's `endpoints`\n * override so the management API can run on a different host from the authorization server.\n *\n * @param key - The resource collection.\n * @returns The base URL and optional collection URL override.\n */\nconst useManagementEndpoint = (key: ManagementCollection): ManagementEndpoint => {\n const {baseUrl, endpoints} = useThunderID();\n\n return {baseUrl, url: resolveResourceEndpoint(key, {endpoints})};\n};\n\nexport default useManagementEndpoint;\n"],"mappings":";;;;;;;;;;;AAqDA,MAAM,yBAAyB,QAAkD;CAC/E,MAAM,EAAC,SAAS,cAAaA,sBAAc;AAE3C,QAAO;EAAC;EAAS,KAAK,wBAAwB,KAAK,EAAC,WAAU,CAAC;EAAC;;AAGlE,oCAAe"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ManagementRequestConfig } from '@thunderid/browser';
|
|
2
|
+
import { ManagementCollection } from './useManagementEndpoint';
|
|
3
|
+
export type { ManagementCollection };
|
|
4
|
+
/**
|
|
5
|
+
* Returns the request config the SDK's management API functions take for a collection: the server URL,
|
|
6
|
+
* the collection URL when `endpoints` overrides it, and a fetcher that sends the signed-in user's access
|
|
7
|
+
* token (`ThunderIDProvider`'s `http.fetcher` when set).
|
|
8
|
+
*
|
|
9
|
+
* Use it to call the API functions from an app's own data layer, such as TanStack Query:
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* const config = useManagementRequestConfig('groups');
|
|
14
|
+
* const groups = useQuery({
|
|
15
|
+
* queryKey: [GroupQueryKeys.GROUPS, {limit, offset}],
|
|
16
|
+
* queryFn: () => getGroups({...config, limit, offset}),
|
|
17
|
+
* });
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
declare const useManagementRequestConfig: (collection: ManagementCollection) => ManagementRequestConfig;
|
|
21
|
+
export default useManagementRequestConfig;
|
|
22
|
+
//# sourceMappingURL=useManagementRequestConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useManagementRequestConfig.d.ts","sourceRoot":"","sources":["../../../src/hooks/management/useManagementRequestConfig.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,uBAAuB,EAAC,MAAM,oBAAoB,CAAC;AAEvE,OAA8B,EAAC,oBAAoB,EAAqB,MAAM,yBAAyB,CAAC;AAGxG,YAAY,EAAC,oBAAoB,EAAC,CAAC;AAEnC;;;;;;;;;;;;;;;GAeG;AACH,QAAA,MAAM,0BAA0B,GAAI,YAAY,oBAAoB,KAAG,uBAKtE,CAAC;AAEF,eAAe,0BAA0B,CAAC"}
|