From a0c99a7ae0656e4b9b071dcf6f9172ef0474a976 Mon Sep 17 00:00:00 2001 From: Jon Koops Date: Wed, 10 Jul 2024 16:20:26 +0200 Subject: [PATCH] Show full error details in admin and account consoles Closes #30705 Signed-off-by: Jon Koops Signed-off-by: Erik Jan de Wit Co-authored-by: Erik Jan de Wit --- .../src/account-security/AccountRow.tsx | 14 +-- .../src/account-security/DeviceActivity.tsx | 15 +-- js/apps/account-ui/src/api/parse-response.ts | 45 ++++--- .../src/applications/Applications.tsx | 15 +-- js/apps/account-ui/src/index.ts | 7 +- .../src/personal-info/PersonalInfo.tsx | 7 +- .../src/resources/EditTheResource.tsx | 17 +-- .../src/resources/PermissionRequest.tsx | 8 +- .../account-ui/src/resources/ResourcesTab.tsx | 15 +-- .../src/resources/ShareTheResource.tsx | 17 +-- js/apps/account-ui/src/utils/isRecord.ts | 2 - .../account-ui/src/utils/useAccountAlerts.ts | 28 +++++ .../account-security/linked-accounts.spec.ts | 19 ++- .../test/personal-info/personal-info.spec.ts | 4 +- .../cypress/e2e/clients_saml_advanced.spec.ts | 2 +- .../cypress/e2e/clients_saml_test.spec.ts | 9 +- .../support/pages/admin-ui/Masthead.ts | 40 +++---- .../client_details/tabs/SettingsTab.ts | 3 +- js/apps/admin-ui/src/App.tsx | 5 +- .../authentication/AuthenticationSection.tsx | 3 +- .../src/authentication/BindFlowDialog.tsx | 2 +- .../src/authentication/DuplicateFlowModal.tsx | 2 +- .../src/authentication/EditFlowModal.tsx | 3 +- .../src/authentication/FlowDetails.tsx | 2 +- .../src/authentication/RequiredActions.tsx | 2 +- .../components/ExecutionConfigModal.tsx | 2 +- .../components/RequiredActionConfigModal.tsx | 2 +- .../src/authentication/form/CreateFlow.tsx | 2 +- .../authentication/policies/CibaPolicy.tsx | 2 +- .../src/authentication/policies/OtpPolicy.tsx | 2 +- .../policies/PasswordPolicy.tsx | 2 +- .../policies/WebauthnPolicy.tsx | 2 +- .../src/client-scopes/ChangeTypeDropdown.tsx | 2 +- .../src/client-scopes/ClientScopesSection.tsx | 2 +- .../src/client-scopes/CreateClientScope.tsx | 2 +- .../src/client-scopes/EditClientScope.tsx | 2 +- .../client-scopes/details/MappingDetails.tsx | 2 +- js/apps/admin-ui/src/clients/AdvancedTab.tsx | 2 +- .../admin-ui/src/clients/ClientDetails.tsx | 2 +- .../admin-ui/src/clients/ClientsSection.tsx | 2 +- .../src/clients/add/NewClientForm.tsx | 2 +- .../src/clients/advanced/AddHostDialog.tsx | 2 +- .../src/clients/advanced/ClusteringPanel.tsx | 2 +- .../authorization/AuthorizationEvaluate.tsx | 2 +- .../authorization/AuthorizationExport.tsx | 2 +- .../authorization/DeleteScopeDialog.tsx | 2 +- .../authorization/PermissionDetails.tsx | 2 +- .../src/clients/authorization/Permissions.tsx | 2 +- .../src/clients/authorization/Policies.tsx | 2 +- .../clients/authorization/ResourceDetails.tsx | 2 +- .../src/clients/authorization/Resources.tsx | 2 +- .../clients/authorization/ScopeDetails.tsx | 2 +- .../src/clients/authorization/Settings.tsx | 2 +- .../authorization/policy/PolicyDetails.tsx | 2 +- .../src/clients/credentials/ClientSecret.tsx | 2 +- .../src/clients/credentials/Credentials.tsx | 2 +- .../src/clients/import/ImportForm.tsx | 2 +- .../CreateInitialAccessToken.tsx | 2 +- .../initial-access/InitialAccessTokenList.tsx | 2 +- .../src/clients/keys/ExportSamlKeyDialog.tsx | 2 +- js/apps/admin-ui/src/clients/keys/Keys.tsx | 2 +- .../src/clients/keys/SamlImportKeyDialog.tsx | 2 +- .../admin-ui/src/clients/keys/SamlKeys.tsx | 2 +- .../src/clients/keys/SamlKeysDialog.tsx | 2 +- .../registration/ClientRegistrationList.tsx | 2 +- .../clients/registration/DetailProvider.tsx | 2 +- .../src/clients/roles/CreateClientRole.tsx | 2 +- .../src/clients/scopes/ClientScopes.tsx | 2 +- .../clients/scopes/CopyToClipboardButton.tsx | 6 +- .../src/clients/scopes/DedicatedScope.tsx | 2 +- .../src/clients/scopes/DedicatedScopes.tsx | 2 +- .../service-account/ServiceAccount.tsx | 2 +- .../admin-ui/src/components/alert/Alerts.tsx | 111 ------------------ .../src/components/dynamic/MapComponent.tsx | 7 +- .../components/role-mapping/RoleMapping.tsx | 2 +- .../src/components/roles-list/RolesList.tsx | 2 +- .../src/components/users/UserDataTable.tsx | 2 +- .../UserDataTableAttributeSearchForm.tsx | 2 +- .../admin-ui/src/groups/GroupAttributes.tsx | 2 +- .../admin-ui/src/groups/GroupRoleMapping.tsx | 2 +- js/apps/admin-ui/src/groups/GroupsModal.tsx | 2 +- js/apps/admin-ui/src/groups/Members.tsx | 2 +- js/apps/admin-ui/src/groups/MembersModal.tsx | 2 +- .../src/groups/components/DeleteGroup.tsx | 2 +- .../src/groups/components/GroupTree.tsx | 2 +- .../src/groups/components/MoveDialog.tsx | 2 +- .../IdentityProvidersSection.tsx | 2 +- .../identity-providers/ManageOrderDialog.tsx | 2 +- .../add/AddIdentityProvider.tsx | 2 +- .../src/identity-providers/add/AddMapper.tsx | 2 +- .../add/AddOpenIdConnect.tsx | 2 +- .../identity-providers/add/AddSamlConnect.tsx | 2 +- .../identity-providers/add/DetailSettings.tsx | 2 +- js/apps/admin-ui/src/index.ts | 2 - .../DetailOraganzationHeader.tsx | 2 +- .../src/organizations/DetailOrganization.tsx | 2 +- .../src/organizations/IdentityProviders.tsx | 2 +- .../src/organizations/InviteMemberModal.tsx | 2 +- .../LinkIdentityProviderModal.tsx | 2 +- .../admin-ui/src/organizations/Members.tsx | 2 +- .../src/organizations/NewOrganization.tsx | 2 +- .../organizations/OrganizationsSection.tsx | 2 +- js/apps/admin-ui/src/page/Page.tsx | 2 +- js/apps/admin-ui/src/page/PageHandler.tsx | 2 +- js/apps/admin-ui/src/page/PageList.tsx | 2 +- .../src/realm-roles/CreateRealmRole.tsx | 2 +- .../src/realm-roles/RealmRoleTabs.tsx | 2 +- .../src/realm-settings/ClientProfileForm.tsx | 2 +- .../src/realm-settings/DefaultGroupsTab.tsx | 2 +- .../admin-ui/src/realm-settings/EmailTab.tsx | 2 +- .../src/realm-settings/ExecutorForm.tsx | 2 +- .../admin-ui/src/realm-settings/LoginTab.tsx | 2 +- .../realm-settings/NewAttributeSettings.tsx | 2 +- .../src/realm-settings/NewClientPolicy.tsx | 2 +- .../NewClientPolicyCondition.tsx | 2 +- .../src/realm-settings/PartialExport.tsx | 2 +- .../src/realm-settings/PartialImport.tsx | 2 +- .../src/realm-settings/PoliciesTab.tsx | 2 +- .../src/realm-settings/ProfilesTab.tsx | 2 +- .../src/realm-settings/RealmSettingsTabs.tsx | 2 +- .../src/realm-settings/UserRegistration.tsx | 2 +- .../realm-settings/event-config/EventsTab.tsx | 2 +- .../realm-settings/keys/KeysProvidersTab.tsx | 2 +- .../keys/key-providers/KeyProviderForm.tsx | 2 +- .../localization/RealmOverrides.tsx | 2 +- .../user-profile/AttributesGroupForm.tsx | 2 +- .../user-profile/JsonEditorTab.tsx | 2 +- .../user-profile/UserProfileContext.tsx | 2 +- .../admin-ui/src/realm/add/NewRealmForm.tsx | 2 +- .../admin-ui/src/sessions/RevocationModal.tsx | 2 +- .../admin-ui/src/sessions/SessionsSection.tsx | 2 +- .../admin-ui/src/sessions/SessionsTable.tsx | 2 +- .../CreateUserFederationLdapSettings.tsx | 2 +- .../user-federation/ManagePriorityDialog.tsx | 2 +- .../UserFederationKerberosSettings.tsx | 2 +- .../UserFederationLdapSettings.tsx | 2 +- .../user-federation/UserFederationSection.tsx | 2 +- .../custom/CustomProviderSettings.tsx | 2 +- .../ldap/LdapSettingsAdvanced.tsx | 2 +- .../ldap/LdapSettingsConnection.tsx | 2 +- .../ldap/mappers/LdapMapperDetails.tsx | 2 +- .../ldap/mappers/LdapMapperList.tsx | 2 +- .../user-federation/shared/ExtendedHeader.tsx | 2 +- .../src/user-federation/shared/Header.tsx | 2 +- js/apps/admin-ui/src/user/CreateUser.tsx | 2 +- js/apps/admin-ui/src/user/EditUser.tsx | 2 +- js/apps/admin-ui/src/user/UserConsents.tsx | 2 +- js/apps/admin-ui/src/user/UserCredentials.tsx | 2 +- js/apps/admin-ui/src/user/UserForm.tsx | 2 +- js/apps/admin-ui/src/user/UserGroups.tsx | 2 +- js/apps/admin-ui/src/user/UserIdPModal.tsx | 2 +- .../src/user/UserIdentityProviderLinks.tsx | 2 +- js/apps/admin-ui/src/user/UserRoleMapping.tsx | 2 +- .../user/user-credentials/InlineLabelEdit.tsx | 2 +- .../ResetCredentialDialog.tsx | 2 +- .../user-credentials/ResetPasswordDialog.tsx | 2 +- js/apps/admin-ui/src/util.ts | 2 - .../ui-shared/src/alerts}/AlertPanel.tsx | 6 +- js/libs/ui-shared/src/alerts/Alerts.tsx | 98 ++++++++-------- js/libs/ui-shared/src/main.ts | 16 ++- js/libs/ui-shared/src/utils/errors.ts | 55 +++++++++ js/libs/ui-shared/src/utils/generateId.ts | 1 + .../src/utils/useSetTimeout.test.ts | 2 +- .../ui-shared}/src/utils/useSetTimeout.ts | 2 +- .../pages/fragments/ContentAlert.java | 4 +- 165 files changed, 413 insertions(+), 439 deletions(-) delete mode 100644 js/apps/account-ui/src/utils/isRecord.ts create mode 100644 js/apps/account-ui/src/utils/useAccountAlerts.ts delete mode 100644 js/apps/admin-ui/src/components/alert/Alerts.tsx rename js/{apps/admin-ui/src/components/alert => libs/ui-shared/src/alerts}/AlertPanel.tsx (83%) create mode 100644 js/libs/ui-shared/src/utils/errors.ts create mode 100644 js/libs/ui-shared/src/utils/generateId.ts rename js/{apps/admin-ui => libs/ui-shared}/src/utils/useSetTimeout.test.ts (98%) rename js/{apps/admin-ui => libs/ui-shared}/src/utils/useSetTimeout.ts (95%) diff --git a/js/apps/account-ui/src/account-security/AccountRow.tsx b/js/apps/account-ui/src/account-security/AccountRow.tsx index 37b539a07b..a238e31795 100644 --- a/js/apps/account-ui/src/account-security/AccountRow.tsx +++ b/js/apps/account-ui/src/account-security/AccountRow.tsx @@ -1,3 +1,4 @@ +import { IconMapper, useEnvironment } from "@keycloak/keycloak-ui-shared"; import { Button, DataListAction, @@ -12,13 +13,10 @@ import { } from "@patternfly/react-core"; import { LinkIcon, UnlinkIcon } from "@patternfly/react-icons"; import { useTranslation } from "react-i18next"; -import { - IconMapper, - useAlerts, - useEnvironment, -} from "@keycloak/keycloak-ui-shared"; + import { linkAccount, unLinkAccount } from "../api/methods"; import { LinkedAccountRepresentation } from "../api/representations"; +import { useAccountAlerts } from "../utils/useAccountAlerts"; type AccountRowProps = { account: LinkedAccountRepresentation; @@ -33,7 +31,7 @@ export const AccountRow = ({ }: AccountRowProps) => { const { t } = useTranslation(); const context = useEnvironment(); - const { addAlert, addError } = useAlerts(); + const { addAlert, addError } = useAccountAlerts(); const unLink = async (account: LinkedAccountRepresentation) => { try { @@ -41,7 +39,7 @@ export const AccountRow = ({ addAlert(t("unLinkSuccess")); refresh(); } catch (error) { - addError(t("unLinkError", { error }).toString()); + addError("unLinkError", error); } }; @@ -50,7 +48,7 @@ export const AccountRow = ({ const { accountLinkUri } = await linkAccount(context, account); location.href = accountLinkUri; } catch (error) { - addError(t("linkError", { error }).toString()); + addError("linkError", error); } }; diff --git a/js/apps/account-ui/src/account-security/DeviceActivity.tsx b/js/apps/account-ui/src/account-security/DeviceActivity.tsx index 061f788166..371b5e42e6 100644 --- a/js/apps/account-ui/src/account-security/DeviceActivity.tsx +++ b/js/apps/account-ui/src/account-security/DeviceActivity.tsx @@ -1,3 +1,7 @@ +import { + ContinueCancelModal, + useEnvironment, +} from "@keycloak/keycloak-ui-shared"; import { Button, DataList, @@ -23,11 +27,7 @@ import { } from "@patternfly/react-icons"; import { useState } from "react"; import { useTranslation } from "react-i18next"; -import { - ContinueCancelModal, - useAlerts, - useEnvironment, -} from "@keycloak/keycloak-ui-shared"; + import { deleteSession, getDevices } from "../api/methods"; import { ClientRepresentation, @@ -37,12 +37,13 @@ import { import { Page } from "../components/page/Page"; import { TFuncKey } from "../i18n"; import { formatDate } from "../utils/formatDate"; +import { useAccountAlerts } from "../utils/useAccountAlerts"; import { usePromise } from "../utils/usePromise"; export const DeviceActivity = () => { const { t } = useTranslation(); const context = useEnvironment(); - const { addAlert, addError } = useAlerts(); + const { addAlert, addError } = useAccountAlerts(); const [devices, setDevices] = useState(); const [key, setKey] = useState(0); @@ -82,7 +83,7 @@ export const DeviceActivity = () => { ); refresh(); } catch (error) { - addError(t("errorSignOutMessage", { error }).toString()); + addError("errorSignOutMessage", error); } }; diff --git a/js/apps/account-ui/src/api/parse-response.ts b/js/apps/account-ui/src/api/parse-response.ts index 7599b04772..1b5f156a48 100644 --- a/js/apps/account-ui/src/api/parse-response.ts +++ b/js/apps/account-ui/src/api/parse-response.ts @@ -1,7 +1,17 @@ -import { isRecord } from "../utils/isRecord"; +import { + getNetworkErrorMessage, + getNetworkErrorDescription, +} from "@keycloak/keycloak-ui-shared"; import { CONTENT_TYPE_HEADER, CONTENT_TYPE_JSON } from "./constants"; -export class ApiError extends Error {} +export class ApiError extends Error { + description?: string; + + constructor(message: string, description?: string) { + super(message); + this.description = description; + } +} export async function parseResponse(response: Response): Promise { const contentType = response.headers.get(CONTENT_TYPE_HEADER); @@ -16,7 +26,16 @@ export async function parseResponse(response: Response): Promise { const data = await parseJSON(response); if (!response.ok) { - throw new ApiError(getErrorMessage(data)); + const message = getNetworkErrorMessage(data); + const description = getNetworkErrorDescription(data); + + if (!message) { + throw new Error( + "Unable to retrieve error message from response, no matching key found.", + ); + } + + throw new ApiError(message, description); } return data as T; @@ -31,23 +50,3 @@ async function parseJSON(response: Response): Promise { }); } } - -function getErrorMessage(data: unknown): string { - if (!isRecord(data)) { - throw new Error("Unable to retrieve error message from response."); - } - - const errorKeys = ["error_description", "errorMessage", "error"]; - - for (const key of errorKeys) { - const value = data[key]; - - if (typeof value === "string") { - return value; - } - } - - throw new Error( - "Unable to retrieve error message from response, no matching key found.", - ); -} diff --git a/js/apps/account-ui/src/applications/Applications.tsx b/js/apps/account-ui/src/applications/Applications.tsx index ab30781bf8..c6b6c1e837 100644 --- a/js/apps/account-ui/src/applications/Applications.tsx +++ b/js/apps/account-ui/src/applications/Applications.tsx @@ -1,3 +1,7 @@ +import { + ContinueCancelModal, + useEnvironment, +} from "@keycloak/keycloak-ui-shared"; import { Button, DataList, @@ -22,16 +26,13 @@ import { } from "@patternfly/react-icons"; import { useState } from "react"; import { useTranslation } from "react-i18next"; -import { - ContinueCancelModal, - useAlerts, - useEnvironment, -} from "@keycloak/keycloak-ui-shared"; + import { deleteConsent, getApplications } from "../api/methods"; import { ClientRepresentation } from "../api/representations"; import { Page } from "../components/page/Page"; import { TFuncKey } from "../i18n"; import { formatDate } from "../utils/formatDate"; +import { useAccountAlerts } from "../utils/useAccountAlerts"; import { usePromise } from "../utils/usePromise"; type Application = ClientRepresentation & { @@ -41,7 +42,7 @@ type Application = ClientRepresentation & { export const Applications = () => { const { t } = useTranslation(); const context = useEnvironment(); - const { addAlert, addError } = useAlerts(); + const { addAlert, addError } = useAccountAlerts(); const [applications, setApplications] = useState(); const [key, setKey] = useState(1); @@ -67,7 +68,7 @@ export const Applications = () => { refresh(); addAlert(t("removeConsentSuccess")); } catch (error) { - addError(t("removeConsentError", { error }).toString()); + addError("removeConsentError", error); } }; diff --git a/js/apps/account-ui/src/index.ts b/js/apps/account-ui/src/index.ts index 5bfe06a547..5d57ce5aee 100644 --- a/js/apps/account-ui/src/index.ts +++ b/js/apps/account-ui/src/index.ts @@ -56,9 +56,6 @@ export { unLinkAccount, } from "./api/methods"; export type { Environment as AccountEnvironment } from "./environment"; -export { - KeycloakProvider, - useEnvironment, - useAlerts, -} from "@keycloak/keycloak-ui-shared"; +export { KeycloakProvider, useEnvironment } from "@keycloak/keycloak-ui-shared"; +export { useAccountAlerts } from "./utils/useAccountAlerts"; export { usePromise } from "./utils/usePromise"; diff --git a/js/apps/account-ui/src/personal-info/PersonalInfo.tsx b/js/apps/account-ui/src/personal-info/PersonalInfo.tsx index f7ec0a45f2..98ad25b0ac 100644 --- a/js/apps/account-ui/src/personal-info/PersonalInfo.tsx +++ b/js/apps/account-ui/src/personal-info/PersonalInfo.tsx @@ -3,12 +3,12 @@ import { beerify, debeerify, setUserProfileServerError, - useAlerts, useEnvironment, } from "@keycloak/keycloak-ui-shared"; import { ActionGroup, Alert, + AlertVariant, Button, ExpandableSection, Form, @@ -32,6 +32,7 @@ import { import { Page } from "../components/page/Page"; import type { Environment } from "../environment"; import { TFuncKey, i18n } from "../i18n"; +import { useAccountAlerts } from "../utils/useAccountAlerts"; import { usePromise } from "../utils/usePromise"; export const PersonalInfo = () => { @@ -42,7 +43,7 @@ export const PersonalInfo = () => { const [supportedLocales, setSupportedLocales] = useState([]); const form = useForm({ mode: "onChange" }); const { handleSubmit, reset, setValue, setError } = form; - const { addAlert, addError } = useAlerts(); + const { addAlert } = useAccountAlerts(); usePromise( (signal) => @@ -79,7 +80,7 @@ export const PersonalInfo = () => { context.keycloak.updateToken(); addAlert(t("accountUpdatedMessage")); } catch (error) { - addError(t("accountUpdatedError").toString()); + addAlert(t("accountUpdatedError"), AlertVariant.danger); setUserProfileServerError( { responseData: { errors: error as any } }, diff --git a/js/apps/account-ui/src/resources/EditTheResource.tsx b/js/apps/account-ui/src/resources/EditTheResource.tsx index 6324b388ae..70ce690f8a 100644 --- a/js/apps/account-ui/src/resources/EditTheResource.tsx +++ b/js/apps/account-ui/src/resources/EditTheResource.tsx @@ -1,15 +1,16 @@ +import { + SelectControl, + TextControl, + useEnvironment, +} from "@keycloak/keycloak-ui-shared"; import { Button, Form, Modal } from "@patternfly/react-core"; import { Fragment, useEffect } from "react"; import { FormProvider, useFieldArray, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; -import { - SelectControl, - TextControl, - useAlerts, - useEnvironment, -} from "@keycloak/keycloak-ui-shared"; + import { updatePermissions } from "../api"; import type { Permission, Resource } from "../api/representations"; +import { useAccountAlerts } from "../utils/useAccountAlerts"; type EditTheResourceProps = { resource: Resource; @@ -28,7 +29,7 @@ export const EditTheResource = ({ }: EditTheResourceProps) => { const { t } = useTranslation(); const context = useEnvironment(); - const { addAlert, addError } = useAlerts(); + const { addAlert, addError } = useAccountAlerts(); const form = useForm(); const { control, reset, handleSubmit } = form; @@ -50,7 +51,7 @@ export const EditTheResource = ({ addAlert(t("updateSuccess")); onClose(); } catch (error) { - addError(t("updateError", { error }).toString()); + addError("updateError", error); } }; diff --git a/js/apps/account-ui/src/resources/PermissionRequest.tsx b/js/apps/account-ui/src/resources/PermissionRequest.tsx index a9f4ac06ea..b0abc73857 100644 --- a/js/apps/account-ui/src/resources/PermissionRequest.tsx +++ b/js/apps/account-ui/src/resources/PermissionRequest.tsx @@ -1,3 +1,4 @@ +import { useEnvironment } from "@keycloak/keycloak-ui-shared"; import { Badge, Button, @@ -11,9 +12,10 @@ import { UserCheckIcon } from "@patternfly/react-icons"; import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table"; import { useState } from "react"; import { useTranslation } from "react-i18next"; -import { useAlerts, useEnvironment } from "@keycloak/keycloak-ui-shared"; + import { fetchPermission, updateRequest } from "../api"; import { Permission, Resource } from "../api/representations"; +import { useAccountAlerts } from "../utils/useAccountAlerts"; type PermissionRequestProps = { resource: Resource; @@ -26,7 +28,7 @@ export const PermissionRequest = ({ }: PermissionRequestProps) => { const { t } = useTranslation(); const context = useEnvironment(); - const { addAlert, addError } = useAlerts(); + const { addAlert, addError } = useAccountAlerts(); const [open, setOpen] = useState(false); @@ -54,7 +56,7 @@ export const PermissionRequest = ({ toggle(); refresh(); } catch (error) { - addError(t("shareError", { error }).toString()); + addError("shareError", error); } }; diff --git a/js/apps/account-ui/src/resources/ResourcesTab.tsx b/js/apps/account-ui/src/resources/ResourcesTab.tsx index 828ef18367..8eca536d9e 100644 --- a/js/apps/account-ui/src/resources/ResourcesTab.tsx +++ b/js/apps/account-ui/src/resources/ResourcesTab.tsx @@ -1,3 +1,7 @@ +import { + ContinueCancelModal, + useEnvironment, +} from "@keycloak/keycloak-ui-shared"; import { Button, Chip, @@ -32,15 +36,12 @@ import { } from "@patternfly/react-table"; import { useState } from "react"; import { useTranslation } from "react-i18next"; -import { - ContinueCancelModal, - useAlerts, - useEnvironment, -} from "@keycloak/keycloak-ui-shared"; + import { fetchPermission, fetchResources, updatePermissions } from "../api"; import { getPermissionRequests } from "../api/methods"; import { Links } from "../api/parse-links"; import { Permission, Resource } from "../api/representations"; +import { useAccountAlerts } from "../utils/useAccountAlerts"; import { usePromise } from "../utils/usePromise"; import { EditTheResource } from "./EditTheResource"; import { PermissionRequest } from "./PermissionRequest"; @@ -63,7 +64,7 @@ type ResourcesTabProps = { export const ResourcesTab = ({ isShared = false }: ResourcesTabProps) => { const { t } = useTranslation(); const context = useEnvironment(); - const { addAlert, addError } = useAlerts(); + const { addAlert, addError } = useAccountAlerts(); const [params, setParams] = useState>({ first: "0", @@ -128,7 +129,7 @@ export const ResourcesTab = ({ isShared = false }: ResourcesTabProps) => { setDetails({}); addAlert(t("unShareSuccess")); } catch (error) { - addError(t("unShareError", { error }).toString()); + addError("unShareError", error); } }; diff --git a/js/apps/account-ui/src/resources/ShareTheResource.tsx b/js/apps/account-ui/src/resources/ShareTheResource.tsx index 67d14b9aff..d77aec3d9b 100644 --- a/js/apps/account-ui/src/resources/ShareTheResource.tsx +++ b/js/apps/account-ui/src/resources/ShareTheResource.tsx @@ -1,3 +1,8 @@ +import { + FormErrorText, + SelectControl, + useEnvironment, +} from "@keycloak/keycloak-ui-shared"; import { Button, Chip, @@ -18,14 +23,10 @@ import { useWatch, } from "react-hook-form"; import { useTranslation } from "react-i18next"; -import { - FormErrorText, - SelectControl, - useAlerts, - useEnvironment, -} from "@keycloak/keycloak-ui-shared"; + import { updateRequest } from "../api"; import { Permission, Resource } from "../api/representations"; +import { useAccountAlerts } from "../utils/useAccountAlerts"; import { SharedWith } from "./SharedWith"; type ShareTheResourceProps = { @@ -48,7 +49,7 @@ export const ShareTheResource = ({ }: ShareTheResourceProps) => { const { t } = useTranslation(); const context = useEnvironment(); - const { addAlert, addError } = useAlerts(); + const { addAlert, addError } = useAccountAlerts(); const form = useForm(); const { control, @@ -92,7 +93,7 @@ export const ShareTheResource = ({ addAlert(t("shareSuccess")); onClose(); } catch (error) { - addError(t("shareError", { error }).toString()); + addError("shareError", error); } reset({}); }; diff --git a/js/apps/account-ui/src/utils/isRecord.ts b/js/apps/account-ui/src/utils/isRecord.ts deleted file mode 100644 index edc914cfb4..0000000000 --- a/js/apps/account-ui/src/utils/isRecord.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const isRecord = (value: unknown): value is Record => - typeof value === "object" && value !== null; diff --git a/js/apps/account-ui/src/utils/useAccountAlerts.ts b/js/apps/account-ui/src/utils/useAccountAlerts.ts new file mode 100644 index 0000000000..2dcf84f958 --- /dev/null +++ b/js/apps/account-ui/src/utils/useAccountAlerts.ts @@ -0,0 +1,28 @@ +import { useAlerts } from "@keycloak/keycloak-ui-shared"; +import { AlertVariant } from "@patternfly/react-core"; +import { useCallback, useMemo } from "react"; +import { useTranslation } from "react-i18next"; + +import { ApiError } from "../api/parse-response"; + +export function useAccountAlerts() { + const { t } = useTranslation(); + const { addAlert, addError } = useAlerts(); + const addAccountError = useCallback( + (messageKey: string, error: unknown) => { + if (!(error instanceof ApiError)) { + addError(messageKey, error); + return; + } + + const message = t(messageKey, { error: error.message }); + addAlert(message, AlertVariant.danger, error.description); + }, + [addAlert, addError, t], + ); + + return useMemo( + () => ({ addAlert, addError: addAccountError }), + [addAccountError, addAlert], + ); +} diff --git a/js/apps/account-ui/test/account-security/linked-accounts.spec.ts b/js/apps/account-ui/test/account-security/linked-accounts.spec.ts index a6fdfe3dad..31ca4a2c78 100644 --- a/js/apps/account-ui/test/account-security/linked-accounts.spec.ts +++ b/js/apps/account-ui/test/account-security/linked-accounts.spec.ts @@ -1,6 +1,6 @@ import ClientRepresentation from "@keycloak/keycloak-admin-client/lib/defs/clientRepresentation"; import IdentityProviderRepresentation from "@keycloak/keycloak-admin-client/lib/defs/identityProviderRepresentation"; -import { expect, test } from "@playwright/test"; +import { Page, expect, test } from "@playwright/test"; import { randomUUID } from "node:crypto"; import { @@ -92,17 +92,24 @@ test.describe("Account linking", () => { .click(); // Expect an error shown that the account cannot be unlinked - await expect(page.getByTestId("alerts")).toBeVisible(); + await expect(page.getByTestId("last-alert")).toContainText( + "You can''t remove last federated identity as you don''t have a password.", + ); }); }); -async function updateProfile(page, firstName, lastName, email) { +async function updateProfile( + page: Page, + firstName: string, + lastName: string, + email: string, +) { await expect( page.getByRole("heading", { name: "Update Account Information" }), ).toBeVisible(); - await page.getByLabel("Email", { exact: true }).fill(email); - await page.getByLabel("First name", { exact: true }).fill(firstName); - await page.getByLabel("Last name", { exact: true }).fill(lastName); + await page.getByLabel("Email").fill(email); + await page.getByLabel("First name").fill(firstName); + await page.getByLabel("Last name").fill(lastName); await page.getByRole("button", { name: "Submit" }).click(); } diff --git a/js/apps/account-ui/test/personal-info/personal-info.spec.ts b/js/apps/account-ui/test/personal-info/personal-info.spec.ts index ed7786d5b9..c3dc5c9e4a 100644 --- a/js/apps/account-ui/test/personal-info/personal-info.spec.ts +++ b/js/apps/account-ui/test/personal-info/personal-info.spec.ts @@ -25,7 +25,7 @@ test.describe("Personal info page", () => { await page.getByTestId("lastName").fill("de Wit"); await page.getByTestId("save").click(); - const alerts = page.getByTestId("alerts"); + const alerts = page.getByTestId("last-alert"); await expect(alerts).toHaveText("Your account has been updated."); }); }); @@ -95,7 +95,7 @@ test.describe("Personal info with userprofile enabled", () => { await page.getByRole("option", { name: "two" }).click(); await page.getByTestId("email2").fill("non-valid"); await page.getByTestId("save").click(); - await expect(page.getByTestId("alerts")).toHaveText( + await expect(page.getByTestId("last-alert")).toHaveText( "Could not update account due to validation errors", ); diff --git a/js/apps/admin-ui/cypress/e2e/clients_saml_advanced.spec.ts b/js/apps/admin-ui/cypress/e2e/clients_saml_advanced.spec.ts index dbca715338..252d5fa8d1 100644 --- a/js/apps/admin-ui/cypress/e2e/clients_saml_advanced.spec.ts +++ b/js/apps/admin-ui/cypress/e2e/clients_saml_advanced.spec.ts @@ -52,7 +52,7 @@ describe("Clients Saml advanced tab", () => { advancedTab.termsOfServiceUrl("not a url").saveFineGrain(); masthead.checkNotificationMessage( - "Client could not be updated: Terms of service URL is not a valid URL", + "Client could not be updated: invalid_input", ); }); }); diff --git a/js/apps/admin-ui/cypress/e2e/clients_saml_test.spec.ts b/js/apps/admin-ui/cypress/e2e/clients_saml_test.spec.ts index 34e545edd2..346843b7b9 100644 --- a/js/apps/admin-ui/cypress/e2e/clients_saml_test.spec.ts +++ b/js/apps/admin-ui/cypress/e2e/clients_saml_test.spec.ts @@ -162,19 +162,16 @@ describe("Clients SAML tests", () => { "http://localhost:8180/realms/master/protocol/" + clientId + "/clients/"; - const rootUrlError = - "Client could not be updated: Root URL is not a valid URL"; - const homeUrlError = - "Client could not be updated: Base URL is not a valid URL"; + const invalidUrlError = "Client could not be updated: invalid_input"; cy.findByTestId("rootUrl").type("Invalid URL"); settingsTab.clickSaveBtn(); - masthead.checkNotificationMessage(rootUrlError); + masthead.checkNotificationMessage(invalidUrlError); cy.findByTestId("rootUrl").clear(); cy.findByTestId("baseUrl").type("Invalid URL"); settingsTab.clickSaveBtn(); - masthead.checkNotificationMessage(homeUrlError); + masthead.checkNotificationMessage(invalidUrlError); cy.findByTestId("baseUrl").clear(); cy.findByTestId("rootUrl").type(validUrl); diff --git a/js/apps/admin-ui/cypress/support/pages/admin-ui/Masthead.ts b/js/apps/admin-ui/cypress/support/pages/admin-ui/Masthead.ts index edfd919e20..f63cb038b9 100644 --- a/js/apps/admin-ui/cypress/support/pages/admin-ui/Masthead.ts +++ b/js/apps/admin-ui/cypress/support/pages/admin-ui/Masthead.ts @@ -2,19 +2,21 @@ import CommonElements from "../CommonElements"; export default class Masthead extends CommonElements { #logoBtn = ".pf-v5-c-page__header-brand-link img"; #helpBtn = "#help"; - #closeAlertMessageBtn = ".pf-v5-c-alert__action button"; - #closeLastAlertMessageBtn = "li:first-child .pf-v5-c-alert__action button"; - #alertMessage = ".pf-v5-c-alert__title"; #userDrpDwn = "#user-dropdown"; #userDrpDwnKebab = "#user-dropdown-kebab"; + #lastAlert = "last-alert"; #globalAlerts = "global-alerts"; #documentationLink = "#link"; #backToAdminConsoleLink = "referrer-link"; #userDrpdwnItem = ".pf-v5-c-menu__item"; - #getAlertsContainer() { - return cy.findByTestId(this.#globalAlerts); + #getLastAlert() { + return cy.findByTestId(this.#lastAlert); + } + + #getAlerts() { + return cy.findAllByTestId(this.#globalAlerts); } checkIsAdminUI() { @@ -95,37 +97,27 @@ export default class Masthead extends CommonElements { } checkNotificationMessage(message: string | RegExp, closeNotification = true) { + const alertElement = this.#getLastAlert(); + if (typeof message === "string") { - this.#getAlertsContainer() - .find(this.#alertMessage) - .should("contain.text", message); - - if (closeNotification) { - this.#getAlertsContainer() - .find(`button[title="` + message.replaceAll('"', '\\"') + `"]`) - .last() - .click({ force: true }); - } + alertElement.should(($el) => expect($el).to.contain.text(message)); } else { - this.#getAlertsContainer() - .find(this.#alertMessage) - .invoke("text") - .should("match", message); + alertElement.should(($el) => expect($el).to.match(message)); + } - if (closeNotification) { - this.#getAlertsContainer().find("button").last().click({ force: true }); - } + if (closeNotification) { + this.#getLastAlert().find("button").last().click({ force: true }); } return this; } closeLastAlertMessage() { - this.#getAlertsContainer().find(this.#closeLastAlertMessageBtn).click(); + this.#getLastAlert().find("button").click(); return this; } closeAllAlertMessages() { - this.#getAlertsContainer().find(this.#closeAlertMessageBtn).click({ + this.#getAlerts().find("button").click({ force: true, multiple: true, }); diff --git a/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/clients/client_details/tabs/SettingsTab.ts b/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/clients/client_details/tabs/SettingsTab.ts index 78dec6bb08..00f7adbba0 100644 --- a/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/clients/client_details/tabs/SettingsTab.ts +++ b/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/clients/client_details/tabs/SettingsTab.ts @@ -222,8 +222,7 @@ export default class SettingsTab extends PageObject { } public assertAccessSettings() { - const redirectUriError = - /Client could not be updated:.*(Master SAML Processing URL is not a valid URL|A redirect URI is not a valid URI).*/i; + const redirectUriError = "Client could not be updated: invalid_input"; cy.findByTestId(this.#idpInitiatedSsoUrlName).click().type("a"); cy.findByTestId(this.#idpInitiatedSsoRelayState).click().type("b"); diff --git a/js/apps/admin-ui/src/App.tsx b/js/apps/admin-ui/src/App.tsx index 3d64f7d8c7..47e0e119d7 100644 --- a/js/apps/admin-ui/src/App.tsx +++ b/js/apps/admin-ui/src/App.tsx @@ -10,7 +10,6 @@ import { Outlet } from "react-router-dom"; import { Header } from "./PageHeader"; import { PageNav } from "./PageNav"; import { AdminClientContext, initAdminClient } from "./admin-client"; -import { AlertProvider } from "./components/alert/Alerts"; import { PageBreadCrumbs } from "./components/bread-crumb/PageBreadCrumbs"; import { ErrorRenderer } from "./components/error/ErrorRenderer"; import { KeycloakSpinner } from "./components/keycloak-spinner/KeycloakSpinner"; @@ -34,9 +33,7 @@ const AppContexts = ({ children }: PropsWithChildren) => ( - - {children} - + {children} diff --git a/js/apps/admin-ui/src/authentication/AuthenticationSection.tsx b/js/apps/admin-ui/src/authentication/AuthenticationSection.tsx index 457027aad9..3a1add0bde 100644 --- a/js/apps/admin-ui/src/authentication/AuthenticationSection.tsx +++ b/js/apps/admin-ui/src/authentication/AuthenticationSection.tsx @@ -1,6 +1,7 @@ import { fetchWithError } from "@keycloak/keycloak-admin-client"; import type AuthenticationFlowRepresentation from "@keycloak/keycloak-admin-client/lib/defs/authenticationFlowRepresentation"; import RealmRepresentation from "@keycloak/keycloak-admin-client/lib/defs/realmRepresentation"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { AlertVariant, Button, @@ -15,8 +16,8 @@ import { sortBy } from "lodash-es"; import { useState } from "react"; import { Trans, useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; + import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { KeycloakSpinner } from "../components/keycloak-spinner/KeycloakSpinner"; import { ListEmptyState } from "../components/list-empty-state/ListEmptyState"; diff --git a/js/apps/admin-ui/src/authentication/BindFlowDialog.tsx b/js/apps/admin-ui/src/authentication/BindFlowDialog.tsx index 53e26d78fa..492f3b254e 100644 --- a/js/apps/admin-ui/src/authentication/BindFlowDialog.tsx +++ b/js/apps/admin-ui/src/authentication/BindFlowDialog.tsx @@ -9,7 +9,7 @@ import { import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { SelectControl } from "@keycloak/keycloak-ui-shared"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useRealm } from "../context/realm-context/RealmContext"; import { REALM_FLOWS } from "./AuthenticationSection"; import { useAdminClient } from "../admin-client"; diff --git a/js/apps/admin-ui/src/authentication/DuplicateFlowModal.tsx b/js/apps/admin-ui/src/authentication/DuplicateFlowModal.tsx index e02195748d..908c0fd65b 100644 --- a/js/apps/admin-ui/src/authentication/DuplicateFlowModal.tsx +++ b/js/apps/admin-ui/src/authentication/DuplicateFlowModal.tsx @@ -12,7 +12,7 @@ import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useRealm } from "../context/realm-context/RealmContext"; import { NameDescription } from "./form/NameDescription"; import { toFlow } from "./routes/Flow"; diff --git a/js/apps/admin-ui/src/authentication/EditFlowModal.tsx b/js/apps/admin-ui/src/authentication/EditFlowModal.tsx index 5ed7ac903a..2049e12dff 100644 --- a/js/apps/admin-ui/src/authentication/EditFlowModal.tsx +++ b/js/apps/admin-ui/src/authentication/EditFlowModal.tsx @@ -1,4 +1,5 @@ import type AuthenticationFlowRepresentation from "@keycloak/keycloak-admin-client/lib/defs/authenticationFlowRepresentation"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { AlertVariant, Button, @@ -10,8 +11,8 @@ import { import { useEffect } from "react"; import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; + import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; import { NameDescription } from "./form/NameDescription"; type EditFlowModalProps = { diff --git a/js/apps/admin-ui/src/authentication/FlowDetails.tsx b/js/apps/admin-ui/src/authentication/FlowDetails.tsx index 0a0b6b5574..63bb29eed3 100644 --- a/js/apps/admin-ui/src/authentication/FlowDetails.tsx +++ b/js/apps/admin-ui/src/authentication/FlowDetails.tsx @@ -22,7 +22,7 @@ import { useState } from "react"; import { Trans, useTranslation } from "react-i18next"; import { useNavigate, useParams } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { ViewHeader } from "../components/view-header/ViewHeader"; import { useRealm } from "../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/authentication/RequiredActions.tsx b/js/apps/admin-ui/src/authentication/RequiredActions.tsx index ec198bbb71..1629d6c734 100644 --- a/js/apps/admin-ui/src/authentication/RequiredActions.tsx +++ b/js/apps/admin-ui/src/authentication/RequiredActions.tsx @@ -5,7 +5,7 @@ import { CogIcon } from "@patternfly/react-icons"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { KeycloakSpinner } from "../components/keycloak-spinner/KeycloakSpinner"; import { addTrailingSlash, toKey } from "../util"; import { useFetch } from "../utils/useFetch"; diff --git a/js/apps/admin-ui/src/authentication/components/ExecutionConfigModal.tsx b/js/apps/admin-ui/src/authentication/components/ExecutionConfigModal.tsx index 83719b9e7b..15d6dd2628 100644 --- a/js/apps/admin-ui/src/authentication/components/ExecutionConfigModal.tsx +++ b/js/apps/admin-ui/src/authentication/components/ExecutionConfigModal.tsx @@ -16,7 +16,7 @@ import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { TextControl } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { DynamicComponents } from "../../components/dynamic/DynamicComponents"; import { convertFormValuesToObject, convertToFormValues } from "../../util"; import { useFetch } from "../../utils/useFetch"; diff --git a/js/apps/admin-ui/src/authentication/components/RequiredActionConfigModal.tsx b/js/apps/admin-ui/src/authentication/components/RequiredActionConfigModal.tsx index f34480d18e..eca5de8dbe 100644 --- a/js/apps/admin-ui/src/authentication/components/RequiredActionConfigModal.tsx +++ b/js/apps/admin-ui/src/authentication/components/RequiredActionConfigModal.tsx @@ -15,7 +15,7 @@ import { useState } from "react"; import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { DynamicComponents } from "../../components/dynamic/DynamicComponents"; import { convertFormValuesToObject, convertToFormValues } from "../../util"; import { useFetch } from "../../utils/useFetch"; diff --git a/js/apps/admin-ui/src/authentication/form/CreateFlow.tsx b/js/apps/admin-ui/src/authentication/form/CreateFlow.tsx index c23550237c..75abd79b88 100644 --- a/js/apps/admin-ui/src/authentication/form/CreateFlow.tsx +++ b/js/apps/admin-ui/src/authentication/form/CreateFlow.tsx @@ -10,7 +10,7 @@ import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { FormSubmitButton, SelectControl } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../../components/form/FormAccess"; import { ViewHeader } from "../../components/view-header/ViewHeader"; import { useRealm } from "../../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/authentication/policies/CibaPolicy.tsx b/js/apps/admin-ui/src/authentication/policies/CibaPolicy.tsx index b31c82245a..659f87f4c4 100644 --- a/js/apps/admin-ui/src/authentication/policies/CibaPolicy.tsx +++ b/js/apps/admin-ui/src/authentication/policies/CibaPolicy.tsx @@ -11,7 +11,7 @@ import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { SelectControl, TextControl } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../../components/form/FormAccess"; import { useRealm } from "../../context/realm-context/RealmContext"; import { convertFormValuesToObject, convertToFormValues } from "../../util"; diff --git a/js/apps/admin-ui/src/authentication/policies/OtpPolicy.tsx b/js/apps/admin-ui/src/authentication/policies/OtpPolicy.tsx index 7798be785c..8eb48dd0ba 100644 --- a/js/apps/admin-ui/src/authentication/policies/OtpPolicy.tsx +++ b/js/apps/admin-ui/src/authentication/policies/OtpPolicy.tsx @@ -20,7 +20,7 @@ import { SwitchControl, } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../../components/form/FormAccess"; import { TimeSelectorControl } from "../../components/time-selector/TimeSelectorControl"; import { useRealm } from "../../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/authentication/policies/PasswordPolicy.tsx b/js/apps/admin-ui/src/authentication/policies/PasswordPolicy.tsx index 28515aac47..e801ec32b8 100644 --- a/js/apps/admin-ui/src/authentication/policies/PasswordPolicy.tsx +++ b/js/apps/admin-ui/src/authentication/policies/PasswordPolicy.tsx @@ -26,7 +26,7 @@ import { useEffect, useMemo, useState } from "react"; import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../../components/form/FormAccess"; import { useRealm } from "../../context/realm-context/RealmContext"; import { useServerInfo } from "../../context/server-info/ServerInfoProvider"; diff --git a/js/apps/admin-ui/src/authentication/policies/WebauthnPolicy.tsx b/js/apps/admin-ui/src/authentication/policies/WebauthnPolicy.tsx index 3ee9bd5f47..67518b70c1 100644 --- a/js/apps/admin-ui/src/authentication/policies/WebauthnPolicy.tsx +++ b/js/apps/admin-ui/src/authentication/policies/WebauthnPolicy.tsx @@ -21,7 +21,7 @@ import { TextControl, useHelp, } from "@keycloak/keycloak-ui-shared"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../../components/form/FormAccess"; import { MultiLineInput } from "../../components/multi-line-input/MultiLineInput"; import { TimeSelectorControl } from "../../components/time-selector/TimeSelectorControl"; diff --git a/js/apps/admin-ui/src/client-scopes/ChangeTypeDropdown.tsx b/js/apps/admin-ui/src/client-scopes/ChangeTypeDropdown.tsx index 2e5c5473df..633cc23fa5 100644 --- a/js/apps/admin-ui/src/client-scopes/ChangeTypeDropdown.tsx +++ b/js/apps/admin-ui/src/client-scopes/ChangeTypeDropdown.tsx @@ -8,7 +8,7 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../admin-client"; import type { Row } from "../clients/scopes/ClientScopes"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { ClientScope, allClientScopeTypes, diff --git a/js/apps/admin-ui/src/client-scopes/ClientScopesSection.tsx b/js/apps/admin-ui/src/client-scopes/ClientScopesSection.tsx index 8cb1784a42..d627391f78 100644 --- a/js/apps/admin-ui/src/client-scopes/ClientScopesSection.tsx +++ b/js/apps/admin-ui/src/client-scopes/ClientScopesSection.tsx @@ -17,7 +17,7 @@ import { Link } from "react-router-dom"; import { useAdminClient } from "../admin-client"; import type { Row } from "../clients/scopes/ClientScopes"; import { getProtocolName } from "../clients/utils"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { AllClientScopeType, AllClientScopes, diff --git a/js/apps/admin-ui/src/client-scopes/CreateClientScope.tsx b/js/apps/admin-ui/src/client-scopes/CreateClientScope.tsx index 569f89bf2b..c9ed3f7a7b 100644 --- a/js/apps/admin-ui/src/client-scopes/CreateClientScope.tsx +++ b/js/apps/admin-ui/src/client-scopes/CreateClientScope.tsx @@ -2,7 +2,7 @@ import { AlertVariant, PageSection } from "@patternfly/react-core"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { ClientScopeDefaultOptionalType, changeScope, diff --git a/js/apps/admin-ui/src/client-scopes/EditClientScope.tsx b/js/apps/admin-ui/src/client-scopes/EditClientScope.tsx index 852ca46bbe..9bdb43650a 100644 --- a/js/apps/admin-ui/src/client-scopes/EditClientScope.tsx +++ b/js/apps/admin-ui/src/client-scopes/EditClientScope.tsx @@ -16,7 +16,7 @@ import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { useHelp } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { AllClientScopes, ClientScope, diff --git a/js/apps/admin-ui/src/client-scopes/details/MappingDetails.tsx b/js/apps/admin-ui/src/client-scopes/details/MappingDetails.tsx index d048daccfd..70008a8b3c 100644 --- a/js/apps/admin-ui/src/client-scopes/details/MappingDetails.tsx +++ b/js/apps/admin-ui/src/client-scopes/details/MappingDetails.tsx @@ -17,7 +17,7 @@ import { Link, useMatch, useNavigate } from "react-router-dom"; import { TextControl } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; import { toDedicatedScope } from "../../clients/routes/DedicatedScopeDetails"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { DynamicComponents } from "../../components/dynamic/DynamicComponents"; import { FormAccess } from "../../components/form/FormAccess"; diff --git a/js/apps/admin-ui/src/clients/AdvancedTab.tsx b/js/apps/admin-ui/src/clients/AdvancedTab.tsx index 78d37f2730..9bed9ff867 100644 --- a/js/apps/admin-ui/src/clients/AdvancedTab.tsx +++ b/js/apps/admin-ui/src/clients/AdvancedTab.tsx @@ -5,7 +5,7 @@ import type { TFunction } from "i18next"; import { useFormContext } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { ScrollForm } from "@keycloak/keycloak-ui-shared"; -import type { AddAlertFunction } from "../components/alert/Alerts"; +import type { AddAlertFunction } from "@keycloak/keycloak-ui-shared"; import { convertAttributeNameToForm, toUpperCase } from "../util"; import type { FormFields, SaveOptions } from "./ClientDetails"; import { AdvancedSettings } from "./advanced/AdvancedSettings"; diff --git a/js/apps/admin-ui/src/clients/ClientDetails.tsx b/js/apps/admin-ui/src/clients/ClientDetails.tsx index cc5b7f856e..c8b5545954 100644 --- a/js/apps/admin-ui/src/clients/ClientDetails.tsx +++ b/js/apps/admin-ui/src/clients/ClientDetails.tsx @@ -17,7 +17,7 @@ import { Controller, FormProvider, useForm, useWatch } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { ConfirmDialogModal, useConfirmDialog, diff --git a/js/apps/admin-ui/src/clients/ClientsSection.tsx b/js/apps/admin-ui/src/clients/ClientsSection.tsx index 49ebfef473..4639c15444 100644 --- a/js/apps/admin-ui/src/clients/ClientsSection.tsx +++ b/js/apps/admin-ui/src/clients/ClientsSection.tsx @@ -23,7 +23,7 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { FormattedLink } from "../components/external-link/FormattedLink"; import { diff --git a/js/apps/admin-ui/src/clients/add/NewClientForm.tsx b/js/apps/admin-ui/src/clients/add/NewClientForm.tsx index 613a1277e5..d918c62db0 100644 --- a/js/apps/admin-ui/src/clients/add/NewClientForm.tsx +++ b/js/apps/admin-ui/src/clients/add/NewClientForm.tsx @@ -10,7 +10,7 @@ import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../../components/form/FormAccess"; import { ViewHeader } from "../../components/view-header/ViewHeader"; import { useRealm } from "../../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/clients/advanced/AddHostDialog.tsx b/js/apps/admin-ui/src/clients/advanced/AddHostDialog.tsx index d7bddbc0d6..c37af3a0fc 100644 --- a/js/apps/admin-ui/src/clients/advanced/AddHostDialog.tsx +++ b/js/apps/admin-ui/src/clients/advanced/AddHostDialog.tsx @@ -9,7 +9,7 @@ import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { TextControl } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; type FormFields = { node: string; diff --git a/js/apps/admin-ui/src/clients/advanced/ClusteringPanel.tsx b/js/apps/admin-ui/src/clients/advanced/ClusteringPanel.tsx index 4461bb63b8..dbab055775 100644 --- a/js/apps/admin-ui/src/clients/advanced/ClusteringPanel.tsx +++ b/js/apps/admin-ui/src/clients/advanced/ClusteringPanel.tsx @@ -12,7 +12,7 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { HelpItem } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { FormAccess } from "../../components/form/FormAccess"; import { ListEmptyState } from "../../components/list-empty-state/ListEmptyState"; diff --git a/js/apps/admin-ui/src/clients/authorization/AuthorizationEvaluate.tsx b/js/apps/admin-ui/src/clients/authorization/AuthorizationEvaluate.tsx index c43fb811ec..1c764632a7 100644 --- a/js/apps/admin-ui/src/clients/authorization/AuthorizationEvaluate.tsx +++ b/js/apps/admin-ui/src/clients/authorization/AuthorizationEvaluate.tsx @@ -27,7 +27,7 @@ import { FormProvider, useForm, useWatch } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { ForbiddenSection } from "../../ForbiddenSection"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { ClientSelect } from "../../components/client/ClientSelect"; import { FormAccess } from "../../components/form/FormAccess"; import { diff --git a/js/apps/admin-ui/src/clients/authorization/AuthorizationExport.tsx b/js/apps/admin-ui/src/clients/authorization/AuthorizationExport.tsx index 80e259516a..0a17f2ff63 100644 --- a/js/apps/admin-ui/src/clients/authorization/AuthorizationExport.tsx +++ b/js/apps/admin-ui/src/clients/authorization/AuthorizationExport.tsx @@ -10,7 +10,7 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { TextAreaControl } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../../components/form/FormAccess"; import { KeycloakSpinner } from "../../components/keycloak-spinner/KeycloakSpinner"; import { prettyPrintJSON } from "../../util"; diff --git a/js/apps/admin-ui/src/clients/authorization/DeleteScopeDialog.tsx b/js/apps/admin-ui/src/clients/authorization/DeleteScopeDialog.tsx index 6eec82659d..13d59dc864 100644 --- a/js/apps/admin-ui/src/clients/authorization/DeleteScopeDialog.tsx +++ b/js/apps/admin-ui/src/clients/authorization/DeleteScopeDialog.tsx @@ -2,7 +2,7 @@ import type ScopeRepresentation from "@keycloak/keycloak-admin-client/lib/defs/s import { Alert, AlertVariant } from "@patternfly/react-core"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { ConfirmDialogModal } from "../../components/confirm-dialog/ConfirmDialog"; import type { PermissionScopeRepresentation } from "./Scopes"; diff --git a/js/apps/admin-ui/src/clients/authorization/PermissionDetails.tsx b/js/apps/admin-ui/src/clients/authorization/PermissionDetails.tsx index f17d47b375..7a5347d84e 100644 --- a/js/apps/admin-ui/src/clients/authorization/PermissionDetails.tsx +++ b/js/apps/admin-ui/src/clients/authorization/PermissionDetails.tsx @@ -23,7 +23,7 @@ import { Controller, FormProvider, useForm, useWatch } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { FormAccess } from "../../components/form/FormAccess"; import { KeycloakSpinner } from "../../components/keycloak-spinner/KeycloakSpinner"; diff --git a/js/apps/admin-ui/src/clients/authorization/Permissions.tsx b/js/apps/admin-ui/src/clients/authorization/Permissions.tsx index 2c6a56b9fe..d574aafa23 100644 --- a/js/apps/admin-ui/src/clients/authorization/Permissions.tsx +++ b/js/apps/admin-ui/src/clients/authorization/Permissions.tsx @@ -26,7 +26,7 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { KeycloakSpinner } from "../../components/keycloak-spinner/KeycloakSpinner"; import { ListEmptyState } from "../../components/list-empty-state/ListEmptyState"; diff --git a/js/apps/admin-ui/src/clients/authorization/Policies.tsx b/js/apps/admin-ui/src/clients/authorization/Policies.tsx index 3d73b0b263..a0e1ade57f 100644 --- a/js/apps/admin-ui/src/clients/authorization/Policies.tsx +++ b/js/apps/admin-ui/src/clients/authorization/Policies.tsx @@ -21,7 +21,7 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { KeycloakSpinner } from "../../components/keycloak-spinner/KeycloakSpinner"; import { ListEmptyState } from "../../components/list-empty-state/ListEmptyState"; diff --git a/js/apps/admin-ui/src/clients/authorization/ResourceDetails.tsx b/js/apps/admin-ui/src/clients/authorization/ResourceDetails.tsx index 2e5891df73..dc3b749a3d 100644 --- a/js/apps/admin-ui/src/clients/authorization/ResourceDetails.tsx +++ b/js/apps/admin-ui/src/clients/authorization/ResourceDetails.tsx @@ -18,7 +18,7 @@ import { Link, useNavigate } from "react-router-dom"; import { HelpItem, TextControl } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; import { DefaultSwitchControl } from "../../components/SwitchControl"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { FormAccess } from "../../components/form/FormAccess"; import { KeyValueInput } from "../../components/key-value-form/KeyValueInput"; diff --git a/js/apps/admin-ui/src/clients/authorization/Resources.tsx b/js/apps/admin-ui/src/clients/authorization/Resources.tsx index 09cf169c8c..0a1c6b6102 100644 --- a/js/apps/admin-ui/src/clients/authorization/Resources.tsx +++ b/js/apps/admin-ui/src/clients/authorization/Resources.tsx @@ -20,7 +20,7 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { KeycloakSpinner } from "../../components/keycloak-spinner/KeycloakSpinner"; import { ListEmptyState } from "../../components/list-empty-state/ListEmptyState"; diff --git a/js/apps/admin-ui/src/clients/authorization/ScopeDetails.tsx b/js/apps/admin-ui/src/clients/authorization/ScopeDetails.tsx index 3efca93bb7..d781a6d60c 100644 --- a/js/apps/admin-ui/src/clients/authorization/ScopeDetails.tsx +++ b/js/apps/admin-ui/src/clients/authorization/ScopeDetails.tsx @@ -13,7 +13,7 @@ import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { TextControl } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../../components/form/FormAccess"; import { ViewHeader } from "../../components/view-header/ViewHeader"; import { useFetch } from "../../utils/useFetch"; diff --git a/js/apps/admin-ui/src/clients/authorization/Settings.tsx b/js/apps/admin-ui/src/clients/authorization/Settings.tsx index 8f252f5f17..ebf7b00364 100644 --- a/js/apps/admin-ui/src/clients/authorization/Settings.tsx +++ b/js/apps/admin-ui/src/clients/authorization/Settings.tsx @@ -13,7 +13,7 @@ import { useTranslation } from "react-i18next"; import { HelpItem } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; import { DefaultSwitchControl } from "../../components/SwitchControl"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FixedButtonsGroup } from "../../components/form/FixedButtonGroup"; import { FormAccess } from "../../components/form/FormAccess"; import { KeycloakSpinner } from "../../components/keycloak-spinner/KeycloakSpinner"; diff --git a/js/apps/admin-ui/src/clients/authorization/policy/PolicyDetails.tsx b/js/apps/admin-ui/src/clients/authorization/policy/PolicyDetails.tsx index eea047ff5b..b11a4f79e1 100644 --- a/js/apps/admin-ui/src/clients/authorization/policy/PolicyDetails.tsx +++ b/js/apps/admin-ui/src/clients/authorization/policy/PolicyDetails.tsx @@ -12,7 +12,7 @@ import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { useAdminClient } from "../../../admin-client"; -import { useAlerts } from "../../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../../components/confirm-dialog/ConfirmDialog"; import { FormAccess } from "../../../components/form/FormAccess"; import { KeycloakSpinner } from "../../../components/keycloak-spinner/KeycloakSpinner"; diff --git a/js/apps/admin-ui/src/clients/credentials/ClientSecret.tsx b/js/apps/admin-ui/src/clients/credentials/ClientSecret.tsx index d25142ff0d..76511d9f01 100644 --- a/js/apps/admin-ui/src/clients/credentials/ClientSecret.tsx +++ b/js/apps/admin-ui/src/clients/credentials/ClientSecret.tsx @@ -13,7 +13,7 @@ import { useFormContext } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { PasswordInput } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { useAccess } from "../../context/access/Access"; import useFormatDate from "../../utils/useFormatDate"; diff --git a/js/apps/admin-ui/src/clients/credentials/Credentials.tsx b/js/apps/admin-ui/src/clients/credentials/Credentials.tsx index 3fe9b2ad01..3e9fc10b2a 100644 --- a/js/apps/admin-ui/src/clients/credentials/Credentials.tsx +++ b/js/apps/admin-ui/src/clients/credentials/Credentials.tsx @@ -20,7 +20,7 @@ import { useFormContext, useWatch } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { HelpItem, SelectControl } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { FormAccess } from "../../components/form/FormAccess"; import { useFetch } from "../../utils/useFetch"; diff --git a/js/apps/admin-ui/src/clients/import/ImportForm.tsx b/js/apps/admin-ui/src/clients/import/ImportForm.tsx index 3ecdcab72e..424324aea0 100644 --- a/js/apps/admin-ui/src/clients/import/ImportForm.tsx +++ b/js/apps/admin-ui/src/clients/import/ImportForm.tsx @@ -13,7 +13,7 @@ import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { FormSubmitButton, TextControl } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../../components/form/FormAccess"; import { FileUploadForm } from "../../components/json-file-upload/FileUploadForm"; import { ViewHeader } from "../../components/view-header/ViewHeader"; diff --git a/js/apps/admin-ui/src/clients/initial-access/CreateInitialAccessToken.tsx b/js/apps/admin-ui/src/clients/initial-access/CreateInitialAccessToken.tsx index 1fe3b80b75..b37ed88725 100644 --- a/js/apps/admin-ui/src/clients/initial-access/CreateInitialAccessToken.tsx +++ b/js/apps/admin-ui/src/clients/initial-access/CreateInitialAccessToken.tsx @@ -11,7 +11,7 @@ import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { NumberControl } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../../components/form/FormAccess"; import { TimeSelectorControl } from "../../components/time-selector/TimeSelectorControl"; import { ViewHeader } from "../../components/view-header/ViewHeader"; diff --git a/js/apps/admin-ui/src/clients/initial-access/InitialAccessTokenList.tsx b/js/apps/admin-ui/src/clients/initial-access/InitialAccessTokenList.tsx index 2589fafd59..c8c3d0db06 100644 --- a/js/apps/admin-ui/src/clients/initial-access/InitialAccessTokenList.tsx +++ b/js/apps/admin-ui/src/clients/initial-access/InitialAccessTokenList.tsx @@ -5,7 +5,7 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { ListEmptyState } from "../../components/list-empty-state/ListEmptyState"; import { diff --git a/js/apps/admin-ui/src/clients/keys/ExportSamlKeyDialog.tsx b/js/apps/admin-ui/src/clients/keys/ExportSamlKeyDialog.tsx index 121b3b41f1..936976fd4c 100644 --- a/js/apps/admin-ui/src/clients/keys/ExportSamlKeyDialog.tsx +++ b/js/apps/admin-ui/src/clients/keys/ExportSamlKeyDialog.tsx @@ -4,7 +4,7 @@ import { saveAs } from "file-saver"; import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useRealm } from "../../context/realm-context/RealmContext"; import { KeyForm, getFileExtension } from "./GenerateKeyDialog"; import { KeyTypes } from "./SamlKeys"; diff --git a/js/apps/admin-ui/src/clients/keys/Keys.tsx b/js/apps/admin-ui/src/clients/keys/Keys.tsx index 0d098f6ddb..dded45d767 100644 --- a/js/apps/admin-ui/src/clients/keys/Keys.tsx +++ b/js/apps/admin-ui/src/clients/keys/Keys.tsx @@ -19,7 +19,7 @@ import { useTranslation } from "react-i18next"; import { TextControl } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; import { DefaultSwitchControl } from "../../components/SwitchControl"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../../components/form/FormAccess"; import { convertAttributeNameToForm } from "../../util"; import { useFetch } from "../../utils/useFetch"; diff --git a/js/apps/admin-ui/src/clients/keys/SamlImportKeyDialog.tsx b/js/apps/admin-ui/src/clients/keys/SamlImportKeyDialog.tsx index 52b7f43522..d441f28d42 100644 --- a/js/apps/admin-ui/src/clients/keys/SamlImportKeyDialog.tsx +++ b/js/apps/admin-ui/src/clients/keys/SamlImportKeyDialog.tsx @@ -2,7 +2,7 @@ import { AlertVariant } from "@patternfly/react-core"; import { FormProvider, useFormContext } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { ConfirmDialogModal } from "../../components/confirm-dialog/ConfirmDialog"; import { KeyForm } from "./GenerateKeyDialog"; import type { KeyTypes } from "./SamlKeys"; diff --git a/js/apps/admin-ui/src/clients/keys/SamlKeys.tsx b/js/apps/admin-ui/src/clients/keys/SamlKeys.tsx index 023f762cf6..8f0adb19a1 100644 --- a/js/apps/admin-ui/src/clients/keys/SamlKeys.tsx +++ b/js/apps/admin-ui/src/clients/keys/SamlKeys.tsx @@ -18,7 +18,7 @@ import { Controller, useFormContext } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { FormPanel, HelpItem } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { FormAccess } from "../../components/form/FormAccess"; import { convertAttributeNameToForm } from "../../util"; diff --git a/js/apps/admin-ui/src/clients/keys/SamlKeysDialog.tsx b/js/apps/admin-ui/src/clients/keys/SamlKeysDialog.tsx index 4fc209bac3..06dcf41a01 100644 --- a/js/apps/admin-ui/src/clients/keys/SamlKeysDialog.tsx +++ b/js/apps/admin-ui/src/clients/keys/SamlKeysDialog.tsx @@ -24,7 +24,7 @@ import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { HelpItem } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { Certificate } from "./Certificate"; import { KeyForm } from "./GenerateKeyDialog"; import type { KeyTypes } from "./SamlKeys"; diff --git a/js/apps/admin-ui/src/clients/registration/ClientRegistrationList.tsx b/js/apps/admin-ui/src/clients/registration/ClientRegistrationList.tsx index 1b4517f337..1eb0e91e78 100644 --- a/js/apps/admin-ui/src/clients/registration/ClientRegistrationList.tsx +++ b/js/apps/admin-ui/src/clients/registration/ClientRegistrationList.tsx @@ -4,7 +4,7 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link, useNavigate, useParams } from "react-router-dom"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { Action, diff --git a/js/apps/admin-ui/src/clients/registration/DetailProvider.tsx b/js/apps/admin-ui/src/clients/registration/DetailProvider.tsx index 76948a2eeb..e519bc8aea 100644 --- a/js/apps/admin-ui/src/clients/registration/DetailProvider.tsx +++ b/js/apps/admin-ui/src/clients/registration/DetailProvider.tsx @@ -13,7 +13,7 @@ import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { TextControl } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { DynamicComponents } from "../../components/dynamic/DynamicComponents"; import { FormAccess } from "../../components/form/FormAccess"; diff --git a/js/apps/admin-ui/src/clients/roles/CreateClientRole.tsx b/js/apps/admin-ui/src/clients/roles/CreateClientRole.tsx index 7fb7018dd1..cd013c9cc4 100644 --- a/js/apps/admin-ui/src/clients/roles/CreateClientRole.tsx +++ b/js/apps/admin-ui/src/clients/roles/CreateClientRole.tsx @@ -4,7 +4,7 @@ import { FormProvider, SubmitHandler, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useNavigate, useParams } from "react-router-dom"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { AttributeForm } from "../../components/key-value-form/AttributeForm"; import { RoleForm } from "../../components/role-form/RoleForm"; import { useRealm } from "../../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/clients/scopes/ClientScopes.tsx b/js/apps/admin-ui/src/clients/scopes/ClientScopes.tsx index 26de429095..147a5575d7 100644 --- a/js/apps/admin-ui/src/clients/scopes/ClientScopes.tsx +++ b/js/apps/admin-ui/src/clients/scopes/ClientScopes.tsx @@ -22,7 +22,7 @@ import { nameFilter, typeFilter, } from "../../client-scopes/details/SearchFilter"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { AllClientScopeType, AllClientScopes, diff --git a/js/apps/admin-ui/src/clients/scopes/CopyToClipboardButton.tsx b/js/apps/admin-ui/src/clients/scopes/CopyToClipboardButton.tsx index 8d03cd5446..1d6bb29bed 100644 --- a/js/apps/admin-ui/src/clients/scopes/CopyToClipboardButton.tsx +++ b/js/apps/admin-ui/src/clients/scopes/CopyToClipboardButton.tsx @@ -1,11 +1,11 @@ -import { useEffect, useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; +import { useSetTimeout } from "@keycloak/keycloak-ui-shared"; import { ClipboardCopyButton, ClipboardCopyButtonProps, } from "@patternfly/react-core"; +import { useEffect, useMemo, useState } from "react"; +import { useTranslation } from "react-i18next"; -import useSetTimeout from "../../utils/useSetTimeout"; import useQueryPermission from "../../utils/useQueryPermission"; enum CopyState { diff --git a/js/apps/admin-ui/src/clients/scopes/DedicatedScope.tsx b/js/apps/admin-ui/src/clients/scopes/DedicatedScope.tsx index 55b066e54b..04a244a586 100644 --- a/js/apps/admin-ui/src/clients/scopes/DedicatedScope.tsx +++ b/js/apps/admin-ui/src/clients/scopes/DedicatedScope.tsx @@ -11,7 +11,7 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { HelpItem } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../../components/form/FormAccess"; import { RoleMapping, Row } from "../../components/role-mapping/RoleMapping"; import { useAccess } from "../../context/access/Access"; diff --git a/js/apps/admin-ui/src/clients/scopes/DedicatedScopes.tsx b/js/apps/admin-ui/src/clients/scopes/DedicatedScopes.tsx index 2ab59822c2..f0343eded0 100644 --- a/js/apps/admin-ui/src/clients/scopes/DedicatedScopes.tsx +++ b/js/apps/admin-ui/src/clients/scopes/DedicatedScopes.tsx @@ -12,7 +12,7 @@ import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { useAdminClient } from "../../admin-client"; import { MapperList } from "../../client-scopes/details/MapperList"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { KeycloakSpinner } from "../../components/keycloak-spinner/KeycloakSpinner"; import { RoutableTabs, diff --git a/js/apps/admin-ui/src/clients/service-account/ServiceAccount.tsx b/js/apps/admin-ui/src/clients/service-account/ServiceAccount.tsx index ac4a25da1c..e4e5914b99 100644 --- a/js/apps/admin-ui/src/clients/service-account/ServiceAccount.tsx +++ b/js/apps/admin-ui/src/clients/service-account/ServiceAccount.tsx @@ -7,7 +7,7 @@ import { useState } from "react"; import { Trans, useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { KeycloakSpinner } from "../../components/keycloak-spinner/KeycloakSpinner"; import { RoleMapping, Row } from "../../components/role-mapping/RoleMapping"; import { useAccess } from "../../context/access/Access"; diff --git a/js/apps/admin-ui/src/components/alert/Alerts.tsx b/js/apps/admin-ui/src/components/alert/Alerts.tsx deleted file mode 100644 index c36442d1bb..0000000000 --- a/js/apps/admin-ui/src/components/alert/Alerts.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import { NetworkError } from "@keycloak/keycloak-admin-client"; -import { AlertVariant } from "@patternfly/react-core"; -import { PropsWithChildren, useCallback, useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { generateId } from "../../util"; - -import { - createNamedContext, - useRequiredContext, -} from "@keycloak/keycloak-ui-shared"; -import useSetTimeout from "../../utils/useSetTimeout"; -import { AlertPanel } from "./AlertPanel"; - -const ALERT_TIMEOUT = 8000; - -export type AddAlertFunction = ( - message: string, - variant?: AlertVariant, - description?: string, -) => void; - -export type AddErrorFunction = (message: string, error: unknown) => void; - -export type AlertProps = { - addAlert: AddAlertFunction; - addError: AddErrorFunction; -}; - -export const AlertContext = createNamedContext( - "AlertContext", - undefined, -); - -export const useAlerts = () => useRequiredContext(AlertContext); - -export type AlertEntry = { - id: number; - message: string; - variant: AlertVariant; - description?: string; -}; - -export const AlertProvider = ({ children }: PropsWithChildren) => { - const { t } = useTranslation(); - const setTimeout = useSetTimeout(); - const [alerts, setAlerts] = useState([]); - - const removeAlert = (id: number) => - setAlerts((alerts) => alerts.filter((alert) => alert.id !== id)); - - const addAlert = useCallback( - (message, variant = AlertVariant.success, description) => { - const alert: AlertEntry = { - id: generateId(), - message, - variant, - description, - }; - - setAlerts((alerts) => [alert, ...alerts]); - setTimeout(() => removeAlert(alert.id), ALERT_TIMEOUT); - }, - [], - ); - - const addError = useCallback((message, error) => { - addAlert( - t(message, { - error: getErrorMessage(error), - }), - AlertVariant.danger, - ); - }, []); - - const value = useMemo(() => ({ addAlert, addError }), []); - - return ( - - - {children} - - ); -}; - -function getErrorMessage(error: unknown) { - if (typeof error === "string") { - return error; - } - - if (error instanceof NetworkError) { - return getNetworkErrorMessage(error); - } - - if (error instanceof Error) { - return error.message; - } - - throw new Error("Unable to determine error message."); -} - -function getNetworkErrorMessage({ responseData }: NetworkError) { - const data = responseData as Record; - - for (const key of ["error_description", "errorMessage", "error"]) { - const value = data[key]; - - if (typeof value === "string") { - return value; - } - } -} diff --git a/js/apps/admin-ui/src/components/dynamic/MapComponent.tsx b/js/apps/admin-ui/src/components/dynamic/MapComponent.tsx index d10868ec74..f4c5bb0989 100644 --- a/js/apps/admin-ui/src/components/dynamic/MapComponent.tsx +++ b/js/apps/admin-ui/src/components/dynamic/MapComponent.tsx @@ -1,25 +1,24 @@ +import { HelpItem, generateId } from "@keycloak/keycloak-ui-shared"; import { ActionList, ActionListItem, Button, EmptyState, EmptyStateBody, + EmptyStateFooter, Flex, FlexItem, FormGroup, TextInput, - EmptyStateFooter, } from "@patternfly/react-core"; import { MinusCircleIcon, PlusCircleIcon } from "@patternfly/react-icons"; import { useEffect, useState } from "react"; import { useFormContext } from "react-hook-form"; import { useTranslation } from "react-i18next"; -import { generateId } from "../../util"; -import { HelpItem } from "@keycloak/keycloak-ui-shared"; import { KeyValueType } from "../key-value-form/key-value-convert"; -import type { ComponentProps } from "./components"; import { convertToName } from "./DynamicComponents"; +import type { ComponentProps } from "./components"; type IdKeyValueType = KeyValueType & { id: number; diff --git a/js/apps/admin-ui/src/components/role-mapping/RoleMapping.tsx b/js/apps/admin-ui/src/components/role-mapping/RoleMapping.tsx index 22743412e6..ba60753b93 100644 --- a/js/apps/admin-ui/src/components/role-mapping/RoleMapping.tsx +++ b/js/apps/admin-ui/src/components/role-mapping/RoleMapping.tsx @@ -14,7 +14,7 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../../admin-client"; import { emptyFormatter, upperCaseFormatter } from "../../util"; -import { useAlerts } from "../alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../confirm-dialog/ConfirmDialog"; import { ListEmptyState } from "../list-empty-state/ListEmptyState"; import { Action, KeycloakDataTable } from "../table-toolbar/KeycloakDataTable"; diff --git a/js/apps/admin-ui/src/components/roles-list/RolesList.tsx b/js/apps/admin-ui/src/components/roles-list/RolesList.tsx index d78eff0250..e0181c289d 100644 --- a/js/apps/admin-ui/src/components/roles-list/RolesList.tsx +++ b/js/apps/admin-ui/src/components/roles-list/RolesList.tsx @@ -9,7 +9,7 @@ import { translationFormatter } from "../../clients/ClientsSection"; import { useRealm } from "../../context/realm-context/RealmContext"; import { toRealmSettings } from "../../realm-settings/routes/RealmSettings"; import { emptyFormatter, upperCaseFormatter } from "../../util"; -import { useAlerts } from "../alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../confirm-dialog/ConfirmDialog"; import { ListEmptyState } from "../list-empty-state/ListEmptyState"; import { Action, KeycloakDataTable } from "../table-toolbar/KeycloakDataTable"; diff --git a/js/apps/admin-ui/src/components/users/UserDataTable.tsx b/js/apps/admin-ui/src/components/users/UserDataTable.tsx index d6109cd447..cf0404c965 100644 --- a/js/apps/admin-ui/src/components/users/UserDataTable.tsx +++ b/js/apps/admin-ui/src/components/users/UserDataTable.tsx @@ -33,7 +33,7 @@ import { toAddUser } from "../../user/routes/AddUser"; import { toUser } from "../../user/routes/User"; import { emptyFormatter } from "../../util"; import { useFetch } from "../../utils/useFetch"; -import { useAlerts } from "../alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../confirm-dialog/ConfirmDialog"; import { KeycloakSpinner } from "../keycloak-spinner/KeycloakSpinner"; import { ListEmptyState } from "../list-empty-state/ListEmptyState"; diff --git a/js/apps/admin-ui/src/components/users/UserDataTableAttributeSearchForm.tsx b/js/apps/admin-ui/src/components/users/UserDataTableAttributeSearchForm.tsx index 3761bda28e..d2cdeb08ba 100644 --- a/js/apps/admin-ui/src/components/users/UserDataTableAttributeSearchForm.tsx +++ b/js/apps/admin-ui/src/components/users/UserDataTableAttributeSearchForm.tsx @@ -23,7 +23,7 @@ import { ReactNode, useState } from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { Form } from "react-router-dom"; -import { useAlerts } from "../alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { UserAttribute } from "./UserDataTable"; type UserDataTableAttributeSearchFormProps = { diff --git a/js/apps/admin-ui/src/groups/GroupAttributes.tsx b/js/apps/admin-ui/src/groups/GroupAttributes.tsx index a0e4c2bcd9..5c84bb4019 100644 --- a/js/apps/admin-ui/src/groups/GroupAttributes.tsx +++ b/js/apps/admin-ui/src/groups/GroupAttributes.tsx @@ -9,7 +9,7 @@ import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useLocation } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { AttributeForm, AttributesForm, diff --git a/js/apps/admin-ui/src/groups/GroupRoleMapping.tsx b/js/apps/admin-ui/src/groups/GroupRoleMapping.tsx index 80ba78f9d0..ffbde1c962 100644 --- a/js/apps/admin-ui/src/groups/GroupRoleMapping.tsx +++ b/js/apps/admin-ui/src/groups/GroupRoleMapping.tsx @@ -2,7 +2,7 @@ import type { RoleMappingPayload } from "@keycloak/keycloak-admin-client/lib/def import { AlertVariant } from "@patternfly/react-core"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { RoleMapping, Row } from "../components/role-mapping/RoleMapping"; type GroupRoleMappingProps = { diff --git a/js/apps/admin-ui/src/groups/GroupsModal.tsx b/js/apps/admin-ui/src/groups/GroupsModal.tsx index 3278d6f4d8..b74e614f10 100644 --- a/js/apps/admin-ui/src/groups/GroupsModal.tsx +++ b/js/apps/admin-ui/src/groups/GroupsModal.tsx @@ -11,7 +11,7 @@ import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { FormSubmitButton, TextControl } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; type GroupsModalProps = { id?: string; diff --git a/js/apps/admin-ui/src/groups/Members.tsx b/js/apps/admin-ui/src/groups/Members.tsx index 84a2a1443c..ec9c97de0f 100644 --- a/js/apps/admin-ui/src/groups/Members.tsx +++ b/js/apps/admin-ui/src/groups/Members.tsx @@ -16,7 +16,7 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link, useLocation } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { GroupPath } from "../components/group/GroupPath"; import { KeycloakSpinner } from "../components/keycloak-spinner/KeycloakSpinner"; import { ListEmptyState } from "../components/list-empty-state/ListEmptyState"; diff --git a/js/apps/admin-ui/src/groups/MembersModal.tsx b/js/apps/admin-ui/src/groups/MembersModal.tsx index 1fb8cf34c9..2c53c7c813 100644 --- a/js/apps/admin-ui/src/groups/MembersModal.tsx +++ b/js/apps/admin-ui/src/groups/MembersModal.tsx @@ -4,7 +4,7 @@ import { differenceBy } from "lodash-es"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { ListEmptyState } from "../components/list-empty-state/ListEmptyState"; import { KeycloakDataTable } from "../components/table-toolbar/KeycloakDataTable"; import { emptyFormatter } from "../util"; diff --git a/js/apps/admin-ui/src/groups/components/DeleteGroup.tsx b/js/apps/admin-ui/src/groups/components/DeleteGroup.tsx index 20de96b7cc..13f71cda39 100644 --- a/js/apps/admin-ui/src/groups/components/DeleteGroup.tsx +++ b/js/apps/admin-ui/src/groups/components/DeleteGroup.tsx @@ -2,7 +2,7 @@ import type GroupRepresentation from "@keycloak/keycloak-admin-client/lib/defs/g import { ButtonVariant } from "@patternfly/react-core"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { ConfirmDialogModal } from "../../components/confirm-dialog/ConfirmDialog"; type DeleteConfirmProps = { diff --git a/js/apps/admin-ui/src/groups/components/GroupTree.tsx b/js/apps/admin-ui/src/groups/components/GroupTree.tsx index 7d8e0ac40b..c22a4c433b 100644 --- a/js/apps/admin-ui/src/groups/components/GroupTree.tsx +++ b/js/apps/admin-ui/src/groups/components/GroupTree.tsx @@ -22,7 +22,7 @@ import { useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { KeycloakSpinner } from "../../components/keycloak-spinner/KeycloakSpinner"; import { PaginatingTableToolbar } from "../../components/table-toolbar/PaginatingTableToolbar"; import { useAccess } from "../../context/access/Access"; diff --git a/js/apps/admin-ui/src/groups/components/MoveDialog.tsx b/js/apps/admin-ui/src/groups/components/MoveDialog.tsx index 596dfc5df1..3b62ca4beb 100644 --- a/js/apps/admin-ui/src/groups/components/MoveDialog.tsx +++ b/js/apps/admin-ui/src/groups/components/MoveDialog.tsx @@ -2,7 +2,7 @@ import type KeycloakAdminClient from "@keycloak/keycloak-admin-client"; import type GroupRepresentation from "@keycloak/keycloak-admin-client/lib/defs/groupRepresentation"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { GroupPickerDialog } from "../../components/group/GroupPickerDialog"; type MoveDialogProps = { diff --git a/js/apps/admin-ui/src/identity-providers/IdentityProvidersSection.tsx b/js/apps/admin-ui/src/identity-providers/IdentityProvidersSection.tsx index 0f764e3189..8496b3231e 100644 --- a/js/apps/admin-ui/src/identity-providers/IdentityProvidersSection.tsx +++ b/js/apps/admin-ui/src/identity-providers/IdentityProvidersSection.tsx @@ -26,7 +26,7 @@ import { Fragment, useState } from "react"; import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { ClickableCard } from "../components/keycloak-card/ClickableCard"; import { diff --git a/js/apps/admin-ui/src/identity-providers/ManageOrderDialog.tsx b/js/apps/admin-ui/src/identity-providers/ManageOrderDialog.tsx index deec48b566..48505bd80f 100644 --- a/js/apps/admin-ui/src/identity-providers/ManageOrderDialog.tsx +++ b/js/apps/admin-ui/src/identity-providers/ManageOrderDialog.tsx @@ -22,7 +22,7 @@ import { sortBy } from "lodash-es"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { KeycloakSpinner } from "../components/keycloak-spinner/KeycloakSpinner"; import { useFetch } from "../utils/useFetch"; diff --git a/js/apps/admin-ui/src/identity-providers/add/AddIdentityProvider.tsx b/js/apps/admin-ui/src/identity-providers/add/AddIdentityProvider.tsx index 2762ee66df..0e90c53bdd 100644 --- a/js/apps/admin-ui/src/identity-providers/add/AddIdentityProvider.tsx +++ b/js/apps/admin-ui/src/identity-providers/add/AddIdentityProvider.tsx @@ -10,7 +10,7 @@ import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { DynamicComponents } from "../../components/dynamic/DynamicComponents"; import { FormAccess } from "../../components/form/FormAccess"; import { ViewHeader } from "../../components/view-header/ViewHeader"; diff --git a/js/apps/admin-ui/src/identity-providers/add/AddMapper.tsx b/js/apps/admin-ui/src/identity-providers/add/AddMapper.tsx index 99f0528bef..4e6d1ef372 100644 --- a/js/apps/admin-ui/src/identity-providers/add/AddMapper.tsx +++ b/js/apps/admin-ui/src/identity-providers/add/AddMapper.tsx @@ -15,7 +15,7 @@ import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { TextControl } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { DynamicComponents } from "../../components/dynamic/DynamicComponents"; import { FormAccess } from "../../components/form/FormAccess"; diff --git a/js/apps/admin-ui/src/identity-providers/add/AddOpenIdConnect.tsx b/js/apps/admin-ui/src/identity-providers/add/AddOpenIdConnect.tsx index ad83cebb63..5d1c0922f8 100644 --- a/js/apps/admin-ui/src/identity-providers/add/AddOpenIdConnect.tsx +++ b/js/apps/admin-ui/src/identity-providers/add/AddOpenIdConnect.tsx @@ -9,7 +9,7 @@ import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { Link, useLocation, useNavigate } from "react-router-dom"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../../components/form/FormAccess"; import { ViewHeader } from "../../components/view-header/ViewHeader"; import { useRealm } from "../../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/identity-providers/add/AddSamlConnect.tsx b/js/apps/admin-ui/src/identity-providers/add/AddSamlConnect.tsx index eee4648f22..2b3e6395cf 100644 --- a/js/apps/admin-ui/src/identity-providers/add/AddSamlConnect.tsx +++ b/js/apps/admin-ui/src/identity-providers/add/AddSamlConnect.tsx @@ -9,7 +9,7 @@ import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../../components/form/FormAccess"; import { ViewHeader } from "../../components/view-header/ViewHeader"; import { useRealm } from "../../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/identity-providers/add/DetailSettings.tsx b/js/apps/admin-ui/src/identity-providers/add/DetailSettings.tsx index 30e5e5a8c2..a5c2349247 100644 --- a/js/apps/admin-ui/src/identity-providers/add/DetailSettings.tsx +++ b/js/apps/admin-ui/src/identity-providers/add/DetailSettings.tsx @@ -23,7 +23,7 @@ import { import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { ScrollForm } from "@keycloak/keycloak-ui-shared"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { DynamicComponents } from "../../components/dynamic/DynamicComponents"; import { FixedButtonsGroup } from "../../components/form/FixedButtonGroup"; diff --git a/js/apps/admin-ui/src/index.ts b/js/apps/admin-ui/src/index.ts index 08eac74d0b..2e03005e8a 100644 --- a/js/apps/admin-ui/src/index.ts +++ b/js/apps/admin-ui/src/index.ts @@ -68,8 +68,6 @@ export * as ClientDetails from "./clients/ClientDetails"; export { ClientSessions } from "./clients/ClientSessions"; export { ClientSettings } from "./clients/ClientSettings"; export * as ClientsSection from "./clients/ClientsSection"; -export { AlertPanel } from "./components/alert/AlertPanel"; -export { useAlerts, AlertProvider } from "./components/alert/Alerts"; export { GroupBreadCrumbs } from "./components/bread-crumb/GroupBreadCrumbs"; export { PageBreadCrumbs } from "./components/bread-crumb/PageBreadCrumbs"; export { ClientSelect } from "./components/client/ClientSelect"; diff --git a/js/apps/admin-ui/src/organizations/DetailOraganzationHeader.tsx b/js/apps/admin-ui/src/organizations/DetailOraganzationHeader.tsx index cc298fa100..5b93e418d7 100644 --- a/js/apps/admin-ui/src/organizations/DetailOraganzationHeader.tsx +++ b/js/apps/admin-ui/src/organizations/DetailOraganzationHeader.tsx @@ -4,7 +4,7 @@ import { useTranslation } from "react-i18next"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { useAdminClient } from "../admin-client"; import { useNavigate } from "react-router-dom"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { Controller, useFormContext, useWatch } from "react-hook-form"; import { toOrganizations } from "./routes/Organizations"; import { useRealm } from "../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/organizations/DetailOrganization.tsx b/js/apps/admin-ui/src/organizations/DetailOrganization.tsx index 49c0de6402..3d08aa72e2 100644 --- a/js/apps/admin-ui/src/organizations/DetailOrganization.tsx +++ b/js/apps/admin-ui/src/organizations/DetailOrganization.tsx @@ -9,7 +9,7 @@ import { import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../components/form/FormAccess"; import { AttributesForm } from "../components/key-value-form/AttributeForm"; import { arrayToKeyValue } from "../components/key-value-form/key-value-convert"; diff --git a/js/apps/admin-ui/src/organizations/IdentityProviders.tsx b/js/apps/admin-ui/src/organizations/IdentityProviders.tsx index 1d6cf3628c..99e686babd 100644 --- a/js/apps/admin-ui/src/organizations/IdentityProviders.tsx +++ b/js/apps/admin-ui/src/organizations/IdentityProviders.tsx @@ -11,7 +11,7 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useParams } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { ListEmptyState } from "../components/list-empty-state/ListEmptyState"; import { KeycloakDataTable } from "../components/table-toolbar/KeycloakDataTable"; diff --git a/js/apps/admin-ui/src/organizations/InviteMemberModal.tsx b/js/apps/admin-ui/src/organizations/InviteMemberModal.tsx index 8097435e5b..cdea8998d5 100644 --- a/js/apps/admin-ui/src/organizations/InviteMemberModal.tsx +++ b/js/apps/admin-ui/src/organizations/InviteMemberModal.tsx @@ -9,7 +9,7 @@ import { import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; type InviteMemberModalProps = { orgId: string; diff --git a/js/apps/admin-ui/src/organizations/LinkIdentityProviderModal.tsx b/js/apps/admin-ui/src/organizations/LinkIdentityProviderModal.tsx index 44c0f6f594..537db91933 100644 --- a/js/apps/admin-ui/src/organizations/LinkIdentityProviderModal.tsx +++ b/js/apps/admin-ui/src/organizations/LinkIdentityProviderModal.tsx @@ -12,7 +12,7 @@ import { FormProvider, useForm, useFormContext } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../admin-client"; import { DefaultSwitchControl } from "../components/SwitchControl"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { convertAttributeNameToForm, convertFormValuesToObject, diff --git a/js/apps/admin-ui/src/organizations/Members.tsx b/js/apps/admin-ui/src/organizations/Members.tsx index 91cd0d8f17..8d9e918755 100644 --- a/js/apps/admin-ui/src/organizations/Members.tsx +++ b/js/apps/admin-ui/src/organizations/Members.tsx @@ -12,7 +12,7 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { ListEmptyState } from "../components/list-empty-state/ListEmptyState"; import { KeycloakDataTable } from "../components/table-toolbar/KeycloakDataTable"; import { useRealm } from "../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/organizations/NewOrganization.tsx b/js/apps/admin-ui/src/organizations/NewOrganization.tsx index 975e5af846..af9fbe3ed5 100644 --- a/js/apps/admin-ui/src/organizations/NewOrganization.tsx +++ b/js/apps/admin-ui/src/organizations/NewOrganization.tsx @@ -4,7 +4,7 @@ import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../components/form/FormAccess"; import { ViewHeader } from "../components/view-header/ViewHeader"; import { useRealm } from "../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/organizations/OrganizationsSection.tsx b/js/apps/admin-ui/src/organizations/OrganizationsSection.tsx index 22ae4ae677..678587e644 100644 --- a/js/apps/admin-ui/src/organizations/OrganizationsSection.tsx +++ b/js/apps/admin-ui/src/organizations/OrganizationsSection.tsx @@ -13,7 +13,7 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { ListEmptyState } from "../components/list-empty-state/ListEmptyState"; import { KeycloakDataTable } from "../components/table-toolbar/KeycloakDataTable"; diff --git a/js/apps/admin-ui/src/page/Page.tsx b/js/apps/admin-ui/src/page/Page.tsx index 65b3f9d6fb..6bfbdced32 100644 --- a/js/apps/admin-ui/src/page/Page.tsx +++ b/js/apps/admin-ui/src/page/Page.tsx @@ -2,7 +2,7 @@ import { ButtonVariant, DropdownItem } from "@patternfly/react-core"; import { useTranslation } from "react-i18next"; import { useNavigate, useParams } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { ViewHeader } from "../components/view-header/ViewHeader"; import { useRealm } from "../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/page/PageHandler.tsx b/js/apps/admin-ui/src/page/PageHandler.tsx index 864c542244..97fb568007 100644 --- a/js/apps/admin-ui/src/page/PageHandler.tsx +++ b/js/apps/admin-ui/src/page/PageHandler.tsx @@ -6,7 +6,7 @@ import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { DynamicComponents } from "../components/dynamic/DynamicComponents"; import { useRealm } from "../context/realm-context/RealmContext"; import { useFetch } from "../utils/useFetch"; diff --git a/js/apps/admin-ui/src/page/PageList.tsx b/js/apps/admin-ui/src/page/PageList.tsx index 335cc6d9ea..f312b2b713 100644 --- a/js/apps/admin-ui/src/page/PageList.tsx +++ b/js/apps/admin-ui/src/page/PageList.tsx @@ -11,7 +11,7 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link, useNavigate, useParams } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { ListEmptyState } from "../components/list-empty-state/ListEmptyState"; import { KeycloakDataTable } from "../components/table-toolbar/KeycloakDataTable"; diff --git a/js/apps/admin-ui/src/realm-roles/CreateRealmRole.tsx b/js/apps/admin-ui/src/realm-roles/CreateRealmRole.tsx index 0b35c39539..51ab474629 100644 --- a/js/apps/admin-ui/src/realm-roles/CreateRealmRole.tsx +++ b/js/apps/admin-ui/src/realm-roles/CreateRealmRole.tsx @@ -4,7 +4,7 @@ import { FormProvider, SubmitHandler, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { AttributeForm } from "../components/key-value-form/AttributeForm"; import { RoleForm } from "../components/role-form/RoleForm"; import { useRealm } from "../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/realm-roles/RealmRoleTabs.tsx b/js/apps/admin-ui/src/realm-roles/RealmRoleTabs.tsx index ec48fc44ef..32f888059c 100644 --- a/js/apps/admin-ui/src/realm-roles/RealmRoleTabs.tsx +++ b/js/apps/admin-ui/src/realm-roles/RealmRoleTabs.tsx @@ -24,7 +24,7 @@ import { ClientRoleTab, toClientRole, } from "../clients/routes/ClientRole"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { AttributeForm, diff --git a/js/apps/admin-ui/src/realm-settings/ClientProfileForm.tsx b/js/apps/admin-ui/src/realm-settings/ClientProfileForm.tsx index 024b9c2e04..be7591bf9c 100644 --- a/js/apps/admin-ui/src/realm-settings/ClientProfileForm.tsx +++ b/js/apps/admin-ui/src/realm-settings/ClientProfileForm.tsx @@ -30,7 +30,7 @@ import { FormProvider, useFieldArray, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { FormAccess } from "../components/form/FormAccess"; import { KeycloakSpinner } from "../components/keycloak-spinner/KeycloakSpinner"; diff --git a/js/apps/admin-ui/src/realm-settings/DefaultGroupsTab.tsx b/js/apps/admin-ui/src/realm-settings/DefaultGroupsTab.tsx index d7a44e9fb9..fbb4002b77 100644 --- a/js/apps/admin-ui/src/realm-settings/DefaultGroupsTab.tsx +++ b/js/apps/admin-ui/src/realm-settings/DefaultGroupsTab.tsx @@ -18,7 +18,7 @@ import { useState } from "react"; import { Trans, useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { GroupPickerDialog } from "../components/group/GroupPickerDialog"; import { KeycloakSpinner } from "../components/keycloak-spinner/KeycloakSpinner"; diff --git a/js/apps/admin-ui/src/realm-settings/EmailTab.tsx b/js/apps/admin-ui/src/realm-settings/EmailTab.tsx index fc2eb5793b..0516bc0d01 100644 --- a/js/apps/admin-ui/src/realm-settings/EmailTab.tsx +++ b/js/apps/admin-ui/src/realm-settings/EmailTab.tsx @@ -20,7 +20,7 @@ import { TextControl, } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../components/form/FormAccess"; import { useRealm } from "../context/realm-context/RealmContext"; import { toUser } from "../user/routes/User"; diff --git a/js/apps/admin-ui/src/realm-settings/ExecutorForm.tsx b/js/apps/admin-ui/src/realm-settings/ExecutorForm.tsx index 639d4fde87..99204b8bc5 100644 --- a/js/apps/admin-ui/src/realm-settings/ExecutorForm.tsx +++ b/js/apps/admin-ui/src/realm-settings/ExecutorForm.tsx @@ -19,7 +19,7 @@ import { Controller, FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { DynamicComponents } from "../components/dynamic/DynamicComponents"; import { FormAccess } from "../components/form/FormAccess"; import { ViewHeader } from "../components/view-header/ViewHeader"; diff --git a/js/apps/admin-ui/src/realm-settings/LoginTab.tsx b/js/apps/admin-ui/src/realm-settings/LoginTab.tsx index f4929a98fd..a3f0b1582d 100644 --- a/js/apps/admin-ui/src/realm-settings/LoginTab.tsx +++ b/js/apps/admin-ui/src/realm-settings/LoginTab.tsx @@ -3,7 +3,7 @@ import { FormGroup, PageSection, Switch } from "@patternfly/react-core"; import { useTranslation } from "react-i18next"; import { FormPanel, HelpItem } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../components/form/FormAccess"; import { useRealm } from "../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/realm-settings/NewAttributeSettings.tsx b/js/apps/admin-ui/src/realm-settings/NewAttributeSettings.tsx index ef0ffe5f52..5f5d4ac38f 100644 --- a/js/apps/admin-ui/src/realm-settings/NewAttributeSettings.tsx +++ b/js/apps/admin-ui/src/realm-settings/NewAttributeSettings.tsx @@ -15,7 +15,7 @@ import { FormProvider, useForm, useFormContext } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FixedButtonsGroup } from "../components/form/FixedButtonGroup"; import { ViewHeader } from "../components/view-header/ViewHeader"; import { useRealm } from "../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/realm-settings/NewClientPolicy.tsx b/js/apps/admin-ui/src/realm-settings/NewClientPolicy.tsx index b2080b45e6..347edd6205 100644 --- a/js/apps/admin-ui/src/realm-settings/NewClientPolicy.tsx +++ b/js/apps/admin-ui/src/realm-settings/NewClientPolicy.tsx @@ -31,7 +31,7 @@ import { Controller, FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { FormAccess } from "../components/form/FormAccess"; import { KeycloakSpinner } from "../components/keycloak-spinner/KeycloakSpinner"; diff --git a/js/apps/admin-ui/src/realm-settings/NewClientPolicyCondition.tsx b/js/apps/admin-ui/src/realm-settings/NewClientPolicyCondition.tsx index 377f2acdbf..6309dc77bf 100644 --- a/js/apps/admin-ui/src/realm-settings/NewClientPolicyCondition.tsx +++ b/js/apps/admin-ui/src/realm-settings/NewClientPolicyCondition.tsx @@ -21,7 +21,7 @@ import { Controller, FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { Link, useNavigate, useParams } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { DynamicComponents } from "../components/dynamic/DynamicComponents"; import { FormAccess } from "../components/form/FormAccess"; import { ViewHeader } from "../components/view-header/ViewHeader"; diff --git a/js/apps/admin-ui/src/realm-settings/PartialExport.tsx b/js/apps/admin-ui/src/realm-settings/PartialExport.tsx index f9b17bc0fb..943526d548 100644 --- a/js/apps/admin-ui/src/realm-settings/PartialExport.tsx +++ b/js/apps/admin-ui/src/realm-settings/PartialExport.tsx @@ -15,7 +15,7 @@ import { saveAs } from "file-saver"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useRealm } from "../context/realm-context/RealmContext"; import { prettyPrintJSON } from "../util"; diff --git a/js/apps/admin-ui/src/realm-settings/PartialImport.tsx b/js/apps/admin-ui/src/realm-settings/PartialImport.tsx index bebd45ffd2..47ef8b64c0 100644 --- a/js/apps/admin-ui/src/realm-settings/PartialImport.tsx +++ b/js/apps/admin-ui/src/realm-settings/PartialImport.tsx @@ -29,7 +29,7 @@ import { import { FormEvent, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { JsonFileUpload } from "../components/json-file-upload/JsonFileUpload"; import { KeycloakDataTable } from "../components/table-toolbar/KeycloakDataTable"; import { useRealm } from "../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/realm-settings/PoliciesTab.tsx b/js/apps/admin-ui/src/realm-settings/PoliciesTab.tsx index c0fdec4093..36da8dd080 100644 --- a/js/apps/admin-ui/src/realm-settings/PoliciesTab.tsx +++ b/js/apps/admin-ui/src/realm-settings/PoliciesTab.tsx @@ -20,7 +20,7 @@ import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { useAdminClient } from "../admin-client"; import { translationFormatter } from "../clients/ClientsSection"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { KeycloakSpinner } from "../components/keycloak-spinner/KeycloakSpinner"; import { ListEmptyState } from "../components/list-empty-state/ListEmptyState"; diff --git a/js/apps/admin-ui/src/realm-settings/ProfilesTab.tsx b/js/apps/admin-ui/src/realm-settings/ProfilesTab.tsx index bf83cf63eb..d367d1b933 100644 --- a/js/apps/admin-ui/src/realm-settings/ProfilesTab.tsx +++ b/js/apps/admin-ui/src/realm-settings/ProfilesTab.tsx @@ -20,7 +20,7 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { KeycloakSpinner } from "../components/keycloak-spinner/KeycloakSpinner"; import { ListEmptyState } from "../components/list-empty-state/ListEmptyState"; diff --git a/js/apps/admin-ui/src/realm-settings/RealmSettingsTabs.tsx b/js/apps/admin-ui/src/realm-settings/RealmSettingsTabs.tsx index a6b983c30d..d2c5858ab2 100644 --- a/js/apps/admin-ui/src/realm-settings/RealmSettingsTabs.tsx +++ b/js/apps/admin-ui/src/realm-settings/RealmSettingsTabs.tsx @@ -18,7 +18,7 @@ import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import type { KeyValueType } from "../components/key-value-form/key-value-convert"; import { diff --git a/js/apps/admin-ui/src/realm-settings/UserRegistration.tsx b/js/apps/admin-ui/src/realm-settings/UserRegistration.tsx index fefe344433..cb89ef074e 100644 --- a/js/apps/admin-ui/src/realm-settings/UserRegistration.tsx +++ b/js/apps/admin-ui/src/realm-settings/UserRegistration.tsx @@ -3,7 +3,7 @@ import { AlertVariant, Tab, Tabs, TabTitleText } from "@patternfly/react-core"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { RoleMapping } from "../components/role-mapping/RoleMapping"; import { useRealm } from "../context/realm-context/RealmContext"; import { DefaultsGroupsTab } from "./DefaultGroupsTab"; diff --git a/js/apps/admin-ui/src/realm-settings/event-config/EventsTab.tsx b/js/apps/admin-ui/src/realm-settings/event-config/EventsTab.tsx index df67455b5e..a9eb7b0448 100644 --- a/js/apps/admin-ui/src/realm-settings/event-config/EventsTab.tsx +++ b/js/apps/admin-ui/src/realm-settings/event-config/EventsTab.tsx @@ -13,7 +13,7 @@ import { useState } from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { FormAccess } from "../../components/form/FormAccess"; import { useRealm } from "../../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/realm-settings/keys/KeysProvidersTab.tsx b/js/apps/admin-ui/src/realm-settings/keys/KeysProvidersTab.tsx index 2d9407c3e8..66703ecda5 100644 --- a/js/apps/admin-ui/src/realm-settings/keys/KeysProvidersTab.tsx +++ b/js/apps/admin-ui/src/realm-settings/keys/KeysProvidersTab.tsx @@ -19,7 +19,7 @@ import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; import { useAdminClient } from "../../admin-client"; import { DraggableTable } from "../../authentication/components/DraggableTable"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { useRealm } from "../../context/realm-context/RealmContext"; import { useServerInfo } from "../../context/server-info/ServerInfoProvider"; diff --git a/js/apps/admin-ui/src/realm-settings/keys/key-providers/KeyProviderForm.tsx b/js/apps/admin-ui/src/realm-settings/keys/key-providers/KeyProviderForm.tsx index 4fff435312..b638aa740c 100644 --- a/js/apps/admin-ui/src/realm-settings/keys/key-providers/KeyProviderForm.tsx +++ b/js/apps/admin-ui/src/realm-settings/keys/key-providers/KeyProviderForm.tsx @@ -10,7 +10,7 @@ import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { TextControl } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../../admin-client"; -import { useAlerts } from "../../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { DynamicComponents } from "../../../components/dynamic/DynamicComponents"; import { FormAccess } from "../../../components/form/FormAccess"; import { ViewHeader } from "../../../components/view-header/ViewHeader"; diff --git a/js/apps/admin-ui/src/realm-settings/localization/RealmOverrides.tsx b/js/apps/admin-ui/src/realm-settings/localization/RealmOverrides.tsx index ae0a12fb2b..763aeb0209 100644 --- a/js/apps/admin-ui/src/realm-settings/localization/RealmOverrides.tsx +++ b/js/apps/admin-ui/src/realm-settings/localization/RealmOverrides.tsx @@ -42,7 +42,7 @@ import { ChangeEvent, useEffect, useState, type FormEvent } from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { KeyValueType } from "../../components/key-value-form/key-value-convert"; import { ListEmptyState } from "../../components/list-empty-state/ListEmptyState"; diff --git a/js/apps/admin-ui/src/realm-settings/user-profile/AttributesGroupForm.tsx b/js/apps/admin-ui/src/realm-settings/user-profile/AttributesGroupForm.tsx index 3581e6a41a..77dcd16e10 100644 --- a/js/apps/admin-ui/src/realm-settings/user-profile/AttributesGroupForm.tsx +++ b/js/apps/admin-ui/src/realm-settings/user-profile/AttributesGroupForm.tsx @@ -23,7 +23,7 @@ import { import { useTranslation } from "react-i18next"; import { Link, useNavigate, useParams } from "react-router-dom"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../../components/form/FormAccess"; import { KeyValueInput } from "../../components/key-value-form/KeyValueInput"; import type { KeyValueType } from "../../components/key-value-form/key-value-convert"; diff --git a/js/apps/admin-ui/src/realm-settings/user-profile/JsonEditorTab.tsx b/js/apps/admin-ui/src/realm-settings/user-profile/JsonEditorTab.tsx index befeb62d23..d1a130c101 100644 --- a/js/apps/admin-ui/src/realm-settings/user-profile/JsonEditorTab.tsx +++ b/js/apps/admin-ui/src/realm-settings/user-profile/JsonEditorTab.tsx @@ -3,7 +3,7 @@ import { ActionGroup, Button, Form, PageSection } from "@patternfly/react-core"; import type { editor } from "monaco-editor"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { prettyPrintJSON } from "../../util"; import { useUserProfile } from "./UserProfileContext"; diff --git a/js/apps/admin-ui/src/realm-settings/user-profile/UserProfileContext.tsx b/js/apps/admin-ui/src/realm-settings/user-profile/UserProfileContext.tsx index 98252a5f3f..346e4dbc7b 100644 --- a/js/apps/admin-ui/src/realm-settings/user-profile/UserProfileContext.tsx +++ b/js/apps/admin-ui/src/realm-settings/user-profile/UserProfileContext.tsx @@ -7,7 +7,7 @@ import { useRequiredContext, } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useRealm } from "../../context/realm-context/RealmContext"; import { useFetch } from "../../utils/useFetch"; diff --git a/js/apps/admin-ui/src/realm/add/NewRealmForm.tsx b/js/apps/admin-ui/src/realm/add/NewRealmForm.tsx index 3fcdf8b9b6..5e56903579 100644 --- a/js/apps/admin-ui/src/realm/add/NewRealmForm.tsx +++ b/js/apps/admin-ui/src/realm/add/NewRealmForm.tsx @@ -7,7 +7,7 @@ import { useNavigate } from "react-router-dom"; import { FormSubmitButton, TextControl } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; import { DefaultSwitchControl } from "../../components/SwitchControl"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../../components/form/FormAccess"; import { JsonFileUpload } from "../../components/json-file-upload/JsonFileUpload"; import { ViewHeader } from "../../components/view-header/ViewHeader"; diff --git a/js/apps/admin-ui/src/sessions/RevocationModal.tsx b/js/apps/admin-ui/src/sessions/RevocationModal.tsx index c534e5b3b2..b527e3e384 100644 --- a/js/apps/admin-ui/src/sessions/RevocationModal.tsx +++ b/js/apps/admin-ui/src/sessions/RevocationModal.tsx @@ -13,7 +13,7 @@ import { import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useRealm } from "../context/realm-context/RealmContext"; type RevocationModalProps = { diff --git a/js/apps/admin-ui/src/sessions/SessionsSection.tsx b/js/apps/admin-ui/src/sessions/SessionsSection.tsx index f447888105..0e8ac19736 100644 --- a/js/apps/admin-ui/src/sessions/SessionsSection.tsx +++ b/js/apps/admin-ui/src/sessions/SessionsSection.tsx @@ -9,7 +9,7 @@ import { FilterIcon } from "@patternfly/react-icons"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { ViewHeader } from "../components/view-header/ViewHeader"; import { fetchAdminUI } from "../context/auth/admin-ui-endpoint"; diff --git a/js/apps/admin-ui/src/sessions/SessionsTable.tsx b/js/apps/admin-ui/src/sessions/SessionsTable.tsx index e0d927197c..11843f0f08 100644 --- a/js/apps/admin-ui/src/sessions/SessionsTable.tsx +++ b/js/apps/admin-ui/src/sessions/SessionsTable.tsx @@ -16,7 +16,7 @@ import { useTranslation } from "react-i18next"; import { Link, useMatch, useNavigate } from "react-router-dom"; import { useAdminClient } from "../admin-client"; import { toClient } from "../clients/routes/Client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { ListEmptyState } from "../components/list-empty-state/ListEmptyState"; import { diff --git a/js/apps/admin-ui/src/user-federation/CreateUserFederationLdapSettings.tsx b/js/apps/admin-ui/src/user-federation/CreateUserFederationLdapSettings.tsx index 3f271505bd..833b65332d 100644 --- a/js/apps/admin-ui/src/user-federation/CreateUserFederationLdapSettings.tsx +++ b/js/apps/admin-ui/src/user-federation/CreateUserFederationLdapSettings.tsx @@ -3,7 +3,7 @@ import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useRealm } from "../context/realm-context/RealmContext"; import { LdapComponentRepresentation, diff --git a/js/apps/admin-ui/src/user-federation/ManagePriorityDialog.tsx b/js/apps/admin-ui/src/user-federation/ManagePriorityDialog.tsx index ca64943cca..fb5a14d68c 100644 --- a/js/apps/admin-ui/src/user-federation/ManagePriorityDialog.tsx +++ b/js/apps/admin-ui/src/user-federation/ManagePriorityDialog.tsx @@ -22,7 +22,7 @@ import { sortBy } from "lodash-es"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; type ManagePriorityDialogProps = { components: ComponentRepresentation[]; diff --git a/js/apps/admin-ui/src/user-federation/UserFederationKerberosSettings.tsx b/js/apps/admin-ui/src/user-federation/UserFederationKerberosSettings.tsx index 416db32067..d929e16618 100644 --- a/js/apps/admin-ui/src/user-federation/UserFederationKerberosSettings.tsx +++ b/js/apps/admin-ui/src/user-federation/UserFederationKerberosSettings.tsx @@ -10,7 +10,7 @@ import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useRealm } from "../context/realm-context/RealmContext"; import { useFetch } from "../utils/useFetch"; import { useParams } from "../utils/useParams"; diff --git a/js/apps/admin-ui/src/user-federation/UserFederationLdapSettings.tsx b/js/apps/admin-ui/src/user-federation/UserFederationLdapSettings.tsx index af241c6543..5a1d0b9a21 100644 --- a/js/apps/admin-ui/src/user-federation/UserFederationLdapSettings.tsx +++ b/js/apps/admin-ui/src/user-federation/UserFederationLdapSettings.tsx @@ -10,7 +10,7 @@ import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useParams } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { KeycloakSpinner } from "../components/keycloak-spinner/KeycloakSpinner"; import { RoutableTabs, diff --git a/js/apps/admin-ui/src/user-federation/UserFederationSection.tsx b/js/apps/admin-ui/src/user-federation/UserFederationSection.tsx index e4d0a3db33..df0e6f0d7f 100644 --- a/js/apps/admin-ui/src/user-federation/UserFederationSection.tsx +++ b/js/apps/admin-ui/src/user-federation/UserFederationSection.tsx @@ -19,7 +19,7 @@ import { useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { ClickableCard } from "../components/keycloak-card/ClickableCard"; import { KeycloakCard } from "../components/keycloak-card/KeycloakCard"; diff --git a/js/apps/admin-ui/src/user-federation/custom/CustomProviderSettings.tsx b/js/apps/admin-ui/src/user-federation/custom/CustomProviderSettings.tsx index 08cc1e8ff5..2c15fbf61b 100644 --- a/js/apps/admin-ui/src/user-federation/custom/CustomProviderSettings.tsx +++ b/js/apps/admin-ui/src/user-federation/custom/CustomProviderSettings.tsx @@ -10,7 +10,7 @@ import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { DynamicComponents } from "../../components/dynamic/DynamicComponents"; import { FormAccess } from "../../components/form/FormAccess"; import { useRealm } from "../../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/user-federation/ldap/LdapSettingsAdvanced.tsx b/js/apps/admin-ui/src/user-federation/ldap/LdapSettingsAdvanced.tsx index 7da9811f02..6040ac40d2 100644 --- a/js/apps/admin-ui/src/user-federation/ldap/LdapSettingsAdvanced.tsx +++ b/js/apps/admin-ui/src/user-federation/ldap/LdapSettingsAdvanced.tsx @@ -3,7 +3,7 @@ import { Controller, UseFormReturn } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { HelpItem } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../../components/form/FormAccess"; import { WizardSectionHeader } from "../../components/wizard-section-header/WizardSectionHeader"; import { useRealm } from "../../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/user-federation/ldap/LdapSettingsConnection.tsx b/js/apps/admin-ui/src/user-federation/ldap/LdapSettingsConnection.tsx index 72a1cf5756..fdf0b1d963 100644 --- a/js/apps/admin-ui/src/user-federation/ldap/LdapSettingsConnection.tsx +++ b/js/apps/admin-ui/src/user-federation/ldap/LdapSettingsConnection.tsx @@ -24,7 +24,7 @@ import { } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../../components/form/FormAccess"; import { WizardSectionHeader } from "../../components/wizard-section-header/WizardSectionHeader"; import { useRealm } from "../../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/user-federation/ldap/mappers/LdapMapperDetails.tsx b/js/apps/admin-ui/src/user-federation/ldap/mappers/LdapMapperDetails.tsx index c7e90a43de..02e618bd66 100644 --- a/js/apps/admin-ui/src/user-federation/ldap/mappers/LdapMapperDetails.tsx +++ b/js/apps/admin-ui/src/user-federation/ldap/mappers/LdapMapperDetails.tsx @@ -22,7 +22,7 @@ import { Controller, FormProvider, useForm, useWatch } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { useAdminClient } from "../../../admin-client"; -import { useAlerts } from "../../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../../components/confirm-dialog/ConfirmDialog"; import { DynamicComponents, diff --git a/js/apps/admin-ui/src/user-federation/ldap/mappers/LdapMapperList.tsx b/js/apps/admin-ui/src/user-federation/ldap/mappers/LdapMapperList.tsx index 2a8c5febb8..d227aa5272 100644 --- a/js/apps/admin-ui/src/user-federation/ldap/mappers/LdapMapperList.tsx +++ b/js/apps/admin-ui/src/user-federation/ldap/mappers/LdapMapperList.tsx @@ -9,7 +9,7 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link, To, useNavigate, useParams } from "react-router-dom"; import { useAdminClient } from "../../../admin-client"; -import { useAlerts } from "../../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../../components/confirm-dialog/ConfirmDialog"; import { ListEmptyState } from "../../../components/list-empty-state/ListEmptyState"; import { diff --git a/js/apps/admin-ui/src/user-federation/shared/ExtendedHeader.tsx b/js/apps/admin-ui/src/user-federation/shared/ExtendedHeader.tsx index 500260d6ab..f4f5e6837a 100644 --- a/js/apps/admin-ui/src/user-federation/shared/ExtendedHeader.tsx +++ b/js/apps/admin-ui/src/user-federation/shared/ExtendedHeader.tsx @@ -3,7 +3,7 @@ import { useFormContext, useWatch } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useParams } from "react-router-dom"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { Header } from "./Header"; diff --git a/js/apps/admin-ui/src/user-federation/shared/Header.tsx b/js/apps/admin-ui/src/user-federation/shared/Header.tsx index 47cc0e602d..b5f08effc9 100644 --- a/js/apps/admin-ui/src/user-federation/shared/Header.tsx +++ b/js/apps/admin-ui/src/user-federation/shared/Header.tsx @@ -8,7 +8,7 @@ import { Controller, useFormContext } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useNavigate, useParams } from "react-router-dom"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog"; import { ViewHeader } from "../../components/view-header/ViewHeader"; import { useRealm } from "../../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/user/CreateUser.tsx b/js/apps/admin-ui/src/user/CreateUser.tsx index 770245377f..435472b0f9 100644 --- a/js/apps/admin-ui/src/user/CreateUser.tsx +++ b/js/apps/admin-ui/src/user/CreateUser.tsx @@ -11,7 +11,7 @@ import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { KeycloakSpinner } from "../components/keycloak-spinner/KeycloakSpinner"; import { ViewHeader } from "../components/view-header/ViewHeader"; import { useRealm } from "../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/user/EditUser.tsx b/js/apps/admin-ui/src/user/EditUser.tsx index 560d016aac..dec367082a 100644 --- a/js/apps/admin-ui/src/user/EditUser.tsx +++ b/js/apps/admin-ui/src/user/EditUser.tsx @@ -23,7 +23,7 @@ import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { KeyValueType } from "../components/key-value-form/key-value-convert"; import { KeycloakSpinner } from "../components/keycloak-spinner/KeycloakSpinner"; diff --git a/js/apps/admin-ui/src/user/UserConsents.tsx b/js/apps/admin-ui/src/user/UserConsents.tsx index b1b49b8bce..46ca682674 100644 --- a/js/apps/admin-ui/src/user/UserConsents.tsx +++ b/js/apps/admin-ui/src/user/UserConsents.tsx @@ -11,7 +11,7 @@ import { sortBy } from "lodash-es"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { ListEmptyState } from "../components/list-empty-state/ListEmptyState"; import { diff --git a/js/apps/admin-ui/src/user/UserCredentials.tsx b/js/apps/admin-ui/src/user/UserCredentials.tsx index 24f80581d9..ce84afd838 100644 --- a/js/apps/admin-ui/src/user/UserCredentials.tsx +++ b/js/apps/admin-ui/src/user/UserCredentials.tsx @@ -20,7 +20,7 @@ import { import { useTranslation } from "react-i18next"; import { HelpItem } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { KeycloakSpinner } from "../components/keycloak-spinner/KeycloakSpinner"; import { ListEmptyState } from "../components/list-empty-state/ListEmptyState"; diff --git a/js/apps/admin-ui/src/user/UserForm.tsx b/js/apps/admin-ui/src/user/UserForm.tsx index a2b348b296..2e1868f91b 100644 --- a/js/apps/admin-ui/src/user/UserForm.tsx +++ b/js/apps/admin-ui/src/user/UserForm.tsx @@ -26,7 +26,7 @@ import { Controller, FormProvider, UseFormReturn } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../admin-client"; import { DefaultSwitchControl } from "../components/SwitchControl"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { FormAccess } from "../components/form/FormAccess"; import { GroupPickerDialog } from "../components/group/GroupPickerDialog"; import { useAccess } from "../context/access/Access"; diff --git a/js/apps/admin-ui/src/user/UserGroups.tsx b/js/apps/admin-ui/src/user/UserGroups.tsx index 5102546cbf..8542d5ffc1 100644 --- a/js/apps/admin-ui/src/user/UserGroups.tsx +++ b/js/apps/admin-ui/src/user/UserGroups.tsx @@ -14,7 +14,7 @@ import { intersectionBy, sortBy, uniqBy } from "lodash-es"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { GroupPath } from "../components/group/GroupPath"; import { GroupPickerDialog } from "../components/group/GroupPickerDialog"; diff --git a/js/apps/admin-ui/src/user/UserIdPModal.tsx b/js/apps/admin-ui/src/user/UserIdPModal.tsx index c6e1cf6e70..d8509cbbf9 100644 --- a/js/apps/admin-ui/src/user/UserIdPModal.tsx +++ b/js/apps/admin-ui/src/user/UserIdPModal.tsx @@ -14,7 +14,7 @@ import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { TextControl } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; type UserIdpModalProps = { userId: string; diff --git a/js/apps/admin-ui/src/user/UserIdentityProviderLinks.tsx b/js/apps/admin-ui/src/user/UserIdentityProviderLinks.tsx index 1a9b7964b0..ae0f386590 100644 --- a/js/apps/admin-ui/src/user/UserIdentityProviderLinks.tsx +++ b/js/apps/admin-ui/src/user/UserIdentityProviderLinks.tsx @@ -16,7 +16,7 @@ import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; import { FormPanel } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { KeycloakDataTable } from "../components/table-toolbar/KeycloakDataTable"; import { useRealm } from "../context/realm-context/RealmContext"; diff --git a/js/apps/admin-ui/src/user/UserRoleMapping.tsx b/js/apps/admin-ui/src/user/UserRoleMapping.tsx index b13f57d0d2..da0b5868f4 100644 --- a/js/apps/admin-ui/src/user/UserRoleMapping.tsx +++ b/js/apps/admin-ui/src/user/UserRoleMapping.tsx @@ -2,7 +2,7 @@ import type { RoleMappingPayload } from "@keycloak/keycloak-admin-client/lib/def import { AlertVariant } from "@patternfly/react-core"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../admin-client"; -import { useAlerts } from "../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { RoleMapping, Row } from "../components/role-mapping/RoleMapping"; type UserRoleMappingProps = { diff --git a/js/apps/admin-ui/src/user/user-credentials/InlineLabelEdit.tsx b/js/apps/admin-ui/src/user/user-credentials/InlineLabelEdit.tsx index 2e058564b2..b284b61e65 100644 --- a/js/apps/admin-ui/src/user/user-credentials/InlineLabelEdit.tsx +++ b/js/apps/admin-ui/src/user/user-credentials/InlineLabelEdit.tsx @@ -10,7 +10,7 @@ import { CheckIcon, PencilAltIcon, TimesIcon } from "@patternfly/react-icons"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; type UserLabelForm = { userLabel: string; diff --git a/js/apps/admin-ui/src/user/user-credentials/ResetCredentialDialog.tsx b/js/apps/admin-ui/src/user/user-credentials/ResetCredentialDialog.tsx index 755556c4a3..46111ca355 100644 --- a/js/apps/admin-ui/src/user/user-credentials/ResetCredentialDialog.tsx +++ b/js/apps/admin-ui/src/user/user-credentials/ResetCredentialDialog.tsx @@ -4,7 +4,7 @@ import { isEmpty } from "lodash-es"; import { FormProvider, useForm, useWatch } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useAdminClient } from "../../admin-client"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { ConfirmDialogModal } from "../../components/confirm-dialog/ConfirmDialog"; import { LifespanField } from "./LifespanField"; import { RequiredActionMultiSelect } from "./RequiredActionMultiSelect"; diff --git a/js/apps/admin-ui/src/user/user-credentials/ResetPasswordDialog.tsx b/js/apps/admin-ui/src/user/user-credentials/ResetPasswordDialog.tsx index b83d3cb128..622a8625a9 100644 --- a/js/apps/admin-ui/src/user/user-credentials/ResetPasswordDialog.tsx +++ b/js/apps/admin-ui/src/user/user-credentials/ResetPasswordDialog.tsx @@ -11,7 +11,7 @@ import { useTranslation } from "react-i18next"; import { FormErrorText, PasswordInput } from "@keycloak/keycloak-ui-shared"; import { useAdminClient } from "../../admin-client"; import { DefaultSwitchControl } from "../../components/SwitchControl"; -import { useAlerts } from "../../components/alert/Alerts"; +import { useAlerts } from "@keycloak/keycloak-ui-shared"; import { ConfirmDialogModal, useConfirmDialog, diff --git a/js/apps/admin-ui/src/util.ts b/js/apps/admin-ui/src/util.ts index bfd6984d65..24eea40884 100644 --- a/js/apps/admin-ui/src/util.ts +++ b/js/apps/admin-ui/src/util.ts @@ -168,8 +168,6 @@ export const prettyPrintJSON = (value: any) => JSON.stringify(value, null, 2); export const addTrailingSlash = (url: string) => url.endsWith("/") ? url : url + "/"; -export const generateId = () => Math.floor(Math.random() * 1000); - export const localeToDisplayName = (locale: string, displayLocale: string) => { try { return new Intl.DisplayNames([displayLocale], { type: "language" }).of( diff --git a/js/apps/admin-ui/src/components/alert/AlertPanel.tsx b/js/libs/ui-shared/src/alerts/AlertPanel.tsx similarity index 83% rename from js/apps/admin-ui/src/components/alert/AlertPanel.tsx rename to js/libs/ui-shared/src/alerts/AlertPanel.tsx index b553cc7397..f18b39b514 100644 --- a/js/apps/admin-ui/src/components/alert/AlertPanel.tsx +++ b/js/libs/ui-shared/src/alerts/AlertPanel.tsx @@ -4,9 +4,10 @@ import { AlertActionCloseButton, AlertVariant, } from "@patternfly/react-core"; + import type { AlertEntry } from "./Alerts"; -type AlertPanelProps = { +export type AlertPanelProps = { alerts: AlertEntry[]; onCloseAlert: (id: number) => void; }; @@ -18,9 +19,10 @@ export function AlertPanel({ alerts, onCloseAlert }: AlertPanelProps) { isToast style={{ whiteSpace: "pre-wrap" }} > - {alerts.map(({ id, variant, message, description }) => ( + {alerts.map(({ id, variant, message, description }, index) => ( void; -export type AddErrorFunction = (message: string) => void; +export type AddErrorFunction = (messageKey: string, error: unknown) => void; export type AlertProps = { addAlert: AddAlertFunction; addError: AddErrorFunction; }; -export const AlertContext = createContext(undefined); +const AlertContext = createNamedContext( + "AlertContext", + undefined, +); -export const useAlerts = () => useContext(AlertContext)!; +export const useAlerts = () => useRequiredContext(AlertContext); -export type AlertType = { +export type AlertEntry = { id: number; message: string; variant: AlertVariant; @@ -31,55 +39,43 @@ export type AlertType = { }; export const AlertProvider = ({ children }: PropsWithChildren) => { - const [alerts, setAlerts] = useState([]); + const { t } = useTranslation(); + const setTimeout = useSetTimeout(); + const [alerts, setAlerts] = useState([]); - const hideAlert = (id: number) => { + const removeAlert = (id: number) => setAlerts((alerts) => alerts.filter((alert) => alert.id !== id)); - }; - const addAlert = ( - message: string, - variant: AlertVariant = AlertVariant.success, - description?: string, - ) => { - setAlerts([ - { - id: Math.random() * 100, + const addAlert = useCallback( + (message, variant = AlertVariant.success, description) => { + const alert: AlertEntry = { + id: generateId(), message, variant, description, - }, - ...alerts, - ]); - }; + }; - const addError = (message: string) => { - addAlert(message, AlertVariant.danger); - }; + setAlerts((alerts) => [alert, ...alerts]); + setTimeout(() => removeAlert(alert.id), ALERT_TIMEOUT); + }, + [setTimeout], + ); + + const addError = useCallback( + (messageKey, error) => { + const message = t(messageKey, { error: getErrorMessage(error) }); + const description = getErrorDescription(error); + + addAlert(message, AlertVariant.danger, description); + }, + [addAlert, t], + ); + + const value = useMemo(() => ({ addAlert, addError }), [addAlert, addError]); return ( - - - {alerts.map(({ id, variant, message, description }) => ( - hideAlert(id)} - /> - } - timeout - onTimeout={() => hideAlert(id)} - > - {description &&

