@keycloakify/keycloak-account-ui 25.0.1-rc.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/KeycloakAccountUi.d.ts +3 -0
- package/KeycloakAccountUi.js +29 -0
- package/KeycloakAccountUi.js.map +1 -0
- package/LICENSE +2 -0
- package/README.md +39 -0
- package/account-security/AccountRow.d.ts +8 -0
- package/account-security/AccountRow.js +36 -0
- package/account-security/AccountRow.js.map +1 -0
- package/account-security/DeviceActivity.d.ts +2 -0
- package/account-security/DeviceActivity.js +70 -0
- package/account-security/DeviceActivity.js.map +1 -0
- package/account-security/LinkedAccounts.d.ts +2 -0
- package/account-security/LinkedAccounts.js +25 -0
- package/account-security/LinkedAccounts.js.map +1 -0
- package/account-security/SigningIn.d.ts +2 -0
- package/account-security/SigningIn.js +65 -0
- package/account-security/SigningIn.js.map +1 -0
- package/api/constants.d.ts +2 -0
- package/api/constants.js +3 -0
- package/api/constants.js.map +1 -0
- package/api/methods.d.ts +25 -0
- package/api/methods.js +73 -0
- package/api/methods.js.map +1 -0
- package/api/parse-links.d.ts +5 -0
- package/api/parse-links.js +23 -0
- package/api/parse-links.js.map +1 -0
- package/api/parse-response.d.ts +3 -0
- package/api/parse-response.js +40 -0
- package/api/parse-response.js.map +1 -0
- package/api/representations.d.ts +202 -0
- package/api/representations.js +3 -0
- package/api/representations.js.map +1 -0
- package/api/request.d.ts +12 -0
- package/api/request.js +33 -0
- package/api/request.js.map +1 -0
- package/api.d.ts +13 -0
- package/api.js +52 -0
- package/api.js.map +1 -0
- package/applications/Applications.d.ts +2 -0
- package/applications/Applications.js +52 -0
- package/applications/Applications.js.map +1 -0
- package/components/datalist/EmptyRow.d.ts +5 -0
- package/components/datalist/EmptyRow.js +20 -0
- package/components/datalist/EmptyRow.js.map +1 -0
- package/components/page/Page.d.ts +7 -0
- package/components/page/Page.js +6 -0
- package/components/page/Page.js.map +1 -0
- package/content/ContentComponent.d.ts +2 -0
- package/content/ContentComponent.js +36 -0
- package/content/ContentComponent.js.map +1 -0
- package/content/fetchContent.d.ts +3 -0
- package/content/fetchContent.js +6 -0
- package/content/fetchContent.js.map +1 -0
- package/environment.d.ts +25 -0
- package/environment.js +3 -0
- package/environment.js.map +1 -0
- package/groups/Groups.d.ts +2 -0
- package/groups/Groups.js +45 -0
- package/groups/Groups.js.map +1 -0
- package/i18n.d.ts +4 -0
- package/i18n.js +31 -0
- package/i18n.js.map +1 -0
- package/oid4vci/Oid4Vci.d.ts +2 -0
- package/oid4vci/Oid4Vci.js +54 -0
- package/oid4vci/Oid4Vci.js.map +1 -0
- package/package.json +428 -0
- package/personal-info/PersonalInfo.d.ts +2 -0
- package/personal-info/PersonalInfo.js +63 -0
- package/personal-info/PersonalInfo.js.map +1 -0
- package/resources/EditTheResource.d.ts +8 -0
- package/resources/EditTheResource.js +36 -0
- package/resources/EditTheResource.js.map +1 -0
- package/resources/PermissionRequest.d.ts +7 -0
- package/resources/PermissionRequest.js +39 -0
- package/resources/PermissionRequest.js.map +1 -0
- package/resources/ResourceToolbar.d.ts +12 -0
- package/resources/ResourceToolbar.js +24 -0
- package/resources/ResourceToolbar.js.map +1 -0
- package/resources/Resources.d.ts +2 -0
- package/resources/Resources.js +13 -0
- package/resources/Resources.js.map +1 -0
- package/resources/ResourcesTab.d.ts +5 -0
- package/resources/ResourcesTab.js +103 -0
- package/resources/ResourcesTab.js.map +1 -0
- package/resources/ShareTheResource.d.ts +9 -0
- package/resources/ShareTheResource.js +70 -0
- package/resources/ShareTheResource.js.map +1 -0
- package/resources/SharedWith.d.ts +6 -0
- package/resources/SharedWith.js +8 -0
- package/resources/SharedWith.js.map +1 -0
- package/root/ErrorPage.d.ts +5 -0
- package/root/ErrorPage.js +29 -0
- package/root/ErrorPage.js.map +1 -0
- package/root/Header.d.ts +1 -0
- package/root/Header.js +31 -0
- package/root/Header.js.map +1 -0
- package/root/PageNav.d.ts +23 -0
- package/root/PageNav.js +44 -0
- package/root/PageNav.js.map +1 -0
- package/root/Root.d.ts +1 -0
- package/root/Root.js +12 -0
- package/root/Root.js.map +1 -0
- package/root/header.module.css +3 -0
- package/routes.d.ts +15 -0
- package/routes.js +69 -0
- package/routes.js.map +1 -0
- package/src/KeycloakAccountUi.tsx +36 -0
- package/src/account-security/AccountRow.tsx +136 -0
- package/src/account-security/DeviceActivity.tsx +253 -0
- package/src/account-security/LinkedAccounts.tsx +86 -0
- package/src/account-security/SigningIn.tsx +251 -0
- package/src/api/constants.ts +2 -0
- package/src/api/methods.ts +158 -0
- package/src/api/parse-links.ts +28 -0
- package/src/api/parse-response.ts +53 -0
- package/src/api/representations.ts +219 -0
- package/src/api/request.ts +74 -0
- package/src/api.ts +127 -0
- package/src/applications/Applications.tsx +282 -0
- package/src/components/datalist/EmptyRow.tsx +26 -0
- package/src/components/page/Page.tsx +27 -0
- package/src/content/ContentComponent.tsx +62 -0
- package/src/content/fetchContent.ts +13 -0
- package/src/environment.ts +31 -0
- package/src/global.d.ts +4 -0
- package/src/groups/Groups.tsx +142 -0
- package/src/i18n.ts +47 -0
- package/src/i18next.d.ts +10 -0
- package/src/oid4vci/Oid4Vci.tsx +136 -0
- package/src/personal-info/PersonalInfo.tsx +184 -0
- package/src/resources/EditTheResource.tsx +101 -0
- package/src/resources/PermissionRequest.tsx +129 -0
- package/src/resources/ResourceToolbar.tsx +87 -0
- package/src/resources/Resources.tsx +39 -0
- package/src/resources/ResourcesTab.tsx +410 -0
- package/src/resources/ShareTheResource.tsx +217 -0
- package/src/resources/SharedWith.tsx +26 -0
- package/src/root/ErrorPage.tsx +65 -0
- package/src/root/Header.tsx +62 -0
- package/src/root/PageNav.tsx +154 -0
- package/src/root/Root.tsx +20 -0
- package/src/root/header.module.css +3 -0
- package/src/routes.tsx +85 -0
- package/src/ui-shared/alerts/Alerts.tsx +86 -0
- package/src/ui-shared/buttons/FormSubmitButton.tsx +47 -0
- package/src/ui-shared/context/ErrorPage.tsx +60 -0
- package/src/ui-shared/context/HelpContext.tsx +30 -0
- package/src/ui-shared/context/KeycloakContext.tsx +97 -0
- package/src/ui-shared/context/environment.ts +50 -0
- package/src/ui-shared/continue-cancel/ContinueCancelModal.tsx +75 -0
- package/src/ui-shared/controls/FormErrorText.tsx +23 -0
- package/src/ui-shared/controls/FormLabel.tsx +40 -0
- package/src/ui-shared/controls/HelpItem.tsx +43 -0
- package/src/ui-shared/controls/NumberControl.tsx +89 -0
- package/src/ui-shared/controls/PasswordControl.tsx +71 -0
- package/src/ui-shared/controls/PasswordInput.tsx +50 -0
- package/src/ui-shared/controls/SwitchControl.tsx +67 -0
- package/src/ui-shared/controls/TextAreaControl.tsx +60 -0
- package/src/ui-shared/controls/TextControl.tsx +74 -0
- package/src/ui-shared/controls/keycloak-text-area/KeycloakTextArea.tsx +23 -0
- package/src/ui-shared/controls/select-control/SelectControl.tsx +75 -0
- package/src/ui-shared/controls/select-control/SingleSelectControl.tsx +107 -0
- package/src/ui-shared/controls/select-control/TypeaheadSelectControl.tsx +283 -0
- package/src/ui-shared/icons/IconMapper.tsx +63 -0
- package/src/ui-shared/index.ts +1 -0
- package/src/ui-shared/main.ts +62 -0
- package/src/ui-shared/masthead/DefaultAvatar.tsx +109 -0
- package/src/ui-shared/masthead/KeycloakDropdown.tsx +47 -0
- package/src/ui-shared/masthead/Masthead.tsx +145 -0
- package/src/ui-shared/scroll-form/FormPanel.tsx +29 -0
- package/src/ui-shared/scroll-form/FormTitle.tsx +28 -0
- package/src/ui-shared/scroll-form/ScrollForm.tsx +98 -0
- package/src/ui-shared/scroll-form/ScrollPanel.tsx +21 -0
- package/src/ui-shared/scroll-form/form-title.module.css +4 -0
- package/src/ui-shared/scroll-form/scroll-form.module.css +8 -0
- package/src/ui-shared/select/KeycloakSelect.tsx +49 -0
- package/src/ui-shared/select/SingleSelect.tsx +85 -0
- package/src/ui-shared/select/TypeaheadSelect.tsx +196 -0
- package/src/ui-shared/user-profile/LocaleSelector.tsx +51 -0
- package/src/ui-shared/user-profile/MultiInputComponent.tsx +146 -0
- package/src/ui-shared/user-profile/OptionsComponent.tsx +60 -0
- package/src/ui-shared/user-profile/SelectComponent.tsx +106 -0
- package/src/ui-shared/user-profile/TextAreaComponent.tsx +23 -0
- package/src/ui-shared/user-profile/TextComponent.tsx +30 -0
- package/src/ui-shared/user-profile/UserProfileFields.tsx +246 -0
- package/src/ui-shared/user-profile/UserProfileGroup.tsx +70 -0
- package/src/ui-shared/user-profile/utils.ts +161 -0
- package/src/ui-shared/utils/createNamedContext.ts +11 -0
- package/src/ui-shared/utils/isDefined.ts +3 -0
- package/src/ui-shared/utils/useRequiredContext.ts +24 -0
- package/src/ui-shared/utils/useStorageItem.ts +51 -0
- package/src/ui-shared/utils/useStoredState.ts +38 -0
- package/src/utils/formatDate.ts +18 -0
- package/src/utils/isRecord.ts +2 -0
- package/src/utils/joinPath.ts +22 -0
- package/src/utils/usePromise.ts +74 -0
- package/ui-shared/alerts/Alerts.d.ts +17 -0
- package/ui-shared/alerts/Alerts.js +27 -0
- package/ui-shared/alerts/Alerts.js.map +1 -0
- package/ui-shared/buttons/FormSubmitButton.d.ts +10 -0
- package/ui-shared/buttons/FormSubmitButton.js +26 -0
- package/ui-shared/buttons/FormSubmitButton.js.map +1 -0
- package/ui-shared/context/ErrorPage.d.ts +5 -0
- package/ui-shared/context/ErrorPage.js +24 -0
- package/ui-shared/context/ErrorPage.js.map +1 -0
- package/ui-shared/context/HelpContext.d.ts +9 -0
- package/ui-shared/context/HelpContext.js +14 -0
- package/ui-shared/context/HelpContext.js.map +1 -0
- package/ui-shared/context/KeycloakContext.d.ts +12 -0
- package/ui-shared/context/KeycloakContext.js +53 -0
- package/ui-shared/context/KeycloakContext.js.map +1 -0
- package/ui-shared/context/environment.d.ts +36 -0
- package/ui-shared/context/environment.js +27 -0
- package/ui-shared/context/environment.js.map +1 -0
- package/ui-shared/continue-cancel/ContinueCancelModal.d.ts +15 -0
- package/ui-shared/continue-cancel/ContinueCancelModal.js +27 -0
- package/ui-shared/continue-cancel/ContinueCancelModal.js.map +1 -0
- package/ui-shared/controls/FormErrorText.d.ts +5 -0
- package/ui-shared/controls/FormErrorText.js +19 -0
- package/ui-shared/controls/FormErrorText.js.map +1 -0
- package/ui-shared/controls/FormLabel.d.ts +13 -0
- package/ui-shared/controls/FormLabel.js +20 -0
- package/ui-shared/controls/FormLabel.js.map +1 -0
- package/ui-shared/controls/HelpItem.d.ts +9 -0
- package/ui-shared/controls/HelpItem.js +9 -0
- package/ui-shared/controls/HelpItem.js.map +1 -0
- package/ui-shared/controls/NumberControl.d.ts +13 -0
- package/ui-shared/controls/NumberControl.js +32 -0
- package/ui-shared/controls/NumberControl.js.map +1 -0
- package/ui-shared/controls/PasswordControl.d.ts +9 -0
- package/ui-shared/controls/PasswordControl.js +25 -0
- package/ui-shared/controls/PasswordControl.js.map +1 -0
- package/ui-shared/controls/PasswordInput.d.ts +7 -0
- package/ui-shared/controls/PasswordInput.js +25 -0
- package/ui-shared/controls/PasswordInput.js.map +1 -0
- package/ui-shared/controls/SwitchControl.d.ts +11 -0
- package/ui-shared/controls/SwitchControl.js +29 -0
- package/ui-shared/controls/SwitchControl.js.map +1 -0
- package/ui-shared/controls/TextAreaControl.d.ts +8 -0
- package/ui-shared/controls/TextAreaControl.js +12 -0
- package/ui-shared/controls/TextAreaControl.js.map +1 -0
- package/ui-shared/controls/TextControl.d.ts +10 -0
- package/ui-shared/controls/TextControl.js +24 -0
- package/ui-shared/controls/TextControl.js.map +1 -0
- package/ui-shared/controls/keycloak-text-area/KeycloakTextArea.d.ts +4 -0
- package/ui-shared/controls/keycloak-text-area/KeycloakTextArea.js +5 -0
- package/ui-shared/controls/keycloak-text-area/KeycloakTextArea.js.map +1 -0
- package/ui-shared/controls/select-control/SelectControl.d.ts +31 -0
- package/ui-shared/controls/select-control/SelectControl.js +28 -0
- package/ui-shared/controls/select-control/SelectControl.js.map +1 -0
- package/ui-shared/controls/select-control/SingleSelectControl.d.ts +3 -0
- package/ui-shared/controls/select-control/SingleSelectControl.js +41 -0
- package/ui-shared/controls/select-control/SingleSelectControl.js.map +1 -0
- package/ui-shared/controls/select-control/TypeaheadSelectControl.d.ts +3 -0
- package/ui-shared/controls/select-control/TypeaheadSelectControl.js +138 -0
- package/ui-shared/controls/select-control/TypeaheadSelectControl.js.map +1 -0
- package/ui-shared/icons/IconMapper.d.ts +5 -0
- package/ui-shared/icons/IconMapper.js +40 -0
- package/ui-shared/icons/IconMapper.js.map +1 -0
- package/ui-shared/index.d.ts +1 -0
- package/ui-shared/index.js +2 -0
- package/ui-shared/index.js.map +1 -0
- package/ui-shared/main.d.ts +31 -0
- package/ui-shared/main.js +29 -0
- package/ui-shared/main.js.map +1 -0
- package/ui-shared/masthead/DefaultAvatar.d.ts +7 -0
- package/ui-shared/masthead/DefaultAvatar.js +26 -0
- package/ui-shared/masthead/DefaultAvatar.js.map +1 -0
- package/ui-shared/masthead/KeycloakDropdown.d.ts +10 -0
- package/ui-shared/masthead/KeycloakDropdown.js +23 -0
- package/ui-shared/masthead/KeycloakDropdown.js.map +1 -0
- package/ui-shared/masthead/Masthead.d.ts +22 -0
- package/ui-shared/masthead/Masthead.js +55 -0
- package/ui-shared/masthead/Masthead.js.map +1 -0
- package/ui-shared/scroll-form/FormPanel.d.ts +8 -0
- package/ui-shared/scroll-form/FormPanel.js +9 -0
- package/ui-shared/scroll-form/FormPanel.js.map +1 -0
- package/ui-shared/scroll-form/FormTitle.d.ts +8 -0
- package/ui-shared/scroll-form/FormTitle.js +19 -0
- package/ui-shared/scroll-form/FormTitle.js.map +1 -0
- package/ui-shared/scroll-form/ScrollForm.d.ts +15 -0
- package/ui-shared/scroll-form/ScrollForm.js +38 -0
- package/ui-shared/scroll-form/ScrollForm.js.map +1 -0
- package/ui-shared/scroll-form/ScrollPanel.d.ts +7 -0
- package/ui-shared/scroll-form/ScrollPanel.js +18 -0
- package/ui-shared/scroll-form/ScrollPanel.js.map +1 -0
- package/ui-shared/select/KeycloakSelect.d.ts +30 -0
- package/ui-shared/select/KeycloakSelect.js +31 -0
- package/ui-shared/select/KeycloakSelect.js.map +1 -0
- package/ui-shared/select/SingleSelect.d.ts +4 -0
- package/ui-shared/select/SingleSelect.js +46 -0
- package/ui-shared/select/SingleSelect.js.map +1 -0
- package/ui-shared/select/TypeaheadSelect.d.ts +2 -0
- package/ui-shared/select/TypeaheadSelect.js +96 -0
- package/ui-shared/select/TypeaheadSelect.js.map +1 -0
- package/ui-shared/user-profile/LocaleSelector.d.ts +7 -0
- package/ui-shared/user-profile/LocaleSelector.js +28 -0
- package/ui-shared/user-profile/LocaleSelector.js.map +1 -0
- package/ui-shared/user-profile/MultiInputComponent.d.ts +15 -0
- package/ui-shared/user-profile/MultiInputComponent.js +61 -0
- package/ui-shared/user-profile/MultiInputComponent.js.map +1 -0
- package/ui-shared/user-profile/OptionsComponent.d.ts +2 -0
- package/ui-shared/user-profile/OptionsComponent.js +28 -0
- package/ui-shared/user-profile/OptionsComponent.js.map +1 -0
- package/ui-shared/user-profile/SelectComponent.d.ts +2 -0
- package/ui-shared/user-profile/SelectComponent.js +55 -0
- package/ui-shared/user-profile/SelectComponent.js.map +1 -0
- package/ui-shared/user-profile/TextAreaComponent.d.ts +2 -0
- package/ui-shared/user-profile/TextAreaComponent.js +11 -0
- package/ui-shared/user-profile/TextAreaComponent.js.map +1 -0
- package/ui-shared/user-profile/TextComponent.d.ts +2 -0
- package/ui-shared/user-profile/TextComponent.js +14 -0
- package/ui-shared/user-profile/TextComponent.js.map +1 -0
- package/ui-shared/user-profile/UserProfileFields.d.ts +39 -0
- package/ui-shared/user-profile/UserProfileFields.js +112 -0
- package/ui-shared/user-profile/UserProfileFields.js.map +1 -0
- package/ui-shared/user-profile/UserProfileGroup.d.ts +12 -0
- package/ui-shared/user-profile/UserProfileGroup.js +15 -0
- package/ui-shared/user-profile/UserProfileGroup.js.map +1 -0
- package/ui-shared/user-profile/utils.d.ts +32 -0
- package/ui-shared/user-profile/utils.js +79 -0
- package/ui-shared/user-profile/utils.js.map +1 -0
- package/ui-shared/utils/createNamedContext.d.ts +3 -0
- package/ui-shared/utils/createNamedContext.js +7 -0
- package/ui-shared/utils/createNamedContext.js.map +1 -0
- package/ui-shared/utils/isDefined.d.ts +1 -0
- package/ui-shared/utils/isDefined.js +4 -0
- package/ui-shared/utils/isDefined.js.map +1 -0
- package/ui-shared/utils/useRequiredContext.d.ts +9 -0
- package/ui-shared/utils/useRequiredContext.js +17 -0
- package/ui-shared/utils/useRequiredContext.js.map +1 -0
- package/ui-shared/utils/useStorageItem.d.ts +10 -0
- package/ui-shared/utils/useStorageItem.js +40 -0
- package/ui-shared/utils/useStorageItem.js.map +1 -0
- package/ui-shared/utils/useStoredState.d.ts +13 -0
- package/ui-shared/utils/useStoredState.js +21 -0
- package/ui-shared/utils/useStoredState.js.map +1 -0
- package/utils/formatDate.d.ts +4 -0
- package/utils/formatDate.js +12 -0
- package/utils/formatDate.js.map +1 -0
- package/utils/isRecord.d.ts +1 -0
- package/utils/isRecord.js +2 -0
- package/utils/isRecord.js.map +1 -0
- package/utils/joinPath.d.ts +1 -0
- package/utils/joinPath.js +18 -0
- package/utils/joinPath.js.map +1 -0
- package/utils/usePromise.d.ts +41 -0
- package/utils/usePromise.js +55 -0
- package/utils/usePromise.js.map +1 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useReducer } from "react";
|
|
3
|
+
import "@patternfly/react-core/dist/styles/base.css";
|
|
4
|
+
import "@patternfly/patternfly/patternfly-addons.css";
|
|
5
|
+
import { createBrowserRouter, RouterProvider } from "react-router-dom";
|
|
6
|
+
import { i18n } from "./i18n";
|
|
7
|
+
import { routes } from "./routes";
|
|
8
|
+
const router = createBrowserRouter(routes);
|
|
9
|
+
const prI18nInitialized = i18n.init();
|
|
10
|
+
export default function KeycloakAccountUi() {
|
|
11
|
+
const [isI18nInitialized, setI18nInitialized] = useReducer(() => true, false);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
let isActive = true;
|
|
14
|
+
prI18nInitialized.then(() => {
|
|
15
|
+
if (!isActive) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
setI18nInitialized();
|
|
19
|
+
});
|
|
20
|
+
return () => {
|
|
21
|
+
isActive = false;
|
|
22
|
+
};
|
|
23
|
+
}, []);
|
|
24
|
+
if (!isI18nInitialized) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
return _jsx(RouterProvider, { router: router });
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=KeycloakAccountUi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeycloakAccountUi.js","sourceRoot":"","sources":["src/KeycloakAccountUi.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,6CAA6C,CAAC;AACrD,OAAO,8CAA8C,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvE,OAAO,EAAE,IAAI,EAAE,MAAM,uCAAuC,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,yCAAyC,CAAC;AAEjE,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC3C,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AAEtC,MAAM,CAAC,OAAO,UAAU,iBAAiB;IACvC,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAE9E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,GAAG,IAAI,CAAC;QAEpB,iBAAiB,CAAC,IAAI,CAAC,GAAG,EAAE;YAC1B,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YACD,kBAAkB,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,QAAQ,GAAG,KAAK,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAC,cAAc,IAAC,MAAM,EAAE,MAAM,GAAI,CAAC;AAC5C,CAAC"}
|
package/LICENSE
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# @keycloakify/keycloak-account-ui
|
|
2
|
+
|
|
3
|
+
This project is a re-packaged version of the [`@keycloak/keycloak-account-ui`](https://www.npmjs.com/package/@keycloak/keycloak-account-ui) package.
|
|
4
|
+
The version of [`@keycloakify/keycloak-account-ui`](https://www.npmjs.com/package/@keycloakify/keycloak-account-ui) matches that of the original package.
|
|
5
|
+
The purpose of this package is to allow cherry-picking imports and taking ownership of specific portions of the package.
|
|
6
|
+
For more details on integrating this package into your project, refer to the [Keycloakify documentation](https://keycloakify.dev).
|
|
7
|
+
|
|
8
|
+
> **Note:** This package's GitHub repository does not contain any code as it is automatically generated at build time by [scripts/prepare.ts](/scripts/prepare.ts).
|
|
9
|
+
|
|
10
|
+
## Installation
|
|
11
|
+
|
|
12
|
+
> You are currently viewing the version of `@keycloakify/keycloak-account-ui` that mirrors `@keycloak/keycloak-account-ui` version **25.0.1**.
|
|
13
|
+
> It is the version of the Account UI that ships with Keycloak **25.0.1**.
|
|
14
|
+
|
|
15
|
+
To install this package, you must also install all the required peer dependencies. It is important to copy and paste the version ranges exactly to avoid any compatibility issues. Add this to your `package.json`:
|
|
16
|
+
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@keycloakify/keycloak-account-ui": "25.0.1-rc.0",
|
|
21
|
+
"@patternfly/patternfly": "^5.3.1",
|
|
22
|
+
"@patternfly/react-core": "^5.3.3",
|
|
23
|
+
"@patternfly/react-icons": "^5.3.2",
|
|
24
|
+
"@patternfly/react-table": "^5.3.3",
|
|
25
|
+
"i18next": "^23.11.5",
|
|
26
|
+
"i18next-http-backend": "^2.5.2",
|
|
27
|
+
"lodash-es": "^4.17.21",
|
|
28
|
+
"react-hook-form": "7.51.5",
|
|
29
|
+
"react-i18next": "^14.1.2",
|
|
30
|
+
"react-router-dom": "^6.23.1",
|
|
31
|
+
"keycloak-js": "25.0.1",
|
|
32
|
+
"@patternfly/react-styles": "^5.3.1",
|
|
33
|
+
"@keycloak/keycloak-admin-client": "25.0.1"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/lodash-es": "^4.17.12"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { LinkedAccountRepresentation } from "../api/representations";
|
|
2
|
+
type AccountRowProps = {
|
|
3
|
+
account: LinkedAccountRepresentation;
|
|
4
|
+
isLinked?: boolean;
|
|
5
|
+
refresh: () => void;
|
|
6
|
+
};
|
|
7
|
+
export declare const AccountRow: ({ account, isLinked, refresh, }: AccountRowProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, DataListAction, DataListCell, DataListItem, DataListItemCells, DataListItemRow, Icon, Label, Split, SplitItem, } from "@patternfly/react-core";
|
|
3
|
+
import { LinkIcon, UnlinkIcon } from "@patternfly/react-icons";
|
|
4
|
+
import { useTranslation } from "react-i18next";
|
|
5
|
+
import { IconMapper, useAlerts, useEnvironment, } from "../ui-shared";
|
|
6
|
+
import { linkAccount, unLinkAccount } from "../api/methods";
|
|
7
|
+
export const AccountRow = ({ account, isLinked = false, refresh, }) => {
|
|
8
|
+
const { t } = useTranslation();
|
|
9
|
+
const context = useEnvironment();
|
|
10
|
+
const { addAlert, addError } = useAlerts();
|
|
11
|
+
const unLink = async (account) => {
|
|
12
|
+
try {
|
|
13
|
+
await unLinkAccount(context, account);
|
|
14
|
+
addAlert(t("unLinkSuccess"));
|
|
15
|
+
refresh();
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
addError(t("unLinkError", { error }).toString());
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const link = async (account) => {
|
|
22
|
+
try {
|
|
23
|
+
const { accountLinkUri } = await linkAccount(context, account);
|
|
24
|
+
location.href = accountLinkUri;
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
addError(t("linkError", { error }).toString());
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
return (_jsx(DataListItem, { id: `${account.providerAlias}-idp`, "aria-label": t("linkedAccounts"), children: _jsxs(DataListItemRow, { "data-testid": `linked-accounts/${account.providerName}`, children: [_jsx(DataListItemCells, { dataListCells: [
|
|
31
|
+
_jsx(DataListCell, { children: _jsxs(Split, { children: [_jsx(SplitItem, { className: "pf-v5-u-mr-sm", children: _jsx(IconMapper, { icon: account.providerName }) }), _jsx(SplitItem, { className: "pf-v5-u-my-xs", isFilled: true, children: _jsx("span", { id: `${account.providerAlias}-idp-name`, children: account.displayName }) })] }) }, "idp"),
|
|
32
|
+
_jsx(DataListCell, { children: _jsx(Split, { children: _jsx(SplitItem, { className: "pf-v5-u-my-xs", isFilled: true, children: _jsx("span", { id: `${account.providerAlias}-idp-label`, children: _jsx(Label, { color: account.social ? "blue" : "green", children: t(account.social ? "socialLogin" : "systemDefined") }) }) }) }) }, "label"),
|
|
33
|
+
_jsx(DataListCell, { width: 5, children: _jsx(Split, { children: _jsx(SplitItem, { className: "pf-v5-u-my-xs", isFilled: true, children: _jsx("span", { id: `${account.providerAlias}-idp-username`, children: account.linkedUsername }) }) }) }, "username"),
|
|
34
|
+
] }), _jsxs(DataListAction, { "aria-labelledby": t("link"), "aria-label": t("unLink"), id: "setPasswordAction", children: [isLinked && (_jsxs(Button, { id: `${account.providerAlias}-idp-unlink`, variant: "link", onClick: () => unLink(account), children: [_jsx(Icon, { size: "sm", children: _jsx(UnlinkIcon, {}) }), " ", t("unLink")] })), !isLinked && (_jsxs(Button, { id: `${account.providerAlias}-idp-link`, variant: "link", onClick: () => link(account), children: [_jsx(Icon, { size: "sm", children: _jsx(LinkIcon, {}) }), " ", t("link")] }))] })] }, account.providerName) }, account.providerName));
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=AccountRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccountRow.js","sourceRoot":"","sources":["../src/account-security/AccountRow.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, DataList, DataListContent, DataListItem, DataListItemRow, DescriptionList, DescriptionListDescription, DescriptionListGroup, DescriptionListTerm, Grid, GridItem, Label, Spinner, Split, SplitItem, Title, } from "@patternfly/react-core";
|
|
3
|
+
import { DesktopIcon, MobileAltIcon, SyncAltIcon, } from "@patternfly/react-icons";
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
import { useTranslation } from "react-i18next";
|
|
6
|
+
import { ContinueCancelModal, useAlerts, useEnvironment, } from "../ui-shared";
|
|
7
|
+
import { deleteSession, getDevices } from "../api/methods";
|
|
8
|
+
import { Page } from "../components/page/Page";
|
|
9
|
+
import { formatDate } from "../utils/formatDate";
|
|
10
|
+
import { usePromise } from "../utils/usePromise";
|
|
11
|
+
export const DeviceActivity = () => {
|
|
12
|
+
const { t } = useTranslation();
|
|
13
|
+
const context = useEnvironment();
|
|
14
|
+
const { addAlert, addError } = useAlerts();
|
|
15
|
+
const [devices, setDevices] = useState();
|
|
16
|
+
const [key, setKey] = useState(0);
|
|
17
|
+
const refresh = () => setKey(key + 1);
|
|
18
|
+
const moveCurrentToTop = (devices) => {
|
|
19
|
+
let currentDevice = devices[0];
|
|
20
|
+
const index = devices.findIndex((d) => d.current);
|
|
21
|
+
currentDevice = devices.splice(index, 1)[0];
|
|
22
|
+
devices.unshift(currentDevice);
|
|
23
|
+
const sessionIndex = currentDevice.sessions.findIndex((s) => s.current);
|
|
24
|
+
const currentSession = currentDevice.sessions.splice(sessionIndex, 1)[0];
|
|
25
|
+
currentDevice.sessions.unshift(currentSession);
|
|
26
|
+
setDevices(devices);
|
|
27
|
+
};
|
|
28
|
+
usePromise((signal) => getDevices({ signal, context }), moveCurrentToTop, [
|
|
29
|
+
key,
|
|
30
|
+
]);
|
|
31
|
+
const signOutAll = async () => {
|
|
32
|
+
await deleteSession(context);
|
|
33
|
+
context.keycloak.logout();
|
|
34
|
+
};
|
|
35
|
+
const signOutSession = async (session, device) => {
|
|
36
|
+
try {
|
|
37
|
+
await deleteSession(context, session.id);
|
|
38
|
+
addAlert(t("signedOutSession", { browser: session.browser, os: device.os }));
|
|
39
|
+
refresh();
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
addError(t("errorSignOutMessage", { error }).toString());
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const makeClientsString = (clients) => {
|
|
46
|
+
let clientsString = "";
|
|
47
|
+
clients.forEach((client, index) => {
|
|
48
|
+
let clientName;
|
|
49
|
+
if (client.clientName !== "") {
|
|
50
|
+
clientName = t(client.clientName);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
clientName = client.clientId;
|
|
54
|
+
}
|
|
55
|
+
clientsString += clientName;
|
|
56
|
+
if (clients.length > index + 1)
|
|
57
|
+
clientsString += ", ";
|
|
58
|
+
});
|
|
59
|
+
return clientsString;
|
|
60
|
+
};
|
|
61
|
+
if (!devices) {
|
|
62
|
+
return _jsx(Spinner, {});
|
|
63
|
+
}
|
|
64
|
+
return (_jsxs(Page, { title: t("deviceActivity"), description: t("signedInDevicesExplanation"), children: [_jsxs(Split, { hasGutter: true, className: "pf-v5-u-mb-lg", children: [_jsx(SplitItem, { isFilled: true, children: _jsx(Title, { headingLevel: "h2", size: "xl", children: t("signedInDevices") }) }), _jsxs(SplitItem, { children: [_jsx(Button, { id: "refresh-page", variant: "link", onClick: () => refresh(), icon: _jsx(SyncAltIcon, {}), children: t("refreshPage") }), (devices.length > 1 || devices[0].sessions.length > 1) && (_jsx(ContinueCancelModal, { buttonTitle: t("signOutAllDevices"), modalTitle: t("signOutAllDevices"), continueLabel: t("confirm"), cancelLabel: t("cancel"), onContinue: () => signOutAll(), children: t("signOutAllDevicesWarning") }))] })] }), _jsx(DataList, { className: "signed-in-device-list", "aria-label": t("signedInDevices"), children: _jsx(DataListItem, { "aria-labelledby": `sessions-${key}`, children: devices.map((device) => device.sessions.map((session, index) => (_jsx(DataListItemRow, { "data-testid": `row-${index}`, children: _jsx(DataListContent, { "aria-label": "device-sessions-content", className: "pf-v5-u-flex-grow-1", children: _jsxs(Grid, { hasGutter: true, children: [_jsx(GridItem, { span: 1, rowSpan: 2, children: device.mobile ? _jsx(MobileAltIcon, {}) : _jsx(DesktopIcon, {}) }), _jsxs(GridItem, { sm: 8, md: 9, span: 10, children: [_jsxs("span", { className: "pf-v5-u-mr-md session-title", children: [device.os.toLowerCase().includes("unknown")
|
|
65
|
+
? t("unknownOperatingSystem")
|
|
66
|
+
: device.os, " ", !device.osVersion.toLowerCase().includes("unknown") &&
|
|
67
|
+
device.osVersion, " ", "/ ", session.browser] }), session.current && (_jsx(Label, { color: "green", children: t("currentSession") }))] }), _jsx(GridItem, { className: "pf-v5-u-text-align-right", sm: 3, md: 2, span: 1, children: !session.current && (_jsx(ContinueCancelModal, { buttonTitle: t("signOut"), modalTitle: t("signOut"), continueLabel: t("confirm"), cancelLabel: t("cancel"), buttonVariant: "secondary", onContinue: () => signOutSession(session, device), children: t("signOutWarning") })) }), _jsx(GridItem, { span: 11, children: _jsxs(DescriptionList, { className: "signed-in-device-grid", columnModifier: { sm: "2Col", lg: "3Col" }, cols: 5, rows: 1, children: [_jsxs(DescriptionListGroup, { children: [_jsx(DescriptionListTerm, { children: t("ipAddress") }), _jsx(DescriptionListDescription, { children: session.ipAddress })] }), _jsxs(DescriptionListGroup, { children: [_jsx(DescriptionListTerm, { children: t("lastAccessedOn") }), _jsx(DescriptionListDescription, { children: formatDate(new Date(session.lastAccess * 1000)) })] }), _jsxs(DescriptionListGroup, { children: [_jsx(DescriptionListTerm, { children: t("clients") }), _jsx(DescriptionListDescription, { children: makeClientsString(session.clients) })] }), _jsxs(DescriptionListGroup, { children: [_jsx(DescriptionListTerm, { children: t("started") }), _jsx(DescriptionListDescription, { children: formatDate(new Date(session.started * 1000)) })] }), _jsxs(DescriptionListGroup, { children: [_jsx(DescriptionListTerm, { children: t("expires") }), _jsx(DescriptionListDescription, { children: formatDate(new Date(session.expires * 1000)) })] })] }) })] }) }) }, device.id)))) }) })] }));
|
|
68
|
+
};
|
|
69
|
+
export default DeviceActivity;
|
|
70
|
+
//# sourceMappingURL=DeviceActivity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeviceActivity.js","sourceRoot":"","sources":["../src/account-security/DeviceActivity.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { DataList, Stack, StackItem, Title } from "@patternfly/react-core";
|
|
3
|
+
import { useMemo, useState } from "react";
|
|
4
|
+
import { useTranslation } from "react-i18next";
|
|
5
|
+
import { getLinkedAccounts } from "../api/methods";
|
|
6
|
+
import { EmptyRow } from "../components/datalist/EmptyRow";
|
|
7
|
+
import { Page } from "../components/page/Page";
|
|
8
|
+
import { usePromise } from "../utils/usePromise";
|
|
9
|
+
import { AccountRow } from "../account-security/AccountRow";
|
|
10
|
+
import { useEnvironment } from "../ui-shared";
|
|
11
|
+
export const LinkedAccounts = () => {
|
|
12
|
+
const { t } = useTranslation();
|
|
13
|
+
const context = useEnvironment();
|
|
14
|
+
const [accounts, setAccounts] = useState([]);
|
|
15
|
+
const [key, setKey] = useState(1);
|
|
16
|
+
const refresh = () => setKey(key + 1);
|
|
17
|
+
usePromise((signal) => getLinkedAccounts({ signal, context }), setAccounts, [
|
|
18
|
+
key,
|
|
19
|
+
]);
|
|
20
|
+
const linkedAccounts = useMemo(() => accounts.filter((account) => account.connected), [accounts]);
|
|
21
|
+
const unLinkedAccounts = useMemo(() => accounts.filter((account) => !account.connected), [accounts]);
|
|
22
|
+
return (_jsx(Page, { title: t("linkedAccounts"), description: t("linkedAccountsIntroMessage"), children: _jsxs(Stack, { hasGutter: true, children: [_jsxs(StackItem, { children: [_jsx(Title, { headingLevel: "h2", className: "pf-v5-u-mb-lg", size: "xl", children: t("linkedLoginProviders") }), _jsx(DataList, { id: "linked-idps", "aria-label": t("linkedLoginProviders"), children: linkedAccounts.length > 0 ? (linkedAccounts.map((account) => (_jsx(AccountRow, { account: account, isLinked: true, refresh: refresh }, account.providerName)))) : (_jsx(EmptyRow, { message: t("linkedEmpty") })) })] }), _jsxs(StackItem, { children: [_jsx(Title, { headingLevel: "h2", className: "pf-v5-u-mt-xl pf-v5-u-mb-lg", size: "xl", children: t("unlinkedLoginProviders") }), _jsx(DataList, { id: "unlinked-idps", "aria-label": t("unlinkedLoginProviders"), children: unLinkedAccounts.length > 0 ? (unLinkedAccounts.map((account) => (_jsx(AccountRow, { account: account, refresh: refresh }, account.providerName)))) : (_jsx(EmptyRow, { message: t("unlinkedEmpty") })) })] })] }) }));
|
|
23
|
+
};
|
|
24
|
+
export default LinkedAccounts;
|
|
25
|
+
//# sourceMappingURL=LinkedAccounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LinkedAccounts.js","sourceRoot":"","sources":["../src/account-security/LinkedAccounts.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, DataList, DataListAction, DataListCell, DataListItem, DataListItemCells, DataListItemRow, Dropdown, DropdownItem, MenuToggle, PageSection, Spinner, Split, SplitItem, Title, } from "@patternfly/react-core";
|
|
3
|
+
import { EllipsisVIcon } from "@patternfly/react-icons";
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
import { Trans, useTranslation } from "react-i18next";
|
|
6
|
+
import { useEnvironment } from "../ui-shared";
|
|
7
|
+
import { getCredentials } from "../api/methods";
|
|
8
|
+
import { EmptyRow } from "../components/datalist/EmptyRow";
|
|
9
|
+
import { Page } from "../components/page/Page";
|
|
10
|
+
import { formatDate } from "../utils/formatDate";
|
|
11
|
+
import { usePromise } from "../utils/usePromise";
|
|
12
|
+
const MobileLink = ({ title, onClick, testid }) => {
|
|
13
|
+
const [open, setOpen] = useState(false);
|
|
14
|
+
return (_jsxs(_Fragment, { children: [_jsx(Dropdown, { popperProps: {
|
|
15
|
+
position: "right",
|
|
16
|
+
}, onOpenChange: (isOpen) => setOpen(isOpen), toggle: (toggleRef) => (_jsx(MenuToggle, { className: "pf-v5-u-display-none-on-lg", ref: toggleRef, variant: "plain", onClick: () => setOpen(!open), isExpanded: open, children: _jsx(EllipsisVIcon, {}) })), isOpen: open, children: _jsx(DropdownItem, { onClick: onClick, children: title }, "1") }), _jsx(Button, { variant: "link", onClick: onClick, className: "pf-v5-u-display-none pf-v5-u-display-inline-flex-on-lg", "data-testid": testid, children: title })] }));
|
|
17
|
+
};
|
|
18
|
+
export const SigningIn = () => {
|
|
19
|
+
const { t } = useTranslation();
|
|
20
|
+
const context = useEnvironment();
|
|
21
|
+
const { login } = context.keycloak;
|
|
22
|
+
const [credentials, setCredentials] = useState();
|
|
23
|
+
usePromise((signal) => getCredentials({ signal, context }), setCredentials, []);
|
|
24
|
+
const credentialRowCells = (credMetadata) => {
|
|
25
|
+
const credential = credMetadata.credential;
|
|
26
|
+
const maxWidth = {
|
|
27
|
+
"--pf-v5-u-max-width--MaxWidth": "300px",
|
|
28
|
+
};
|
|
29
|
+
const items = [
|
|
30
|
+
_jsx(DataListCell, { "data-testrole": "label", className: "pf-v5-u-max-width", style: maxWidth, children: credential.userLabel || t(credential.type) }, "title"),
|
|
31
|
+
];
|
|
32
|
+
if (credential.createdDate) {
|
|
33
|
+
items.push(_jsx(DataListCell, { "data-testrole": "created-at", children: _jsxs(Trans, { i18nKey: "credentialCreatedAt", children: [_jsx("strong", { className: "pf-v5-u-mr-md" }), { date: formatDate(new Date(credential.createdDate)) }] }) }, "created" + credential.id));
|
|
34
|
+
}
|
|
35
|
+
return items;
|
|
36
|
+
};
|
|
37
|
+
if (!credentials) {
|
|
38
|
+
return _jsx(Spinner, {});
|
|
39
|
+
}
|
|
40
|
+
const credentialUniqueCategories = [
|
|
41
|
+
...new Set(credentials.map((c) => c.category)),
|
|
42
|
+
];
|
|
43
|
+
return (_jsx(Page, { title: t("signingIn"), description: t("signingInDescription"), children: credentialUniqueCategories.map((category) => (_jsxs(PageSection, { variant: "light", className: "pf-v5-u-px-0", children: [_jsx(Title, { headingLevel: "h2", size: "xl", id: `${category}-categ-title`, children: t(category) }), credentials
|
|
44
|
+
.filter((cred) => cred.category == category)
|
|
45
|
+
.map((container) => (_jsxs(_Fragment, { children: [_jsxs(Split, { className: "pf-v5-u-mt-lg pf-v5-u-mb-lg", children: [_jsxs(SplitItem, { children: [_jsx(Title, { headingLevel: "h3", size: "md", className: "pf-v5-u-mb-md", "data-testid": `${container.type}/help`, children: _jsx("span", { className: "cred-title pf-v5-u-display-block", "data-testid": `${container.type}/title`, children: t(container.displayName) }) }), _jsx("span", { "data-testid": `${container.type}/help-text`, children: t(container.helptext) })] }), container.createAction && (_jsx(SplitItem, { isFilled: true, children: _jsx("div", { className: "pf-v5-u-float-right", children: _jsx(MobileLink, { onClick: () => login({
|
|
46
|
+
action: container.createAction,
|
|
47
|
+
}), title: t("setUpNew", {
|
|
48
|
+
name: t(`${container.type}-display-name`),
|
|
49
|
+
}), testid: `${container.type}/create` }) }) }))] }), _jsxs(DataList, { "aria-label": "credential list", className: "pf-v5-u-mb-xl", "data-testid": `${container.type}/credential-list`, children: [container.userCredentialMetadatas.length === 0 && (_jsx(EmptyRow, { message: t("notSetUp", {
|
|
50
|
+
name: t(container.displayName),
|
|
51
|
+
}), "data-testid": `${container.type}/not-set-up` })), container.userCredentialMetadatas.map((meta) => (_jsx(DataListItem, { children: _jsx(DataListItemRow, { id: `cred-${meta.credential.id}`, children: _jsx(DataListItemCells, { className: "pf-v5-u-py-0", dataListCells: [
|
|
52
|
+
...credentialRowCells(meta),
|
|
53
|
+
_jsx(DataListAction, { id: `action-${meta.credential.id}`, "aria-label": t("updateCredAriaLabel"), "aria-labelledby": `cred-${meta.credential.id}`, children: container.removeable ? (_jsx(Button, { variant: "danger", "data-testrole": "remove", onClick: () => {
|
|
54
|
+
login({
|
|
55
|
+
action: "delete_credential:" +
|
|
56
|
+
meta.credential.id,
|
|
57
|
+
});
|
|
58
|
+
}, children: t("delete") })) : (_jsx(Button, { variant: "secondary", onClick: () => {
|
|
59
|
+
if (container.updateAction)
|
|
60
|
+
login({ action: container.updateAction });
|
|
61
|
+
}, "data-testrole": "update", children: t("update") })) }, "action"),
|
|
62
|
+
] }) }) }, meta.credential.id)))] })] })))] }, category))) }));
|
|
63
|
+
};
|
|
64
|
+
export default SigningIn;
|
|
65
|
+
//# sourceMappingURL=SigningIn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SigningIn.js","sourceRoot":"","sources":["../src/account-security/SigningIn.tsx"],"names":[],"mappings":"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"}
|
package/api/constants.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/api/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAClD,MAAM,CAAC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC"}
|
package/api/methods.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { BaseEnvironment, type KeycloakContext } from "../ui-shared";
|
|
2
|
+
import { ClientRepresentation, CredentialContainer, DeviceRepresentation, Group, LinkedAccountRepresentation, Permission, UserRepresentation } from "../api/representations";
|
|
3
|
+
export type CallOptions = {
|
|
4
|
+
context: KeycloakContext<BaseEnvironment>;
|
|
5
|
+
signal?: AbortSignal;
|
|
6
|
+
};
|
|
7
|
+
export type PaginationParams = {
|
|
8
|
+
first: number;
|
|
9
|
+
max: number;
|
|
10
|
+
};
|
|
11
|
+
export declare function getPersonalInfo({ signal, context, }: CallOptions): Promise<UserRepresentation>;
|
|
12
|
+
export declare function getSupportedLocales({ signal, context, }: CallOptions): Promise<string[]>;
|
|
13
|
+
export declare function savePersonalInfo(context: KeycloakContext<BaseEnvironment>, info: UserRepresentation): Promise<void>;
|
|
14
|
+
export declare function getPermissionRequests(resourceId: string, { signal, context }: CallOptions): Promise<Permission[]>;
|
|
15
|
+
export declare function getDevices({ signal, context, }: CallOptions): Promise<DeviceRepresentation[]>;
|
|
16
|
+
export declare function getApplications({ signal, context, }: CallOptions): Promise<ClientRepresentation[]>;
|
|
17
|
+
export declare function deleteConsent(context: KeycloakContext<BaseEnvironment>, id: string): Promise<Response>;
|
|
18
|
+
export declare function deleteSession(context: KeycloakContext<BaseEnvironment>, id?: string): Promise<Response>;
|
|
19
|
+
export declare function getCredentials({ signal, context }: CallOptions): Promise<CredentialContainer[]>;
|
|
20
|
+
export declare function getLinkedAccounts({ signal, context }: CallOptions): Promise<LinkedAccountRepresentation[]>;
|
|
21
|
+
export declare function unLinkAccount(context: KeycloakContext<BaseEnvironment>, account: LinkedAccountRepresentation): Promise<unknown>;
|
|
22
|
+
export declare function linkAccount(context: KeycloakContext<BaseEnvironment>, account: LinkedAccountRepresentation): Promise<{
|
|
23
|
+
accountLinkUri: string;
|
|
24
|
+
}>;
|
|
25
|
+
export declare function getGroups({ signal, context }: CallOptions): Promise<Group[]>;
|
package/api/methods.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { joinPath } from "../utils/joinPath";
|
|
2
|
+
import { parseResponse } from "../api/parse-response";
|
|
3
|
+
import { request } from "../api/request";
|
|
4
|
+
export async function getPersonalInfo({ signal, context, }) {
|
|
5
|
+
const response = await request("/?userProfileMetadata=true", context, {
|
|
6
|
+
signal,
|
|
7
|
+
});
|
|
8
|
+
return parseResponse(response);
|
|
9
|
+
}
|
|
10
|
+
export async function getSupportedLocales({ signal, context, }) {
|
|
11
|
+
const response = await request("/supportedLocales", context, { signal });
|
|
12
|
+
return parseResponse(response);
|
|
13
|
+
}
|
|
14
|
+
export async function savePersonalInfo(context, info) {
|
|
15
|
+
const response = await request("/", context, { body: info, method: "POST" });
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
const { errors } = await response.json();
|
|
18
|
+
throw errors;
|
|
19
|
+
}
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
export async function getPermissionRequests(resourceId, { signal, context }) {
|
|
23
|
+
const response = await request(`/resources/${resourceId}/permissions/requests`, context, { signal });
|
|
24
|
+
return parseResponse(response);
|
|
25
|
+
}
|
|
26
|
+
export async function getDevices({ signal, context, }) {
|
|
27
|
+
const response = await request("/sessions/devices", context, { signal });
|
|
28
|
+
return parseResponse(response);
|
|
29
|
+
}
|
|
30
|
+
export async function getApplications({ signal, context, }) {
|
|
31
|
+
const response = await request("/applications", context, { signal });
|
|
32
|
+
return parseResponse(response);
|
|
33
|
+
}
|
|
34
|
+
export async function deleteConsent(context, id) {
|
|
35
|
+
return request(`/applications/${id}/consent`, context, { method: "DELETE" });
|
|
36
|
+
}
|
|
37
|
+
export async function deleteSession(context, id) {
|
|
38
|
+
return request(`/sessions${id ? `/${id}` : ""}`, context, {
|
|
39
|
+
method: "DELETE",
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
export async function getCredentials({ signal, context }) {
|
|
43
|
+
const response = await request("/credentials", context, {
|
|
44
|
+
signal,
|
|
45
|
+
});
|
|
46
|
+
return parseResponse(response);
|
|
47
|
+
}
|
|
48
|
+
export async function getLinkedAccounts({ signal, context }) {
|
|
49
|
+
const response = await request("/linked-accounts", context, { signal });
|
|
50
|
+
return parseResponse(response);
|
|
51
|
+
}
|
|
52
|
+
export async function unLinkAccount(context, account) {
|
|
53
|
+
const response = await request("/linked-accounts/" + account.providerName, context, {
|
|
54
|
+
method: "DELETE",
|
|
55
|
+
});
|
|
56
|
+
if (response.ok)
|
|
57
|
+
return;
|
|
58
|
+
return parseResponse(response);
|
|
59
|
+
}
|
|
60
|
+
export async function linkAccount(context, account) {
|
|
61
|
+
const redirectUri = encodeURIComponent(joinPath(context.environment.serverBaseUrl, "realms", context.environment.realm, "account"));
|
|
62
|
+
const response = await request("/linked-accounts/" + account.providerName, context, {
|
|
63
|
+
searchParams: { providerId: account.providerName, redirectUri },
|
|
64
|
+
});
|
|
65
|
+
return parseResponse(response);
|
|
66
|
+
}
|
|
67
|
+
export async function getGroups({ signal, context }) {
|
|
68
|
+
const response = await request("/groups", context, {
|
|
69
|
+
signal,
|
|
70
|
+
});
|
|
71
|
+
return parseResponse(response);
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=methods.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"methods.js","sourceRoot":"","sources":["../src/api/methods.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export function parseLinks(response) {
|
|
2
|
+
const linkHeader = response.headers.get("link");
|
|
3
|
+
if (!linkHeader) {
|
|
4
|
+
throw new Error("Attempted to parse links, but no header was found.");
|
|
5
|
+
}
|
|
6
|
+
const links = linkHeader.split(/,\s*</);
|
|
7
|
+
return links.reduce((acc, link) => {
|
|
8
|
+
const matcher = link.match(/<?([^>]*)>(.*)/);
|
|
9
|
+
if (!matcher)
|
|
10
|
+
return {};
|
|
11
|
+
const linkUrl = matcher[1];
|
|
12
|
+
const rel = matcher[2].match(/\s*(.+)\s*=\s*"?([^"]+)"?/);
|
|
13
|
+
if (rel) {
|
|
14
|
+
const link = {};
|
|
15
|
+
for (const [key, value] of new URL(linkUrl).searchParams.entries()) {
|
|
16
|
+
link[key] = value;
|
|
17
|
+
}
|
|
18
|
+
acc[rel[2]] = link;
|
|
19
|
+
}
|
|
20
|
+
return acc;
|
|
21
|
+
}, {});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=parse-links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-links.js","sourceRoot":"","sources":["../src/api/parse-links.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,UAAU,CAAC,QAAkB;IAC3C,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEhD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,KAAK,CAAC,MAAM,CAAQ,CAAC,GAAU,EAAE,IAAY,EAAE,EAAE;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC1D,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,IAAI,GAA2B,EAAE,CAAC;YACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;gBACnE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACpB,CAAC;YACD,GAAG,CAAC,GAAG,CAAC,CAAC,CAAgB,CAAC,GAAG,IAAI,CAAC;QACpC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { isRecord } from "../utils/isRecord";
|
|
2
|
+
import { CONTENT_TYPE_HEADER, CONTENT_TYPE_JSON } from "../api/constants";
|
|
3
|
+
export class ApiError extends Error {
|
|
4
|
+
}
|
|
5
|
+
export async function parseResponse(response) {
|
|
6
|
+
const contentType = response.headers.get(CONTENT_TYPE_HEADER);
|
|
7
|
+
const isJSON = contentType ? contentType.includes(CONTENT_TYPE_JSON) : false;
|
|
8
|
+
if (!isJSON) {
|
|
9
|
+
throw new Error(`Expected response to have a JSON content type, got '${contentType}' instead.`);
|
|
10
|
+
}
|
|
11
|
+
const data = await parseJSON(response);
|
|
12
|
+
if (!response.ok) {
|
|
13
|
+
throw new ApiError(getErrorMessage(data));
|
|
14
|
+
}
|
|
15
|
+
return data;
|
|
16
|
+
}
|
|
17
|
+
async function parseJSON(response) {
|
|
18
|
+
try {
|
|
19
|
+
return await response.json();
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
throw new Error("Unable to parse response as valid JSON.", {
|
|
23
|
+
cause: error,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function getErrorMessage(data) {
|
|
28
|
+
if (!isRecord(data)) {
|
|
29
|
+
throw new Error("Unable to retrieve error message from response.");
|
|
30
|
+
}
|
|
31
|
+
const errorKeys = ["error_description", "errorMessage", "error"];
|
|
32
|
+
for (const key of errorKeys) {
|
|
33
|
+
const value = data[key];
|
|
34
|
+
if (typeof value === "string") {
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
throw new Error("Unable to retrieve error message from response, no matching key found.");
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=parse-response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-response.js","sourceRoot":"","sources":["../src/api/parse-response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iDAAiD,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AAExG,MAAM,OAAO,QAAS,SAAQ,KAAK;CAAG;AAEtC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAI,QAAkB;IACvD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAE7E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,uDAAuD,WAAW,YAAY,CAC/E,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEvC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,IAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,QAAkB;IACzC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,yCAAyC,EAAE;YACzD,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAa;IACpC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,mBAAmB,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAEjE,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAExB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAC;AACJ,CAAC"}
|