1
0
mirror of https://github.com/lensapp/lens.git synced 2024-09-20 05:47:24 +03:00

Replace status bar item application update with different tray icon based on status of the update (#5769)

* Remove the auto-update status bar item for not being needed anymore

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>

* Make adding of new tray icons easier by complying to Open Closed Principle

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>

* Start showing different tray icon when checking for updates

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>

* Include placeholder icon for checking for updates

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>

* Simplify code

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>

* Add first keyframe for downloading spinner

Signed-off-by: Sebastian Malton <sebastian@malton.name>

Co-authored-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Janne Savolainen 2022-07-06 01:44:03 +03:00 committed by GitHub
parent 26127fe906
commit 667053cdf5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
52 changed files with 370 additions and 1409 deletions

View File

@ -12,6 +12,7 @@ const size = Number(process.env.OUTPUT_SIZE || "16");
const outputFolder = process.env.OUTPUT_DIR || "./build/tray";
const inputFile = process.env.INPUT_SVG_PATH || "./src/renderer/components/icon/logo-lens.svg";
const noticeFile = process.env.NOTICE_SVG_PATH || "./src/renderer/components/icon/notice.svg";
const spinnerFile = process.env.SPINNER_SVG_PATH || "./src/renderer/components/icon/arrow-spinner.svg";
async function ensureOutputFoler() {
await ensureDir(outputFolder);
@ -58,8 +59,9 @@ async function generateImages(image: Buffer, size: number, name: string) {
]);
}
async function generateUpdateAvailableImages(baseImage: Buffer, system: TargetSystems) {
const noticeIconImage = await getNoticeIconImage(system);
async function generateImageWithSvg(baseImage: Buffer, system: TargetSystems, filePath: string) {
const svgFile = await getIconImage(system, filePath);
const circleBuffer = await sharp(Buffer.from(`
<svg viewBox="0 0 64 64">
<circle cx="32" cy="32" r="32" fill="black" />
@ -78,7 +80,7 @@ async function generateUpdateAvailableImages(baseImage: Buffer, system: TargetSy
},
{
input: (
await sharp(noticeIconImage)
await sharp(svgFile)
.resize({
width: 60,
height: 60,
@ -92,8 +94,8 @@ async function generateUpdateAvailableImages(baseImage: Buffer, system: TargetSy
.toBuffer();
}
async function getNoticeIconImage(system: TargetSystems) {
const svgData = await readFile(noticeFile, { encoding: "utf-8" });
async function getIconImage(system: TargetSystems, filePath: string) {
const svgData = await readFile(filePath, { encoding: "utf-8" });
const root = new JSDOM(svgData).window.document.getElementsByTagName("svg")[0];
root.innerHTML += getSvgStyling(system === "macos" ? "light" : "dark");
@ -107,18 +109,25 @@ async function generateTrayIcons() {
await ensureOutputFoler();
const baseIconTemplateImage = await getBaseIconImage("macos");
const updateAvailableTemplateImage = await generateUpdateAvailableImages(baseIconTemplateImage, "macos");
const baseIconImage = await getBaseIconImage("windows-or-linux");
const updateAvailableImage = await generateUpdateAvailableImages(baseIconImage, "windows-or-linux");
const updateAvailableTemplateImage = await generateImageWithSvg(baseIconTemplateImage, "macos", noticeFile);
const updateAvailableImage = await generateImageWithSvg(baseIconImage, "windows-or-linux", noticeFile);
const checkingForUpdatesTemplateImage = await generateImageWithSvg(baseIconTemplateImage, "macos", spinnerFile);
const checkingForUpdatesImage = await generateImageWithSvg(baseIconImage, "windows-or-linux", spinnerFile);
await Promise.all([
// Templates are for macOS only
generateImages(baseIconTemplateImage, size, "trayIconTemplate"),
generateImages(updateAvailableTemplateImage, size, "trayIconUpdateAvailableTemplate"),
generateImages(updateAvailableTemplateImage, size, "trayIconUpdateAvailableTemplate"),
generateImages(checkingForUpdatesTemplateImage, size, "trayIconCheckingForUpdatesTemplate"),
// Non-templates are for windows and linux
generateImages(baseIconImage, size, "trayIcon"),
generateImages(updateAvailableImage, size, "trayIconUpdateAvailable"),
generateImages(checkingForUpdatesImage, size, "trayIconCheckingForUpdates"),
]);
console.log("Generated all images");

Binary file not shown.

After

Width:  |  Height:  |  Size: 504 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 993 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -187,17 +187,7 @@ exports[`extension special characters in page registrations renders 1`] = `
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -317,17 +307,7 @@ exports[`extension special characters in page registrations when navigating to r
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -187,17 +187,7 @@ exports[`navigate to extension page renders 1`] = `
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -317,17 +307,7 @@ exports[`navigate to extension page when extension navigates to child route rend
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -463,17 +443,7 @@ exports[`navigate to extension page when extension navigates to route with param
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -609,17 +579,7 @@ exports[`navigate to extension page when extension navigates to route without pa
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -755,17 +715,7 @@ exports[`navigate to extension page when extension navigates to route without pa
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -110,17 +110,7 @@ exports[`navigating between routes given route with optional path parameters whe
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -240,17 +230,7 @@ exports[`navigating between routes given route without path parameters when navi
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -187,17 +187,7 @@ exports[`add-cluster - navigation using application menu renders 1`] = `
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -395,17 +385,7 @@ exports[`add-cluster - navigation using application menu when navigating to add
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -188,17 +188,7 @@ exports[`encourage user to update when sufficient time passed since update was d
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -188,17 +188,7 @@ exports[`installing update using tray when started renders 1`] = `
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -400,20 +390,7 @@ exports[`installing update using tray when started when user checks for updates
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
class="Spinner singleColor"
/>
<div
data-testid="app-update-checking"
>
Checking for updates...
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -615,20 +592,7 @@ exports[`installing update using tray when started when user checks for updates
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-downloading"
>
Downloading version some-version...
</div>
<div
class="Spinner singleColor"
/>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -848,17 +812,7 @@ exports[`installing update using tray when started when user checks for updates
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-download-failed"
>
Download of update failed
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1078,17 +1032,7 @@ exports[`installing update using tray when started when user checks for updates
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-available"
>
some-version is available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1290,17 +1234,7 @@ exports[`installing update using tray when started when user checks for updates
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -188,17 +188,7 @@ exports[`installing update when started renders 1`] = `
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -400,20 +390,7 @@ exports[`installing update when started when user checks for updates renders 1`]
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
class="Spinner singleColor"
/>
<div
data-testid="app-update-checking"
>
Checking for updates...
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -615,20 +592,7 @@ exports[`installing update when started when user checks for updates when new up
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-downloading"
>
Downloading version some-version...
</div>
<div
class="Spinner singleColor"
/>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -848,17 +812,7 @@ exports[`installing update when started when user checks for updates when new up
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-download-failed"
>
Download of update failed
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1078,17 +1032,7 @@ exports[`installing update when started when user checks for updates when new up
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-available"
>
some-version is available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1290,17 +1234,7 @@ exports[`installing update when started when user checks for updates when no new
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -188,17 +188,7 @@ exports[`periodical checking of updates given updater is enabled and configurati
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -188,17 +188,7 @@ exports[`selection of update stability when started renders 1`] = `
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -14,15 +14,12 @@ import asyncFn from "@async-fn/jest";
import type { DownloadPlatformUpdate } from "../../main/application-update/download-platform-update/download-platform-update.injectable";
import downloadPlatformUpdateInjectable from "../../main/application-update/download-platform-update/download-platform-update.injectable";
import showApplicationWindowInjectable from "../../main/start-main-application/lens-window/show-application-window.injectable";
import type { TrayIconPaths } from "../../main/tray/tray-icon-path.injectable";
import trayIconPathsInjectable from "../../main/tray/tray-icon-path.injectable";
describe("installing update using tray", () => {
let applicationBuilder: ApplicationBuilder;
let checkForPlatformUpdatesMock: AsyncFnMock<CheckForPlatformUpdates>;
let downloadPlatformUpdateMock: AsyncFnMock<DownloadPlatformUpdate>;
let showApplicationWindowMock: jest.Mock;
let trayIconPaths: TrayIconPaths;
beforeEach(() => {
applicationBuilder = getApplicationBuilder();
@ -46,7 +43,6 @@ describe("installing update using tray", () => {
mainDi.override(electronUpdaterIsActiveInjectable, () => true);
mainDi.override(publishIsConfiguredInjectable, () => true);
trayIconPaths = mainDi.inject(trayIconPathsInjectable);
});
});
@ -61,10 +57,6 @@ describe("installing update using tray", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("should use the normal tray icon", () => {
expect(applicationBuilder.tray.getIconPath()).toBe(trayIconPaths.normal);
});
it("user cannot install update yet", () => {
expect(applicationBuilder.tray.get("install-update")).toBeNull();
});
@ -80,10 +72,6 @@ describe("installing update using tray", () => {
expect(showApplicationWindowMock).not.toHaveBeenCalled();
});
it("should still use the normal tray icon", () => {
expect(applicationBuilder.tray.getIconPath()).toBe(trayIconPaths.normal);
});
it("user cannot check for updates again", () => {
expect(
applicationBuilder.tray.get("check-for-updates")?.enabled,
@ -117,10 +105,6 @@ describe("installing update using tray", () => {
expect(showApplicationWindowMock).toHaveBeenCalled();
});
it("should still use the normal tray icon", () => {
expect(applicationBuilder.tray.getIconPath()).toBe(trayIconPaths.normal);
});
it("user cannot install update", () => {
expect(applicationBuilder.tray.get("install-update")).toBeNull();
});
@ -156,10 +140,6 @@ describe("installing update using tray", () => {
expect(showApplicationWindowMock).toHaveBeenCalled();
});
it("should use the update available icon", () => {
expect(applicationBuilder.tray.getIconPath()).toBe(trayIconPaths.updateAvailable);
});
it("user cannot check for updates again yet", () => {
expect(
applicationBuilder.tray.get("check-for-updates")?.enabled,
@ -199,10 +179,6 @@ describe("installing update using tray", () => {
).toBeNull();
});
it("should revert to use the normal tray icon", () => {
expect(applicationBuilder.tray.getIconPath()).toBe(trayIconPaths.normal);
});
it("user can check for updates again", () => {
expect(
applicationBuilder.tray.get("check-for-updates")?.enabled,
@ -231,10 +207,6 @@ describe("installing update using tray", () => {
).toBe("Install update some-version");
});
it("should use the update available icon", () => {
expect(applicationBuilder.tray.getIconPath()).toBe(trayIconPaths.updateAvailable);
});
it("user can check for updates again", () => {
expect(
applicationBuilder.tray.get("check-for-updates")?.enabled,

View File

@ -16,7 +16,8 @@ import type { DownloadPlatformUpdate } from "../../main/application-update/downl
import downloadPlatformUpdateInjectable from "../../main/application-update/download-platform-update/download-platform-update.injectable";
import setUpdateOnQuitInjectable from "../../main/electron-app/features/set-update-on-quit.injectable";
import processCheckingForUpdatesInjectable from "../../main/application-update/check-for-updates/process-checking-for-updates.injectable";
import { advanceFakeTime, useFakeTime } from "../../common/test-utils/use-fake-time";
import { useFakeTime } from "../../common/test-utils/use-fake-time";
import staticFilesDirectoryInjectable from "../../common/vars/static-files-directory.injectable";
describe("installing update", () => {
let applicationBuilder: ApplicationBuilder;
@ -36,6 +37,8 @@ describe("installing update", () => {
downloadPlatformUpdateMock = asyncFn();
setUpdateOnQuitMock = jest.fn();
mainDi.override(staticFilesDirectoryInjectable, () => "/some-static-files-directory");
mainDi.override(setUpdateOnQuitInjectable, () => setUpdateOnQuitMock);
mainDi.override(
@ -65,13 +68,21 @@ describe("installing update", () => {
beforeEach(async () => {
rendered = await applicationBuilder.render();
processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(processCheckingForUpdatesInjectable);
processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(
processCheckingForUpdatesInjectable,
);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("shows normal tray icon", () => {
expect(applicationBuilder.tray.getIconPath()).toBe(
"/some-static-files-directory/icons/trayIconTemplate.png",
);
});
describe("when user checks for updates", () => {
let processCheckingForUpdatesPromise: Promise<void>;
@ -86,8 +97,10 @@ describe("installing update", () => {
);
});
it("notifies the user that checking for updates is happening", () => {
expect(rendered.getByTestId("app-update-checking")).toBeInTheDocument();
it("shows tray icon for checking for updates", () => {
expect(applicationBuilder.tray.getIconPath()).toBe(
"/some-static-files-directory/icons/trayIconCheckingForUpdatesTemplate.png",
);
});
it("renders", () => {
@ -103,8 +116,10 @@ describe("installing update", () => {
await processCheckingForUpdatesPromise;
});
it("notifies the user", () => {
expect(rendered.getByTestId("app-update-not-available")).toBeInTheDocument();
it("shows tray icon for normal", () => {
expect(applicationBuilder.tray.getIconPath()).toBe(
"/some-static-files-directory/icons/trayIconTemplate.png",
);
});
it("does not start downloading update", () => {
@ -114,12 +129,6 @@ describe("installing update", () => {
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("when 5 seconds elapses, clears the notification to the user", () => {
advanceFakeTime(6000);
expect(rendered.getByTestId("app-update-idle")).toBeInTheDocument();
});
});
describe("when new update is discovered", () => {
@ -136,8 +145,10 @@ describe("installing update", () => {
expect(downloadPlatformUpdateMock).toHaveBeenCalled();
});
it("notifies the user that download is happening", () => {
expect(rendered.getByTestId("app-update-downloading")).toBeInTheDocument();
it("still shows tray icon for downloading", () => {
expect(applicationBuilder.tray.getIconPath()).toBe(
"/some-static-files-directory/icons/trayIconCheckingForUpdatesTemplate.png",
);
});
it("renders", () => {
@ -153,8 +164,10 @@ describe("installing update", () => {
expect(quitAndInstallUpdateMock).not.toHaveBeenCalled();
});
it("notifies the user about failed download", () => {
expect(rendered.getByTestId("app-update-download-failed")).toBeInTheDocument();
it("still shows normal tray icon", () => {
expect(applicationBuilder.tray.getIconPath()).toBe(
"/some-static-files-directory/icons/trayIconTemplate.png",
);
});
it("renders", () => {
@ -171,8 +184,10 @@ describe("installing update", () => {
expect(quitAndInstallUpdateMock).not.toHaveBeenCalled();
});
it("notifies the user about successful download", () => {
expect(rendered.getByTestId("app-update-available")).toBeInTheDocument();
it("shows tray icon for update being available", () => {
expect(applicationBuilder.tray.getIconPath()).toBe(
"/some-static-files-directory/icons/trayIconUpdateAvailableTemplate.png",
);
});
it("renders", () => {

View File

@ -187,17 +187,7 @@ exports[`extensions - navigation using application menu renders 1`] = `
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -428,17 +418,7 @@ exports[`extensions - navigation using application menu when navigating to exten
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -564,17 +564,7 @@ exports[`add custom helm repository in preferences when navigating to preference
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1159,17 +1149,7 @@ exports[`add custom helm repository in preferences when navigating to preference
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1754,17 +1734,7 @@ exports[`add custom helm repository in preferences when navigating to preference
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -2458,17 +2428,7 @@ exports[`add custom helm repository in preferences when navigating to preference
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -3061,17 +3021,7 @@ exports[`add custom helm repository in preferences when navigating to preference
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -3765,17 +3715,7 @@ exports[`add custom helm repository in preferences when navigating to preference
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -4645,17 +4585,7 @@ exports[`add custom helm repository in preferences when navigating to preference
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -5349,17 +5279,7 @@ exports[`add custom helm repository in preferences when navigating to preference
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -6229,17 +6149,7 @@ exports[`add custom helm repository in preferences when navigating to preference
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -6933,17 +6843,7 @@ exports[`add custom helm repository in preferences when navigating to preference
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -7529,17 +7429,7 @@ exports[`add custom helm repository in preferences when navigating to preference
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -8125,17 +8015,7 @@ exports[`add custom helm repository in preferences when navigating to preference
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -564,17 +564,7 @@ exports[`add helm repository from list in preferences when navigating to prefere
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1159,17 +1149,7 @@ exports[`add helm repository from list in preferences when navigating to prefere
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1756,17 +1736,7 @@ exports[`add helm repository from list in preferences when navigating to prefere
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -2402,17 +2372,7 @@ exports[`add helm repository from list in preferences when navigating to prefere
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -2997,17 +2957,7 @@ exports[`add helm repository from list in preferences when navigating to prefere
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -3585,17 +3535,7 @@ exports[`add helm repository from list in preferences when navigating to prefere
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -4210,17 +4150,7 @@ exports[`add helm repository from list in preferences when navigating to prefere
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -4837,17 +4767,7 @@ exports[`add helm repository from list in preferences when navigating to prefere
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -5523,17 +5443,7 @@ exports[`add helm repository from list in preferences when navigating to prefere
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -6111,17 +6021,7 @@ exports[`add helm repository from list in preferences when navigating to prefere
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -564,17 +564,7 @@ exports[`listing active helm repositories in preferences when navigating to pref
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1152,17 +1142,7 @@ exports[`listing active helm repositories in preferences when navigating to pref
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1632,17 +1612,7 @@ exports[`listing active helm repositories in preferences when navigating to pref
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -2220,17 +2190,7 @@ exports[`listing active helm repositories in preferences when navigating to pref
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -2700,17 +2660,7 @@ exports[`listing active helm repositories in preferences when navigating to pref
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -3288,17 +3238,7 @@ exports[`listing active helm repositories in preferences when navigating to pref
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -3913,17 +3853,7 @@ exports[`listing active helm repositories in preferences when navigating to pref
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -4393,17 +4323,7 @@ exports[`listing active helm repositories in preferences when navigating to pref
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -4873,17 +4793,7 @@ exports[`listing active helm repositories in preferences when navigating to pref
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -5353,17 +5263,7 @@ exports[`listing active helm repositories in preferences when navigating to pref
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -564,17 +564,7 @@ exports[`remove helm repository from list of active repositories in preferences
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1159,17 +1149,7 @@ exports[`remove helm repository from list of active repositories in preferences
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1754,17 +1734,7 @@ exports[`remove helm repository from list of active repositories in preferences
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -2342,17 +2312,7 @@ exports[`remove helm repository from list of active repositories in preferences
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -637,17 +637,7 @@ exports[`preferences - closing-preferences given accessing preferences directly
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -901,17 +891,7 @@ exports[`preferences - closing-preferences given accessing preferences directly
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1031,17 +1011,7 @@ exports[`preferences - closing-preferences given accessing preferences directly
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1161,17 +1131,7 @@ exports[`preferences - closing-preferences given accessing preferences directly
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1821,17 +1781,7 @@ exports[`preferences - closing-preferences given already in a page and then navi
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -2085,17 +2035,7 @@ exports[`preferences - closing-preferences given already in a page and then navi
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -2349,17 +2289,7 @@ exports[`preferences - closing-preferences given already in a page and then navi
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -2613,17 +2543,7 @@ exports[`preferences - closing-preferences given already in a page and then navi
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -301,17 +301,7 @@ exports[`preferences - navigation to application preferences given in some child
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -949,17 +939,7 @@ exports[`preferences - navigation to application preferences given in some child
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -625,17 +625,7 @@ exports[`preferences - navigation to editor preferences given in preferences, wh
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1157,17 +1147,7 @@ exports[`preferences - navigation to editor preferences given in preferences, wh
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -290,17 +290,7 @@ exports[`preferences - navigation to extension specific preferences given in pre
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -600,17 +590,7 @@ exports[`preferences - navigation to extension specific preferences given in pre
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -910,17 +890,7 @@ exports[`preferences - navigation to extension specific preferences given in pre
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1243,17 +1213,7 @@ exports[`preferences - navigation to extension specific preferences given in pre
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1891,17 +1851,7 @@ exports[`preferences - navigation to extension specific preferences given in pre
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -2574,17 +2524,7 @@ exports[`preferences - navigation to extension specific preferences given in pre
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -2895,17 +2835,7 @@ exports[`preferences - navigation to extension specific preferences given in pre
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -3162,17 +3092,7 @@ exports[`preferences - navigation to extension specific preferences given in pre
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -3461,17 +3381,7 @@ exports[`preferences - navigation to extension specific preferences when navigat
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -3759,17 +3669,7 @@ exports[`preferences - navigation to extension specific preferences when navigat
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -625,17 +625,7 @@ exports[`preferences - navigation to kubernetes preferences given in preferences
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1187,17 +1177,7 @@ exports[`preferences - navigation to kubernetes preferences given in preferences
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -625,17 +625,7 @@ exports[`preferences - navigation to proxy preferences given in preferences, whe
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -949,17 +939,7 @@ exports[`preferences - navigation to proxy preferences given in preferences, whe
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -287,17 +287,7 @@ exports[`preferences - navigation to telemetry preferences given URL for Sentry
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -935,17 +925,7 @@ exports[`preferences - navigation to telemetry preferences given in preferences,
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1595,17 +1575,7 @@ exports[`preferences - navigation to telemetry preferences given in preferences,
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1893,17 +1863,7 @@ exports[`preferences - navigation to telemetry preferences given in preferences,
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -2154,17 +2114,7 @@ exports[`preferences - navigation to telemetry preferences given no URL for Sent
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -625,17 +625,7 @@ exports[`preferences - navigation to terminal preferences given in preferences,
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1124,17 +1114,7 @@ exports[`preferences - navigation to terminal preferences given in preferences,
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -187,17 +187,7 @@ exports[`preferences - navigation using application menu renders 1`] = `
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -835,17 +825,7 @@ exports[`preferences - navigation using application menu when navigating to pref
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -188,17 +188,7 @@ exports[`show-about-using-tray renders 1`] = `
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -838,17 +828,7 @@ exports[`show-about-using-tray when navigating using tray renders 1`] = `
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -189,15 +189,6 @@ exports[`status-bar-items-originating-from-extensions when application starts wh
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
<div
class="item"
>

View File

@ -187,17 +187,7 @@ exports[`welcome - navigation using application menu renders 1`] = `
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -836,17 +826,7 @@ exports[`welcome - navigation using application menu when navigated somewhere el
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"
@ -1047,17 +1027,7 @@ exports[`welcome - navigation using application menu when navigated somewhere el
<div
class="leftSide"
data-testid="status-bar-left"
>
<div
class="item"
>
<div
data-testid="app-update-not-available"
>
No new updates available
</div>
</div>
</div>
/>
<div
class="rightSide"
data-testid="status-bar-right"

View File

@ -6,11 +6,11 @@ import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx";
import { trayMenuItemInjectionToken } from "../tray/tray-menu-item/tray-menu-item-injection-token";
import discoveredUpdateVersionInjectable from "../../common/application-update/discovered-update-version/discovered-update-version.injectable";
import updateIsBeingDownloadedInjectable from "../../common/application-update/update-is-being-downloaded/update-is-being-downloaded.injectable";
import { withErrorSuppression } from "../../common/utils/with-error-suppression/with-error-suppression";
import { pipeline } from "@ogre-tools/fp";
import withErrorLoggingInjectable from "../../common/utils/with-error-logging/with-error-logging.injectable";
import quitAndInstallUpdateInjectable from "./quit-and-install-update.injectable";
import updateIsReadyToBeInstalledInjectable from "./update-is-ready-to-be-installed.injectable";
const installApplicationUpdateTrayItemInjectable = getInjectable({
id: "install-update-tray-item",
@ -18,8 +18,8 @@ const installApplicationUpdateTrayItemInjectable = getInjectable({
instantiate: (di) => {
const quitAndInstallUpdate = di.inject(quitAndInstallUpdateInjectable);
const discoveredVersionState = di.inject(discoveredUpdateVersionInjectable);
const downloadingUpdateState = di.inject(updateIsBeingDownloadedInjectable);
const withErrorLoggingFor = di.inject(withErrorLoggingInjectable);
const updateIsReadyToBeInstalled = di.inject(updateIsReadyToBeInstalledInjectable);
return {
id: "install-update",
@ -34,9 +34,7 @@ const installApplicationUpdateTrayItemInjectable = getInjectable({
enabled: computed(() => true),
visible: computed(
() => !!discoveredVersionState.value.get() && !downloadingUpdateState.value.get(),
),
visible: updateIsReadyToBeInstalled,
click: pipeline(
quitAndInstallUpdate,

View File

@ -0,0 +1,34 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx";
import getTrayIconPathInjectable from "../../tray/menu-icon/get-tray-icon-path.injectable";
import { trayIconInjectionToken } from "../../tray/menu-icon/tray-icon-injection-token";
import updatesAreBeingDiscoveredInjectable from "../../../common/application-update/updates-are-being-discovered/updates-are-being-discovered.injectable";
import updateIsBeingDownloadedInjectable from "../../../common/application-update/update-is-being-downloaded/update-is-being-downloaded.injectable";
const checkingForUpdatesTrayIconInjectable = getInjectable({
id: "checking-for-updates-tray-icon",
instantiate: (di) => {
const getTrayIconPath = di.inject(getTrayIconPathInjectable);
const updatesAreBeingDiscovered = di.inject(updatesAreBeingDiscoveredInjectable);
const updateIsBeingDownloaded = di.inject(updateIsBeingDownloadedInjectable);
return {
iconPath: getTrayIconPath("checking-for-updates"),
priority: 1,
shouldBeShown: computed(
() =>
updatesAreBeingDiscovered.value.get() ||
updateIsBeingDownloaded.value.get(),
),
};
},
injectionToken: trayIconInjectionToken,
});
export default checkingForUpdatesTrayIconInjectable;

View File

@ -0,0 +1,27 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import getTrayIconPathInjectable from "../../tray/menu-icon/get-tray-icon-path.injectable";
import { trayIconInjectionToken } from "../../tray/menu-icon/tray-icon-injection-token";
import updateIsReadyToBeInstalledInjectable from "../update-is-ready-to-be-installed.injectable";
const updateIsReadyToBeInstalledTrayIconInjectable = getInjectable({
id: "update-is-ready-to-be-installed-tray-icon",
instantiate: (di) => {
const getTrayIconPath = di.inject(getTrayIconPathInjectable);
const updateIsReadyToBeInstalled = di.inject(updateIsReadyToBeInstalledInjectable);
return {
iconPath: getTrayIconPath("update-available"),
priority: 1,
shouldBeShown: updateIsReadyToBeInstalled,
};
},
injectionToken: trayIconInjectionToken,
});
export default updateIsReadyToBeInstalledTrayIconInjectable;

View File

@ -0,0 +1,25 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx";
import discoveredUpdateVersionInjectable from "../../common/application-update/discovered-update-version/discovered-update-version.injectable";
import updateIsBeingDownloadedInjectable from "../../common/application-update/update-is-being-downloaded/update-is-being-downloaded.injectable";
const updateIsReadyToBeInstalledInjectable = getInjectable({
id: "update-is-ready-to-be-installed",
instantiate: (di) => {
const discoveredUpdateVersion = di.inject(discoveredUpdateVersionInjectable);
const updateIsBeingDownloaded = di.inject(updateIsBeingDownloadedInjectable);
return computed(
() =>
!!discoveredUpdateVersion.value.get() &&
!updateIsBeingDownloaded.value.get(),
);
},
});
export default updateIsReadyToBeInstalledInjectable;

View File

@ -8,8 +8,8 @@ import packageJsonInjectable from "../../../common/vars/package-json.injectable"
import showApplicationWindowInjectable from "../../start-main-application/lens-window/show-application-window.injectable";
import isWindowsInjectable from "../../../common/vars/is-windows.injectable";
import loggerInjectable from "../../../common/logger.injectable";
import trayIconPathsInjectable from "../tray-icon-path.injectable";
import { convertToElectronMenuTemplate } from "../reactive-tray-menu-items/converters";
import trayIconInjectable from "../menu-icon/tray-icon.injectable";
const TRAY_LOG_PREFIX = "[TRAY]";
@ -38,13 +38,13 @@ const electronTrayInjectable = getInjectable({
const showApplicationWindow = di.inject(showApplicationWindowInjectable);
const isWindows = di.inject(isWindowsInjectable);
const logger = di.inject(loggerInjectable);
const trayIconPaths = di.inject(trayIconPathsInjectable);
const trayIcon = di.inject(trayIconInjectable);
let tray: Tray;
return {
start: () => {
tray = new Tray(trayIconPaths.normal);
tray = new Tray(trayIcon.get().iconPath);
tray.setToolTip(packageJson.description);
tray.setIgnoreDoubleClickEvents(true);

View File

@ -0,0 +1,37 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import getAbsolutePathInjectable from "../../../common/path/get-absolute-path.injectable";
import staticFilesDirectoryInjectable from "../../../common/vars/static-files-directory.injectable";
import isDevelopmentInjectable from "../../../common/vars/is-development.injectable";
import isMacInjectable from "../../../common/vars/is-mac.injectable";
import { camelCase, flow, upperFirst } from "lodash/fp";
const upperCamelCase = flow(camelCase, upperFirst);
const getTrayIconPathInjectable = getInjectable({
id: "get-tray-icon-path",
instantiate: (di) => {
const getAbsolutePath = di.inject(getAbsolutePathInjectable);
const staticFilesDirectory = di.inject(staticFilesDirectoryInjectable);
const isDevelopment = di.inject(isDevelopmentInjectable);
const isMac = di.inject(isMacInjectable);
const baseIconDirectory = getAbsolutePath(
staticFilesDirectory,
isDevelopment ? "../build/tray" : "icons", // copied within electron-builder extras
);
const fileSuffix = isMac ? "Template.png" : ".png";
return (name: string) =>
getAbsolutePath(
baseIconDirectory,
`trayIcon${upperCamelCase(name)}${fileSuffix}`,
);
},
});
export default getTrayIconPathInjectable;

View File

@ -0,0 +1,26 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx";
import { trayIconInjectionToken } from "./tray-icon-injection-token";
import getTrayIconPathInjectable from "./get-tray-icon-path.injectable";
const normalTrayIconInjectable = getInjectable({
id: "normal-icon",
instantiate: (di) => {
const getTrayIconPath = di.inject(getTrayIconPathInjectable);
return {
iconPath: getTrayIconPath(""),
priority: 999,
shouldBeShown: computed(() => true),
};
},
injectionToken: trayIconInjectionToken,
});
export default normalTrayIconInjectable;

View File

@ -4,27 +4,22 @@
*/
import { getInjectable } from "@ogre-tools/injectable";
import { reaction } from "mobx";
import discoveredUpdateVersionInjectable from "../../../common/application-update/discovered-update-version/discovered-update-version.injectable";
import { getStartableStoppable } from "../../../common/utils/get-startable-stoppable";
import electronTrayInjectable from "../electron-tray/electron-tray.injectable";
import trayIconPathsInjectable from "../tray-icon-path.injectable";
import trayIconInjectable from "./tray-icon.injectable";
const reactiveTrayMenuIconInjectable = getInjectable({
id: "reactive-tray-menu-icon",
instantiate: (di) => {
const discoveredUpdateVersion = di.inject(discoveredUpdateVersionInjectable);
const trayMenuIcon = di.inject(trayIconInjectable);
const electronTray = di.inject(electronTrayInjectable);
const trayIconPaths = di.inject(trayIconPathsInjectable);
return getStartableStoppable("reactive-tray-menu-icon", () => (
reaction(
() => discoveredUpdateVersion.value.get(),
updateVersion => {
if (updateVersion) {
electronTray.setIconPath(trayIconPaths.updateAvailable);
} else {
electronTray.setIconPath(trayIconPaths.normal);
}
() => trayMenuIcon.get(),
icon => {
electronTray.setIconPath(icon.iconPath);
},
{
fireImmediately: true,

View File

@ -0,0 +1,16 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectionToken } from "@ogre-tools/injectable";
import type { IComputedValue } from "mobx";
export interface TrayIcon {
iconPath: string;
priority: number;
shouldBeShown: IComputedValue<boolean>;
}
export const trayIconInjectionToken = getInjectionToken<TrayIcon>({
id: "tray-icon-token",
});

View File

@ -0,0 +1,33 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { pipeline } from "@ogre-tools/fp";
import { find, sortBy } from "lodash/fp";
import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx";
import { trayIconInjectionToken } from "./tray-icon-injection-token";
const trayIconInjectable = getInjectable({
id: "tray-icon",
instantiate: (di) => {
const availableIcons = di.injectMany(trayIconInjectionToken);
return computed(() => {
const mostPrioritizedIcon = pipeline(
availableIcons,
sortBy((icon) => icon.priority),
find((icon) => icon.shouldBeShown.get()),
);
if (!mostPrioritizedIcon) {
throw new Error("There should always be tray icon which is shown.");
}
return mostPrioritizedIcon;
});
},
});
export default trayIconInjectable;

View File

@ -1,37 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import getAbsolutePathInjectable from "../../common/path/get-absolute-path.injectable";
import staticFilesDirectoryInjectable from "../../common/vars/static-files-directory.injectable";
import isDevelopmentInjectable from "../../common/vars/is-development.injectable";
import isMacInjectable from "../../common/vars/is-mac.injectable";
export interface TrayIconPaths {
normal: string;
updateAvailable: string;
}
const trayIconPathsInjectable = getInjectable({
id: "tray-icon-paths",
instantiate: (di): TrayIconPaths => {
const getAbsolutePath = di.inject(getAbsolutePathInjectable);
const staticFilesDirectory = di.inject(staticFilesDirectoryInjectable);
const isDevelopment = di.inject(isDevelopmentInjectable);
const isMac = di.inject(isMacInjectable);
const baseIconDirectory = getAbsolutePath(
staticFilesDirectory,
isDevelopment ? "../build/tray" : "icons", // copied within electron-builder extras
);
const fileSuffix = isMac ? "Template.png" : ".png";
return {
normal: getAbsolutePath(baseIconDirectory, `trayIcon${fileSuffix}`),
updateAvailable: getAbsolutePath(baseIconDirectory, `trayIconUpdateAvailable${fileSuffix}`),
};
},
});
export default trayIconPathsInjectable;

View File

@ -0,0 +1,6 @@
<svg version="1.1" id="Layer_1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1000 1000">
<path id="arrow" class="st0" d="M760,291.25L520.160841,258.873994l63.74222-72.777055C530.714286,132.984694,460.153061,103.75,385,103.75s-145.714286,29.234694-198.903061,82.346939C132.984694,239.285714,103.75,309.846939,103.75,385s29.234694,145.714286,82.346939,198.903061C239.209184,637.015306,309.846939,666.25,385,666.25s145.714286-29.234694,198.903061-82.346939c4.438776-4.438776,8.72449-9.030612,12.780612-13.69898l70.561224,61.760204C598.443878,710.408163,497.5,760,385,760C177.908163,760,10,592.091837,10,385s167.908163-375,375-375c103.545918,0,197.295918,42.015306,265.178571,109.821429l72.331514-70.086922L760,291.25Z" transform="translate(115 115)"/>
<animateTransform attributeType="xml" attributeName="transform" type="rotate" from="0 0 0" to="360 0 0" dur="3s" additive="sum" repeatCount="indefinite" />
</svg>

After

Width:  |  Height:  |  Size: 966 B

View File

@ -1,107 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { withInjectables } from "@ogre-tools/injectable-react";
import { observer } from "mobx-react";
import assert from "assert";
import React, { useState } from "react";
import { Spinner } from "../spinner";
import type { ProgressOfUpdateDownload } from "../../../common/application-update/progress-of-update-download/progress-of-update-download.injectable";
import progressOfUpdateDownloadInjectable from "../../../common/application-update/progress-of-update-download/progress-of-update-download.injectable";
import type { DiscoveredUpdateVersion } from "../../../common/application-update/discovered-update-version/discovered-update-version.injectable";
import discoveredUpdateVersionInjectable from "../../../common/application-update/discovered-update-version/discovered-update-version.injectable";
import type { UpdateIsBeingDownloaded } from "../../../common/application-update/update-is-being-downloaded/update-is-being-downloaded.injectable";
import updateIsBeingDownloadedInjectable from "../../../common/application-update/update-is-being-downloaded/update-is-being-downloaded.injectable";
import type { UpdatesAreBeingDiscovered } from "../../../common/application-update/updates-are-being-discovered/updates-are-being-discovered.injectable";
import updatesAreBeingDiscoveredInjectable from "../../../common/application-update/updates-are-being-discovered/updates-are-being-discovered.injectable";
import { reactiveNow } from "../../../common/utils/reactive-now/reactive-now";
interface Dependencies {
progressOfUpdateDownload: ProgressOfUpdateDownload;
discoveredVersionState: DiscoveredUpdateVersion;
downloadingUpdateState: UpdateIsBeingDownloaded;
checkingForUpdatesState: UpdatesAreBeingDiscovered;
}
interface EndNoteProps {
version?: string;
note: (version: string) => JSX.Element;
}
const EndNote = observer(({ version, note }: EndNoteProps) => {
const [start] = useState(Date.now());
if (start + 5000 <= reactiveNow()) {
return idle();
}
return note(version ?? "");
});
const checking = () => (
<>
<Spinner/>
<div data-testid="app-update-checking">Checking for updates...</div>
</>
);
const available = (version: string) => <div data-testid="app-update-available">{`${version ?? "Update"} is available`}</div>;
const notAvailable = () => <div data-testid="app-update-not-available">No new updates available</div>;
const downloading = (version: string) => {
return (
<>
<div data-testid="app-update-downloading">{`Downloading version ${version}...`}</div>
<Spinner/>
</>
);
};
const downloadFailed = (errMsg: string) => <div data-testid="app-update-download-failed">{errMsg}</div>;
const idle = () => <div data-testid="app-update-idle"></div>;
export const NonInjectedAutoUpdateComponent = observer(({
progressOfUpdateDownload,
discoveredVersionState,
downloadingUpdateState,
checkingForUpdatesState,
}: Dependencies) => {
const discoveredVersion = discoveredVersionState.value.get();
const { failed } = progressOfUpdateDownload.value.get();
if (downloadingUpdateState.value.get()) {
assert(discoveredVersion);
return downloading(discoveredVersion.version);
}
if (checkingForUpdatesState.value.get()) {
return checking();
}
if ( discoveredVersion) {
return <EndNote note={available} version={discoveredVersion.version} />;
}
if ( failed ) {
return <EndNote note={downloadFailed} version={failed} />;
}
return <EndNote note={notAvailable} />;
});
export const AutoUpdateComponent = withInjectables<Dependencies>(NonInjectedAutoUpdateComponent, {
getProps: (di, props) => ({
progressOfUpdateDownload: di.inject(progressOfUpdateDownloadInjectable),
discoveredVersionState: di.inject(discoveredUpdateVersionInjectable),
downloadingUpdateState: di.inject(updateIsBeingDownloadedInjectable),
checkingForUpdatesState: di.inject(updatesAreBeingDiscoveredInjectable),
...props,
}),
});

View File

@ -1,22 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx";
import { AutoUpdateComponent } from "./auto-update-component";
import { statusBarItemInjectionToken } from "./status-bar-item-injection-token";
const autoUpdateStatusBarItemInjectable = getInjectable({
id: "auto-update-status-bar-item",
instantiate: () => ({
component: AutoUpdateComponent,
position: "left" as const,
visible: computed(() => true),
}),
injectionToken: statusBarItemInjectionToken,
});
export default autoUpdateStatusBarItemInjectable;

View File

@ -43,7 +43,6 @@ import applicationWindowInjectable from "../../../main/start-main-application/le
import { getDiForUnitTesting as getRendererDi } from "../../getDiForUnitTesting";
import { getDiForUnitTesting as getMainDi } from "../../../main/getDiForUnitTesting";
import { overrideChannels } from "../../../test-utils/channel-fakes/override-channels";
import trayIconPathsInjectable from "../../../main/tray/tray-icon-path.injectable";
import assert from "assert";
import { openMenu } from "react-select-event";
import userEvent from "@testing-library/user-event";
@ -194,11 +193,7 @@ export const getApplicationBuilder = () => {
const traySetMenuItemsMock = jest.fn<any, [MinimalTrayMenuItem[]]>();
mainDi.override(electronTrayInjectable, () => ({
start: () => {
const iconPaths = mainDi.inject(trayIconPathsInjectable);
trayMenuIconPath = iconPaths.normal;
},
start: () => {},
stop: () => {},
setMenuItems: traySetMenuItemsMock,
setIconPath: (path) => {