Reset power selector on API failure to prevent state mismatch (#12319)

* Reset power selector on API failure to prevent state mismatch

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Allow onChange to be sync or async

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Add unmounted check

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Improve coverage

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Iterate

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

---------

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
This commit is contained in:
Michael Telatynski 2024-03-08 11:58:36 +00:00 committed by GitHub
parent ddbc6439ce
commit 42ac873c55
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 96 additions and 13 deletions

View file

@ -16,6 +16,7 @@ limitations under the License.
import React from "react";
import { fireEvent, render, screen } from "@testing-library/react";
import { defer } from "matrix-js-sdk/src/utils";
import PowerSelector from "../../../../src/components/views/elements/PowerSelector";
@ -75,4 +76,25 @@ describe("<PowerSelector />", () => {
expect(option.selected).toBeTruthy();
expect(fn).not.toHaveBeenCalled();
});
it("should reset when onChange promise rejects", async () => {
const deferred = defer<void>();
render(
<PowerSelector
value={25}
maxValue={100}
usersDefault={0}
onChange={() => deferred.promise}
powerLevelKey="key"
/>,
);
const input = screen.getByLabelText("Power level");
fireEvent.change(input, { target: { value: 40 } });
fireEvent.blur(input);
await screen.findByDisplayValue(40);
deferred.reject("Some error");
await screen.findByDisplayValue(25);
});
});