diff --git a/ui/src/Components/SilenceModal/index.js b/ui/src/Components/SilenceModal/index.js
index 5905fda68..a7056c951 100644
--- a/ui/src/Components/SilenceModal/index.js
+++ b/ui/src/Components/SilenceModal/index.js
@@ -1,4 +1,4 @@
-import React, { Component } from "react";
+import React, { useRef } from "react";
import PropTypes from "prop-types";
import { observer } from "mobx-react";
@@ -21,68 +21,59 @@ const SilenceModalContent = React.lazy(() =>
);
const SilenceModal = observer(
- class SilenceModal extends Component {
- static propTypes = {
- alertStore: PropTypes.instanceOf(AlertStore).isRequired,
- silenceFormStore: PropTypes.instanceOf(SilenceFormStore).isRequired,
- settingsStore: PropTypes.instanceOf(Settings).isRequired,
- };
+ ({ alertStore, silenceFormStore, settingsStore }) => {
+ const modalRef = useRef();
- constructor(props) {
- super(props);
+ const onDeleteModalClose = React.useCallback(() => {
+ modalRef.current.toggleBodyClass(true);
+ }, []);
- this.modalRef = React.createRef();
- }
-
- remountModal = () => {
- this.modalRef.current.toggleBodyClass(true);
- };
-
- render() {
- const { alertStore, silenceFormStore, settingsStore } = this.props;
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
- }
+ return (
+
+
+
+
-
-
-
-
- );
- }
+
+
+
+
+
+
+
+
+ }
+ >
+
+
+
+
+ );
}
);
+SilenceModal.propTypes = {
+ alertStore: PropTypes.instanceOf(AlertStore).isRequired,
+ silenceFormStore: PropTypes.instanceOf(SilenceFormStore).isRequired,
+ settingsStore: PropTypes.instanceOf(Settings).isRequired,
+};
export { SilenceModal };
diff --git a/ui/src/Components/SilenceModal/index.test.js b/ui/src/Components/SilenceModal/index.test.js
index e98523ea6..d2d0108da 100644
--- a/ui/src/Components/SilenceModal/index.test.js
+++ b/ui/src/Components/SilenceModal/index.test.js
@@ -1,4 +1,5 @@
import React from "react";
+import { act } from "react-dom/test-utils";
import { mount } from "enzyme";
@@ -140,9 +141,19 @@ describe("", () => {
});
it("'modal-open' class is preserved on body node after remountModal is called", () => {
+ let callbacks = [];
+ jest.spyOn(React, "useCallback").mockImplementation((fn) => {
+ callbacks.push(fn);
+ return fn;
+ });
+
silenceFormStore.toggle.visible = true;
- const tree = MountedSilenceModal();
- tree.instance().remountModal();
+ MountedSilenceModal();
+
+ expect(callbacks).toHaveLength(2);
+ act(() => {
+ callbacks.forEach((f) => f());
+ });
expect(document.body.className.split(" ")).toContain("modal-open");
});
});