From 5c8fdbf9429bee52f4c2a34ace386f152a1a551b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Fri, 24 Apr 2020 17:31:35 +0100 Subject: [PATCH] fix(ui): rewrite SilenceModal with hooks --- ui/src/Components/SilenceModal/index.js | 109 +++++++++---------- ui/src/Components/SilenceModal/index.test.js | 15 ++- 2 files changed, 63 insertions(+), 61 deletions(-) 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"); }); });