import { css } from '@emotion/css'; import React, { lazy, Suspense, useCallback, useMemo, useState } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { config } from '@grafana/runtime'; import { Modal, useStyles2 } from '@grafana/ui'; import { RulerGrafanaRuleDTO } from 'app/types/unified-alerting-dto'; const AnnotationsStateHistory = lazy(() => import('../components/rules/state-history/StateHistory')); const LokiStateHistory = lazy(() => import('../components/rules/state-history/LokiStateHistory')); enum StateHistoryImplementation { Loki = 'loki', Annotations = 'annotations', } function useStateHistoryModal() { const [showModal, setShowModal] = useState(false); const [rule, setRule] = useState(); const styles = useStyles2(getStyles); // can be "loki", "multiple" or "annotations" const stateHistoryBackend = config.unifiedAlerting.alertStateHistoryBackend; // can be "loki" or "annotations" const stateHistoryPrimary = config.unifiedAlerting.alertStateHistoryPrimary; // if "loki" is either the backend or the primary, show the new state history implementation const usingNewAlertStateHistory = [stateHistoryBackend, stateHistoryPrimary].some( (implementation) => implementation === StateHistoryImplementation.Loki ); const implementation = usingNewAlertStateHistory ? StateHistoryImplementation.Loki : StateHistoryImplementation.Annotations; const dismissModal = useCallback(() => { setRule(undefined); setShowModal(false); }, []); const openModal = useCallback((rule: RulerGrafanaRuleDTO) => { setRule(rule); setShowModal(true); }, []); const StateHistoryModal = useMemo(() => { if (!rule) { return null; } return ( {implementation === StateHistoryImplementation.Loki && } {implementation === StateHistoryImplementation.Annotations && ( )} ); }, [rule, showModal, dismissModal, implementation, styles]); return { StateHistoryModal, showStateHistoryModal: openModal, hideStateHistoryModal: dismissModal, }; } const getStyles = (theme: GrafanaTheme2) => ({ modal: css` width: 80%; height: 80%; min-width: 800px; `, modalContent: css` height: 100%; width: 100%; padding: ${theme.spacing(2)}; `, }); export { useStateHistoryModal };