diff --git a/.changeset/khaki-jokes-grab.md b/.changeset/khaki-jokes-grab.md
new file mode 100644
index 0000000000..31201c1078
--- /dev/null
+++ b/.changeset/khaki-jokes-grab.md
@@ -0,0 +1,5 @@
+---
+'@backstage/core-components': patch
+---
+
+Adjust ErrorPage to accept optional supportUrl property to override app support config. Update type of additionalInfo property to be ReactNode to accept both string and component.
diff --git a/packages/core-components/src/layout/ErrorPage/ErrorPage.test.tsx b/packages/core-components/src/layout/ErrorPage/ErrorPage.test.tsx
index a314128bce..2efdc5da33 100644
--- a/packages/core-components/src/layout/ErrorPage/ErrorPage.test.tsx
+++ b/packages/core-components/src/layout/ErrorPage/ErrorPage.test.tsx
@@ -16,6 +16,7 @@
import React from 'react';
import { ErrorPage } from './ErrorPage';
+import { Link } from '../../components/Link';
import { renderInTestApp } from '@backstage/test-utils';
describe('', () => {
@@ -30,4 +31,72 @@ describe('', () => {
).toBeInTheDocument();
expect(getByTestId('go-back-link')).toBeInTheDocument();
});
+
+ it('should render with additional information of type string', async () => {
+ const { getByText } = await renderInTestApp(
+ ,
+ );
+ expect(
+ getByText(/looks like someone dropped the mic!/i),
+ ).toBeInTheDocument();
+ expect(
+ getByText(/This is a string based additional information/i),
+ ).toBeInTheDocument();
+ });
+
+ it('should render with additional information including link', async () => {
+ const { getByText } = await renderInTestApp(
+
+ This is some additional information including{' '}
+ a link
+ >
+ }
+ />,
+ );
+ expect(
+ getByText(/looks like someone dropped the mic!/i),
+ ).toBeInTheDocument();
+ expect(getByText(/a link/i)).toBeInTheDocument();
+ expect(getByText(/a link/i)).toHaveAttribute('href', '/test');
+ });
+
+ it('should render with default support url if supportUrl is not provided', async () => {
+ const { getByText } = await renderInTestApp(
+ ,
+ );
+ expect(
+ getByText(/looks like someone dropped the mic!/i),
+ ).toBeInTheDocument();
+ expect(getByText(/contact support/i)).toBeInTheDocument();
+ expect(getByText(/contact support/i)).toHaveAttribute(
+ 'href',
+ 'https://github.com/backstage/backstage/issues',
+ );
+ });
+
+ it('should override support url if supportUrl property is provided', async () => {
+ const { getByText } = await renderInTestApp(
+ ,
+ );
+ expect(
+ getByText(/looks like someone dropped the mic!/i),
+ ).toBeInTheDocument();
+ expect(getByText(/contact support/i)).toBeInTheDocument();
+ expect(getByText(/contact support/i)).toHaveAttribute(
+ 'href',
+ 'https://error-page-test-support-url.com',
+ );
+ });
});
diff --git a/packages/core-components/src/layout/ErrorPage/ErrorPage.tsx b/packages/core-components/src/layout/ErrorPage/ErrorPage.tsx
index 08c002d849..928a3eb0d4 100644
--- a/packages/core-components/src/layout/ErrorPage/ErrorPage.tsx
+++ b/packages/core-components/src/layout/ErrorPage/ErrorPage.tsx
@@ -27,7 +27,8 @@ import { MicDrop } from './MicDrop';
interface IErrorPageProps {
status: string;
statusMessage: string;
- additionalInfo?: string;
+ additionalInfo?: React.ReactNode;
+ supportUrl?: string;
}
/** @public */
@@ -62,7 +63,7 @@ const useStyles = makeStyles(
*
*/
export function ErrorPage(props: IErrorPageProps) {
- const { status, statusMessage, additionalInfo } = props;
+ const { status, statusMessage, additionalInfo, supportUrl } = props;
const classes = useStyles();
const navigate = useNavigate();
const support = useSupportConfig();
@@ -88,7 +89,8 @@ export function ErrorPage(props: IErrorPageProps) {
navigate(-1)}>
Go back
- ... or please contact support if you
+ ... or please{' '}
+ contact support if you
think this is a bug.