Files
grafana/public/app/features/trails/DataTrailsApp.tsx
Ashley Harrison 47f8717149 React: Use new JSX transform (#88802)
* update eslint, tsconfig + esbuild to handle new jsx transform

* remove thing that breaks the new jsx transform

* remove react imports

* adjust grafana-icons build

* is this the correct syntax?

* try this

* well this was much easier than expected...

* change grafana-plugin-configs webpack config

* fixes

* fix lockfile

* fix 2 more violations

* use path.resolve instead of require.resolve

* remove react import

* fix react imports

* more fixes

* remove React import

* remove import React from docs

* remove another react import
2024-06-25 12:43:47 +01:00

89 lines
2.4 KiB
TypeScript

import { useState, useEffect } from 'react';
import { Route, Switch } from 'react-router-dom';
import { PageLayoutType } from '@grafana/data';
import { locationService } from '@grafana/runtime';
import { SceneComponentProps, SceneObjectBase, SceneObjectState, UrlSyncContextProvider } from '@grafana/scenes';
import { Page } from 'app/core/components/Page/Page';
import { DataTrail } from './DataTrail';
import { DataTrailsHome } from './DataTrailsHome';
import { MetricsHeader } from './MetricsHeader';
import { getTrailStore } from './TrailStore/TrailStore';
import { HOME_ROUTE, TRAILS_ROUTE } from './shared';
import { getUrlForTrail, newMetricsTrail } from './utils';
export interface DataTrailsAppState extends SceneObjectState {
trail: DataTrail;
home: DataTrailsHome;
}
export class DataTrailsApp extends SceneObjectBase<DataTrailsAppState> {
public constructor(state: DataTrailsAppState) {
super(state);
}
goToUrlForTrail(trail: DataTrail) {
locationService.push(getUrlForTrail(trail));
this.setState({ trail });
}
static Component = ({ model }: SceneComponentProps<DataTrailsApp>) => {
const { trail, home } = model.useState();
return (
<Switch>
<Route
exact={true}
path={HOME_ROUTE}
render={() => (
<Page
navId="explore/metrics"
layout={PageLayoutType.Standard}
renderTitle={() => <MetricsHeader />}
subTitle=""
>
<home.Component model={home} />
</Page>
)}
/>
<Route exact={true} path={TRAILS_ROUTE} render={() => <DataTrailView trail={trail} />} />
</Switch>
);
};
}
function DataTrailView({ trail }: { trail: DataTrail }) {
const [isInitialized, setIsInitialized] = useState(false);
useEffect(() => {
if (!isInitialized) {
getTrailStore().setRecentTrail(trail);
setIsInitialized(true);
}
}, [trail, isInitialized]);
if (!isInitialized) {
return null;
}
return (
<UrlSyncContextProvider scene={trail}>
<trail.Component model={trail} />
</UrlSyncContextProvider>
);
}
let dataTrailsApp: DataTrailsApp;
export function getDataTrailsApp() {
if (!dataTrailsApp) {
dataTrailsApp = new DataTrailsApp({
trail: newMetricsTrail(),
home: new DataTrailsHome({}),
});
}
return dataTrailsApp;
}