kibana/x-pack/examples/alerting_example/public/application.tsx
Rachel Shen 50a4fc4916
[Shared UX] Adoption of Shared UX Route component (#150357)
## Summary

This PR removes all imports of Route from react-router-dom and
'@kbn/kibana-react-plugin/public' and instead imports Route from
@kbn/shared-ux-router.

### Context
Based on
https://github.com/elastic/kibana/issues/132629#issue-1243243678 This PR
executes steps 2 - 4:

> 2. To make the transition easier, we want to re-export other
react-router-dom exports alongside the modified' Route'.
> 3. Solutions should start using that Route component in place of the
one from react-router-dom. I.e. replace all occurrences of import { ...
} from 'react-router-dom' with import { ... } from
'@kbn/shared-ux-router'.
> 4. All manual calls to useExecutionContext are not needed anymore and
should be removed.

### Future PR

Looks like this might be getting worked on in:
https://github.com/elastic/kibana/pull/145863 (thanks!)

> Introduce an ESlint rule that ensures that react-router-dom is not
used directly in Kibana and that imports go through the new
@kbn/shared-ux-router package.

This is tangentially accomplished through
https://github.com/elastic/kibana/pull/150340 but only addresses using
Route through @kbn/kibana-react-plugin/public'


### Checklist

Delete any items that are not applicable to this PR.

- [x] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
Co-authored-by: Tiago Costa <tiagoffcc@hotmail.com>
2023-02-14 19:25:04 +00:00

89 lines
2.8 KiB
TypeScript

/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter as Router, RouteComponentProps } from 'react-router-dom';
import { Route } from '@kbn/shared-ux-router';
import { EuiPage } from '@elastic/eui';
import { AppMountParameters, CoreStart } from '@kbn/core/public';
import { TriggersAndActionsUIPublicPluginStart } from '@kbn/triggers-actions-ui-plugin/public';
import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
import { Page } from './components/page';
import { DocumentationPage } from './components/documentation';
import { ViewAlertPage } from './components/view_alert';
import { AlertingExamplePublicStartDeps } from './plugin';
import { ViewPeopleInSpaceAlertPage } from './components/view_astros_alert';
export interface AlertingExampleComponentParams {
http: CoreStart['http'];
basename: string;
triggersActionsUi: TriggersAndActionsUIPublicPluginStart;
}
const AlertingExampleApp = ({
basename,
http,
triggersActionsUi,
}: AlertingExampleComponentParams) => {
return (
<Router basename={basename}>
<EuiPage>
<Route
path={`/`}
exact={true}
render={() => (
<Page title={`Home`} isHome={true}>
<DocumentationPage triggersActionsUi={triggersActionsUi} />
</Page>
)}
/>
<Route
path={`/rule/:id`}
render={(props: RouteComponentProps<{ id: string }>) => {
return (
<Page title={`View Rule`} crumb={`View Rule ${props.match.params.id}`}>
<ViewAlertPage http={http} id={props.match.params.id} />
</Page>
);
}}
/>
<Route
path={`/astros/:id`}
render={(props: RouteComponentProps<{ id: string }>) => {
return (
<Page title={`View People In Space Rule`} crumb={`Astros ${props.match.params.id}`}>
<ViewPeopleInSpaceAlertPage http={http} id={props.match.params.id} />
</Page>
);
}}
/>
</EuiPage>
</Router>
);
};
export const renderApp = (
core: CoreStart,
deps: AlertingExamplePublicStartDeps,
{ appBasePath, element }: AppMountParameters
) => {
const { http } = core;
ReactDOM.render(
<KibanaContextProvider services={{ ...core, ...deps }}>
<AlertingExampleApp
basename={appBasePath}
http={http}
triggersActionsUi={deps.triggersActionsUi}
/>
</KibanaContextProvider>,
element
);
return () => ReactDOM.unmountComponentAtNode(element);
};