import { css } from '@emotion/css'; import React, { useEffect } from 'react'; import { Route, Switch } from 'react-router-dom'; import { GrafanaTheme2, PageLayoutType } from '@grafana/data'; import { locationService } from '@grafana/runtime'; import { getUrlSyncManager, SceneComponentProps, SceneObjectBase, SceneObjectState } from '@grafana/scenes'; import { useStyles2 } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; import { DataTrail } from './DataTrail'; import { DataTrailsHome } from './DataTrailsHome'; import { getTrailStore } from './TrailStore/TrailStore'; import { getMetricName, getUrlForTrail, newMetricsTrail } from './utils'; export interface DataTrailsAppState extends SceneObjectState { trail: DataTrail; home: DataTrailsHome; } export class DataTrailsApp extends SceneObjectBase { public constructor(state: DataTrailsAppState) { super(state); } goToUrlForTrail(trail: DataTrail) { this.setState({ trail }); locationService.push(getUrlForTrail(trail)); } static Component = ({ model }: SceneComponentProps) => { const { trail, home } = model.useState(); const styles = useStyles2(getStyles); return ( (
)} /> (
)} />
); }; } function DataTrailView({ trail }: { trail: DataTrail }) { const [isInitialized, setIsInitialized] = React.useState(false); useEffect(() => { if (!isInitialized) { getUrlSyncManager().initSync(trail); getTrailStore().setRecentTrail(trail); setIsInitialized(true); } }, [trail, isInitialized]); if (!isInitialized) { return null; } return ; } let dataTrailsApp: DataTrailsApp; export function getDataTrailsApp() { if (!dataTrailsApp) { dataTrailsApp = new DataTrailsApp({ trail: newMetricsTrail(), home: new DataTrailsHome({}), }); } return dataTrailsApp; } function getStyles(theme: GrafanaTheme2) { return { customPage: css({ padding: theme.spacing(2, 3, 2, 3), background: theme.isLight ? theme.colors.background.primary : theme.colors.background.canvas, flexGrow: 1, display: 'flex', flexDirection: 'column', }), }; }