added description to denied consent and show on ErrorPage

fixes: #28328
Signed-off-by: Erik Jan de Wit <erikjan.dewit@gmail.com>
This commit is contained in:
Erik Jan de Wit 2024-10-09 16:20:53 +02:00 committed by Pedro Igor
parent fd2338c4fc
commit eb5afeeabb
5 changed files with 8 additions and 71 deletions

View file

@ -1,5 +1,4 @@
export { PersonalInfo } from "./personal-info/PersonalInfo"; export { PersonalInfo } from "./personal-info/PersonalInfo";
export { ErrorPage } from "./root/ErrorPage";
export { Header } from "./root/Header"; export { Header } from "./root/Header";
export { PageNav } from "./root/PageNav"; export { PageNav } from "./root/PageNav";
export { DeviceActivity } from "./account-security/DeviceActivity"; export { DeviceActivity } from "./account-security/DeviceActivity";

View file

@ -1,65 +0,0 @@
import {
Button,
Modal,
ModalVariant,
Page,
Text,
TextContent,
TextVariants,
} from "@patternfly/react-core";
import { useTranslation } from "react-i18next";
import { isRouteErrorResponse, useRouteError } from "react-router-dom";
type ErrorPageProps = {
error?: unknown;
};
export const ErrorPage = (props: ErrorPageProps) => {
const { t } = useTranslation();
const error = useRouteError() ?? props.error;
const errorMessage = getErrorMessage(error);
function onRetry() {
location.href = location.origin + location.pathname;
}
return (
<Page>
<Modal
variant={ModalVariant.small}
title={t("somethingWentWrong")}
titleIconVariant="danger"
showClose={false}
isOpen
actions={[
<Button key="tryAgain" variant="primary" onClick={onRetry}>
{t("tryAgain")}
</Button>,
]}
>
<TextContent>
<Text>{t("somethingWentWrongDescription")}</Text>
{errorMessage && (
<Text component={TextVariants.small}>{errorMessage}</Text>
)}
</TextContent>
</Modal>
</Page>
);
};
function getErrorMessage(error: unknown): string | null {
if (typeof error === "string") {
return error;
}
if (isRouteErrorResponse(error)) {
return error.statusText;
}
if (error instanceof Error) {
return error.message;
}
return null;
}

View file

@ -1,10 +1,9 @@
import { lazy } from "react"; import { lazy } from "react";
import type { IndexRouteObject, RouteObject } from "react-router-dom"; import type { IndexRouteObject, RouteObject } from "react-router-dom";
import { environment } from "./environment"; import { environment } from "./environment";
import { Organizations } from "./organizations/Organizations"; import { Organizations } from "./organizations/Organizations";
import { ErrorPage } from "./root/ErrorPage";
import { Root } from "./root/Root"; import { Root } from "./root/Root";
import { ErrorPage } from "@keycloak/keycloak-ui-shared";
const DeviceActivity = lazy(() => import("./account-security/DeviceActivity")); const DeviceActivity = lazy(() => import("./account-security/DeviceActivity"));
const LinkedAccounts = lazy(() => import("./account-security/LinkedAccounts")); const LinkedAccounts = lazy(() => import("./account-security/LinkedAccounts"));

View file

@ -8,6 +8,7 @@ import {
TextVariants, TextVariants,
} from "@patternfly/react-core"; } from "@patternfly/react-core";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { getNetworkErrorDescription } from "../utils/errors";
type ErrorPageProps = { type ErrorPageProps = {
error?: unknown; error?: unknown;
@ -16,7 +17,10 @@ type ErrorPageProps = {
export const ErrorPage = (props: ErrorPageProps) => { export const ErrorPage = (props: ErrorPageProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const error = props.error; const error = props.error;
const errorMessage = getErrorMessage(error); const errorMessage =
getErrorMessage(error) ||
getNetworkErrorDescription(error)?.replace(/\+/g, " ");
console.error(error);
function onRetry() { function onRetry() {
location.href = location.origin + location.pathname; location.href = location.origin + location.pathname;

View file

@ -420,10 +420,10 @@ public class OIDCLoginProtocol implements LoginProtocol {
case CANCELLED_AIA_SILENT: case CANCELLED_AIA_SILENT:
return new OAuth2ErrorRepresentation(null, null); return new OAuth2ErrorRepresentation(null, null);
case CANCELLED_AIA: case CANCELLED_AIA:
return new OAuth2ErrorRepresentation(OAuthErrorException.ACCESS_DENIED, "User cancelled aplication-initiated action."); return new OAuth2ErrorRepresentation(OAuthErrorException.ACCESS_DENIED, "User cancelled application-initiated action.");
case CANCELLED_BY_USER: case CANCELLED_BY_USER:
case CONSENT_DENIED: case CONSENT_DENIED:
return new OAuth2ErrorRepresentation(OAuthErrorException.ACCESS_DENIED, null); return new OAuth2ErrorRepresentation(OAuthErrorException.ACCESS_DENIED, "User denied consent");
case PASSIVE_INTERACTION_REQUIRED: case PASSIVE_INTERACTION_REQUIRED:
return new OAuth2ErrorRepresentation(OAuthErrorException.INTERACTION_REQUIRED, null); return new OAuth2ErrorRepresentation(OAuthErrorException.INTERACTION_REQUIRED, null);
case PASSIVE_LOGIN_REQUIRED: case PASSIVE_LOGIN_REQUIRED: