123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- import { Action, KBarProvider } from 'kbar';
- import React, { ComponentType } from 'react';
- import { Provider } from 'react-redux';
- import { Router, Route, Redirect, Switch } from 'react-router-dom';
- import { config, locationService, navigationLogger, reportInteraction } from '@grafana/runtime';
- import { ErrorBoundaryAlert, GlobalStyles, ModalRoot, ModalsProvider, PortalContainer } from '@grafana/ui';
- import { SearchWrapper } from 'app/features/search';
- import { getAppRoutes } from 'app/routes/routes';
- import { store } from 'app/store/store';
- import { AngularRoot } from './angular/AngularRoot';
- import { loadAndInitAngularIfEnabled } from './angular/loadAndInitAngularIfEnabled';
- import { GrafanaApp } from './app';
- import { AppNotificationList } from './core/components/AppNotifications/AppNotificationList';
- import { NavBar } from './core/components/NavBar/NavBar';
- import { I18nProvider } from './core/localisation';
- import { GrafanaRoute } from './core/navigation/GrafanaRoute';
- import { RouteDescriptor } from './core/navigation/types';
- import { contextSrv } from './core/services/context_srv';
- import { ConfigContext, ThemeProvider } from './core/utils/ConfigProvider';
- import { CommandPalette } from './features/commandPalette/CommandPalette';
- import { LiveConnectionWarning } from './features/live/LiveConnectionWarning';
- interface AppWrapperProps {
- app: GrafanaApp;
- }
- interface AppWrapperState {
- ready?: boolean;
- }
- /** Used by enterprise */
- let bodyRenderHooks: ComponentType[] = [];
- let pageBanners: ComponentType[] = [];
- export function addBodyRenderHook(fn: ComponentType) {
- bodyRenderHooks.push(fn);
- }
- export function addPageBanner(fn: ComponentType) {
- pageBanners.push(fn);
- }
- export class AppWrapper extends React.Component<AppWrapperProps, AppWrapperState> {
- constructor(props: AppWrapperProps) {
- super(props);
- this.state = {};
- }
- async componentDidMount() {
- await loadAndInitAngularIfEnabled();
- this.setState({ ready: true });
- $('.preloader').remove();
- }
- renderRoute = (route: RouteDescriptor) => {
- const roles = route.roles ? route.roles() : [];
- return (
- <Route
- exact={route.exact === undefined ? true : route.exact}
- path={route.path}
- key={route.path}
- render={(props) => {
- navigationLogger('AppWrapper', false, 'Rendering route', route, 'with match', props.location);
- // TODO[Router]: test this logic
- if (roles?.length) {
- if (!roles.some((r: string) => contextSrv.hasRole(r))) {
- return <Redirect to="/" />;
- }
- }
- return <GrafanaRoute {...props} route={route} />;
- }}
- />
- );
- };
- renderRoutes() {
- return <Switch>{getAppRoutes().map((r) => this.renderRoute(r))}</Switch>;
- }
- render() {
- const { ready } = this.state;
- navigationLogger('AppWrapper', false, 'rendering');
- const commandPaletteActionSelected = (action: Action) => {
- reportInteraction('commandPalette_action_selected', {
- actionId: action.id,
- });
- };
- return (
- <Provider store={store}>
- <I18nProvider>
- <ErrorBoundaryAlert style="page">
- <ConfigContext.Provider value={config}>
- <ThemeProvider>
- <KBarProvider
- actions={[]}
- options={{ enableHistory: true, callbacks: { onSelectAction: commandPaletteActionSelected } }}
- >
- <ModalsProvider>
- <GlobalStyles />
- {config.featureToggles.commandPalette && <CommandPalette />}
- <div className="grafana-app">
- <Router history={locationService.getHistory()}>
- {ready && <NavBar />}
- <main className="main-view">
- {pageBanners.map((Banner, index) => (
- <Banner key={index.toString()} />
- ))}
- <AngularRoot />
- <AppNotificationList />
- <SearchWrapper />
- {ready && this.renderRoutes()}
- {bodyRenderHooks.map((Hook, index) => (
- <Hook key={index.toString()} />
- ))}
- </main>
- </Router>
- </div>
- <LiveConnectionWarning />
- <ModalRoot />
- <PortalContainer />
- </ModalsProvider>
- </KBarProvider>
- </ThemeProvider>
- </ConfigContext.Provider>
- </ErrorBoundaryAlert>
- </I18nProvider>
- </Provider>
- );
- }
- }
|