fix(ui): fix silence form reset callbacks

resetProgress() should only be called *after* form is hidden, doing it before will cause it to re-render with UserInput stage which will trigger autocomplete requests
This commit is contained in:
Łukasz Mierzwa
2018-10-11 10:25:31 +01:00
parent 3fb4feb731
commit 96acb5bbfe
2 changed files with 25 additions and 16 deletions

View File

@@ -23,18 +23,6 @@ const SilenceModal = observer(
settingsStore: PropTypes.instanceOf(Settings).isRequired
};
toggleModal = () => {
const { silenceFormStore } = this.props;
silenceFormStore.toggle.toggle();
if (silenceFormStore.toggle.visible === false) {
// need to reset progress if we're hiding modal
// SilenceSubmitProgress sends a fetch on mount which would result in
// duplicate silences if we didn't reset state of the form on destroy
silenceFormStore.data.resetProgress();
}
};
render() {
const { alertStore, silenceFormStore, settingsStore } = this.props;
@@ -44,18 +32,21 @@ const SilenceModal = observer(
<TooltipWrapper title="Add new silence">
<span
className="nav-link cursor-pointer"
onClick={this.toggleModal}
onClick={silenceFormStore.toggle.toggle}
>
<FontAwesomeIcon icon={faBellSlash} />
</span>
</TooltipWrapper>
</li>
<Modal isOpen={silenceFormStore.toggle.visible}>
<Modal
isOpen={silenceFormStore.toggle.visible}
onExited={silenceFormStore.data.resetProgress}
>
<SilenceModalContent
alertStore={alertStore}
silenceFormStore={silenceFormStore}
settingsStore={settingsStore}
onHide={this.toggleModal}
onHide={silenceFormStore.toggle.hide}
/>
</Modal>
</React.Fragment>

View File

@@ -4,7 +4,7 @@ import { mount } from "enzyme";
import { AlertStore } from "Stores/AlertStore";
import { Settings } from "Stores/Settings";
import { SilenceFormStore } from "Stores/SilenceFormStore";
import { SilenceFormStore, SilenceFormStage } from "Stores/SilenceFormStore";
import { SilenceModal } from ".";
let alertStore;
@@ -77,6 +77,24 @@ describe("<SilenceModal />", () => {
expect(tree.find("SilenceModalContent")).toHaveLength(0);
});
it("resets progress on hide", () => {
const tree = MountedSilenceModal();
const toggle = tree.find(".nav-link");
toggle.simulate("click");
// mark form as dirty, resetProgress() should change this value to false
silenceFormStore.data.wasValidated = true;
// click to hide
toggle.simulate("click");
// wait for animation to finish
jest.runOnlyPendingTimers();
tree.update();
// form should be reset
expect(silenceFormStore.data.currentStage).toBe(SilenceFormStage.UserInput);
expect(silenceFormStore.data.wasValidated).toBe(false);
});
it("'modal-open' class is appended to body node when modal is visible", () => {
const tree = MountedSilenceModal();
const toggle = tree.find(".nav-link");