From d4c8f04989c88ab408aa82ba98ab9cc2097fc2b7 Mon Sep 17 00:00:00 2001 From: Panu Horsmalahti Date: Wed, 23 Jun 2021 15:48:22 +0300 Subject: [PATCH] Show error notification if user tries to remove the last hotbar (#3160) Signed-off-by: Panu Horsmalahti --- .../__tests__/hotbar-remove-command.test.tsx | 76 +++++++++++++++++++ .../hotbar/hotbar-remove-command.tsx | 10 ++- 2 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 src/renderer/components/hotbar/__tests__/hotbar-remove-command.test.tsx diff --git a/src/renderer/components/hotbar/__tests__/hotbar-remove-command.test.tsx b/src/renderer/components/hotbar/__tests__/hotbar-remove-command.test.tsx new file mode 100644 index 0000000000..dfb75ffda3 --- /dev/null +++ b/src/renderer/components/hotbar/__tests__/hotbar-remove-command.test.tsx @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2021 OpenLens Authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import "@testing-library/jest-dom/extend-expect"; +import { HotbarRemoveCommand } from "../hotbar-remove-command"; +import { render, fireEvent } from "@testing-library/react"; +import React from "react"; +import { ThemeStore } from "../../../theme.store"; +import { UserStore } from "../../../../common/user-store"; +import { Notifications } from "../../notifications"; + +const mockHotbars: {[id: string]: any} = { + "1": { + id: "1", + name: "Default", + items: [] as any + } +}; + +jest.mock("../../../../common/hotbar-store", () => ({ + HotbarStore: { + getInstance: () => ({ + hotbars: [mockHotbars["1"]], + getById: (id: string) => mockHotbars[id], + remove: () => {}, + hotbarIndex: () => 0 + }) + } +})); + +describe("", () => { + beforeEach(() => { + UserStore.createInstance(); + ThemeStore.createInstance(); + }); + + afterEach(() => { + UserStore.resetInstance(); + ThemeStore.resetInstance(); + }); + + it("renders w/o errors", () => { + const { container } = render(); + + expect(container).toBeInstanceOf(HTMLElement); + }); + + it("displays error notification if user tries to remove last hotbar", () => { + const spy = jest.spyOn(Notifications, "error"); + const { getByText } = render(); + + fireEvent.click(getByText("1: Default")); + + expect(spy).toHaveBeenCalled(); + spy.mockRestore(); + }); +}); + diff --git a/src/renderer/components/hotbar/hotbar-remove-command.tsx b/src/renderer/components/hotbar/hotbar-remove-command.tsx index de75bf0259..58aa1d849d 100644 --- a/src/renderer/components/hotbar/hotbar-remove-command.tsx +++ b/src/renderer/components/hotbar/hotbar-remove-command.tsx @@ -27,6 +27,7 @@ import { HotbarStore } from "../../../common/hotbar-store"; import { hotbarDisplayLabel } from "./hotbar-display-label"; import { CommandOverlay } from "../command-palette"; import { ConfirmDialog } from "../confirm-dialog"; +import { Notifications } from "../notifications"; @observer export class HotbarRemoveCommand extends React.Component { @@ -45,11 +46,18 @@ export class HotbarRemoveCommand extends React.Component { const hotbarStore = HotbarStore.getInstance(); const hotbar = hotbarStore.getById(id); + CommandOverlay.close(); + if (!hotbar) { return; } - CommandOverlay.close(); + if (hotbarStore.hotbars.length === 1) { + Notifications.error("Can't remove the last hotbar"); + + return; + } + ConfirmDialog.open({ okButtonProps: { label: `Remove Hotbar`,