import React, { useRef } from "react"; import PropTypes from "prop-types"; import { useObserver, useLocalStore } from "mobx-react"; import { Manager, Reference, Popper } from "react-popper"; import Moment from "react-moment"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faCaretDown } from "@fortawesome/free-solid-svg-icons/faCaretDown"; import { faBellSlash } from "@fortawesome/free-solid-svg-icons/faBellSlash"; import { faExternalLinkAlt } from "@fortawesome/free-solid-svg-icons/faExternalLinkAlt"; import { APIAlert, APIGroup } from "Models/API"; import { AlertStore } from "Stores/AlertStore"; import { SilenceFormStore, SilenceTabNames } from "Stores/SilenceFormStore"; import { FetchPauser } from "Components/FetchPauser"; import { DropdownSlide } from "Components/Animations/DropdownSlide"; import { useOnClickOutside } from "Hooks/useOnClickOutside"; const onSilenceClick = (alertStore, silenceFormStore, group, alert) => { silenceFormStore.data.resetProgress(); silenceFormStore.data.fillMatchersFromGroup( group, alertStore.settings.values.silenceForm.strip.labels, [alert] ); silenceFormStore.tab.setTab(SilenceTabNames.Editor); silenceFormStore.toggle.show(); }; const MenuContent = ({ popperPlacement, popperRef, popperStyle, group, alert, afterClick, alertStore, silenceFormStore, }) => { return ( Alert source links: {alert.alertmanager.map((am) => ( {am.name} ))} { if (Object.keys(alertStore.data.clustersWithoutReadOnly).length) { onSilenceClick(alertStore, silenceFormStore, group, alert); afterClick(); } }} > Silence this alert ); }; MenuContent.propTypes = { popperPlacement: PropTypes.string, popperRef: PropTypes.func, popperStyle: PropTypes.object, group: APIGroup.isRequired, alert: APIAlert.isRequired, afterClick: PropTypes.func.isRequired, }; const AlertMenu = ({ group, alert, alertStore, silenceFormStore, setIsMenuOpen, }) => { const collapse = useLocalStore(() => ({ value: true, toggle() { this.value = !this.value; setIsMenuOpen(!this.value); }, hide() { this.value = true; setIsMenuOpen(!this.value); }, })); const ref = useRef(null); useOnClickOutside(ref, collapse.hide); return useObserver(() => ( {({ ref }) => ( {alert.startsAt} )} {({ placement, ref, style }) => ( )} )); }; AlertMenu.propTypes = { group: APIGroup.isRequired, alert: APIAlert.isRequired, alertStore: PropTypes.instanceOf(AlertStore).isRequired, silenceFormStore: PropTypes.instanceOf(SilenceFormStore).isRequired, setIsMenuOpen: PropTypes.func.isRequired, }; export { AlertMenu, MenuContent };