{description}

} -
- ))} -
+ + {children} ); diff --git a/js/libs/ui-shared/src/main.ts b/js/libs/ui-shared/src/main.ts index 5757909455..0a1ddd8ca2 100644 --- a/js/libs/ui-shared/src/main.ts +++ b/js/libs/ui-shared/src/main.ts @@ -1,4 +1,10 @@ -export { AlertProvider, useAlerts } from "./alerts/Alerts"; +export { + AlertProvider, + useAlerts, + type AddAlertFunction, + type AddErrorFunction, + type AlertProps, +} from "./alerts/Alerts"; export { ErrorPage } from "./context/ErrorPage"; export { Help, useHelp } from "./context/HelpContext"; export { @@ -54,9 +60,17 @@ export { } from "./user-profile/utils"; export type { UserFormFields } from "./user-profile/utils"; export { createNamedContext } from "./utils/createNamedContext"; +export { + getErrorDescription, + getErrorMessage, + getNetworkErrorMessage, + getNetworkErrorDescription, +} from "./utils/errors"; export { isDefined } from "./utils/isDefined"; export { useRequiredContext } from "./utils/useRequiredContext"; export { useStoredState } from "./utils/useStoredState"; +export { useSetTimeout } from "./utils/useSetTimeout"; +export { generateId } from "./utils/generateId"; export { default as KeycloakMasthead } from "./masthead/Masthead"; export { KeycloakSelect } from "./select/KeycloakSelect"; export type { Variant, KeycloakSelectProps } from "./select/KeycloakSelect"; diff --git a/js/libs/ui-shared/src/utils/errors.ts b/js/libs/ui-shared/src/utils/errors.ts new file mode 100644 index 0000000000..e56e0f5555 --- /dev/null +++ b/js/libs/ui-shared/src/utils/errors.ts @@ -0,0 +1,55 @@ +import { NetworkError } from "@keycloak/keycloak-admin-client"; + +const ERROR_FIELDS = ["error", "errorMessage"]; +const ERROR_DESCRIPTION_FIELD = "error_description"; + +export function getErrorMessage(error: unknown) { + if (typeof error === "string") { + return error; + } + + if (error instanceof NetworkError) { + return getNetworkErrorMessage(error.responseData); + } + + if (error instanceof Error) { + return error.message; + } + + throw new Error("Unable to determine error message."); +} + +export function getErrorDescription(error: unknown) { + if (!(error instanceof NetworkError)) { + return; + } + + const data = error.responseData; + + return getNetworkErrorDescription(data); +} + +export function getNetworkErrorDescription(data: unknown) { + if ( + typeof data === "object" && + data !== null && + ERROR_DESCRIPTION_FIELD in data && + typeof data[ERROR_DESCRIPTION_FIELD] === "string" + ) { + return data[ERROR_DESCRIPTION_FIELD]; + } +} + +export function getNetworkErrorMessage(data: unknown) { + if (typeof data !== "object" || data === null) { + return; + } + + for (const key of ERROR_FIELDS) { + const value = (data as Record)[key]; + + if (typeof value === "string") { + return value; + } + } +} diff --git a/js/libs/ui-shared/src/utils/generateId.ts b/js/libs/ui-shared/src/utils/generateId.ts new file mode 100644 index 0000000000..8b5c475d9d --- /dev/null +++ b/js/libs/ui-shared/src/utils/generateId.ts @@ -0,0 +1 @@ +export const generateId = () => Math.floor(Math.random() * 1000); diff --git a/js/apps/admin-ui/src/utils/useSetTimeout.test.ts b/js/libs/ui-shared/src/utils/useSetTimeout.test.ts similarity index 98% rename from js/apps/admin-ui/src/utils/useSetTimeout.test.ts rename to js/libs/ui-shared/src/utils/useSetTimeout.test.ts index b8bee5477a..40257d58b5 100644 --- a/js/apps/admin-ui/src/utils/useSetTimeout.test.ts +++ b/js/libs/ui-shared/src/utils/useSetTimeout.test.ts @@ -3,7 +3,7 @@ */ import { renderHook } from "@testing-library/react"; import { describe, expect, it, vi } from "vitest"; -import useSetTimeout from "./useSetTimeout"; +import { useSetTimeout } from "./useSetTimeout"; vi.useFakeTimers(); diff --git a/js/apps/admin-ui/src/utils/useSetTimeout.ts b/js/libs/ui-shared/src/utils/useSetTimeout.ts similarity index 95% rename from js/apps/admin-ui/src/utils/useSetTimeout.ts rename to js/libs/ui-shared/src/utils/useSetTimeout.ts index d6897f6874..86b698372e 100644 --- a/js/apps/admin-ui/src/utils/useSetTimeout.ts +++ b/js/libs/ui-shared/src/utils/useSetTimeout.ts @@ -1,6 +1,6 @@ import { useEffect, useRef, useCallback } from "react"; -export default function useSetTimeout() { +export function useSetTimeout() { const didUnmountRef = useRef(false); const scheduledTimersRef = useRef(new Set()); diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/webauthn/pages/fragments/ContentAlert.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/webauthn/pages/fragments/ContentAlert.java index 0602f569c7..aa6b29f136 100644 --- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/webauthn/pages/fragments/ContentAlert.java +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/webauthn/pages/fragments/ContentAlert.java @@ -35,7 +35,7 @@ import static org.keycloak.testsuite.util.WaitUtils.waitUntilElementIsNotPresent * Page fragments seem not to be working after migration from CGlib to ByteBuddy in Graphene */ public class ContentAlert { - private static final String ROOT_ID = "//ul[@data-testid='alerts']/li[1]//div"; + private static final String ROOT_ID = "//ul[@data-testid='global-alerts']/li[1]//div"; //The first alert from the alert group is what we are interested in. @FindBy(xpath = ROOT_ID) @@ -120,4 +120,4 @@ public class ContentAlert { assertInfo(); assertMessage(expectedMessage); } -} \ No newline at end of file +}