diff --git a/src/renderer/app-freshness/app-update-warning.injectable.ts b/src/renderer/app-freshness/app-update-warning.injectable.ts new file mode 100644 index 0000000000..1555c22896 --- /dev/null +++ b/src/renderer/app-freshness/app-update-warning.injectable.ts @@ -0,0 +1,22 @@ +/** + * 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 { AppUpdateWarning } from "./app-update-warning"; + +const appUpdateWarningInjectable = getInjectable({ + id: "app-update-warning", + + instantiate: () => { + AppUpdateWarning.resetInstance(); + + return AppUpdateWarning.createInstance({ + releaseDate: "Wed, 04 May 2022 02:35:00 +0300", + }); + }, + + causesSideEffects: true, +}); + +export default appUpdateWarningInjectable; diff --git a/src/renderer/app-freshness/app-update-warning.ts b/src/renderer/app-freshness/app-update-warning.ts new file mode 100644 index 0000000000..5bae44c929 --- /dev/null +++ b/src/renderer/app-freshness/app-update-warning.ts @@ -0,0 +1,49 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { computed, makeObservable, observable } from "mobx"; +import type { UpdateAvailableFromMain } from "../../common/ipc"; +import { ipcRendererOn, UpdateAvailableChannel } from "../../common/ipc"; +import { Singleton } from "../utils"; +import moment from "moment"; + +interface Dependencies { + releaseDate: string; +} + +export class AppUpdateWarning extends Singleton { + @observable updateReleaseDate = ""; + + constructor(private dependencies: Dependencies) { + super(); + makeObservable(this); + + ipcRendererOn(UpdateAvailableChannel, (event, ...[, updateInfo]: UpdateAvailableFromMain) => { + this.updateReleaseDate = updateInfo.releaseDate; + }); + } + + @computed + get warningLevel(): "high" | "medium" | "light" | "" { + const update = moment(this.updateReleaseDate); + const release = moment(this.dependencies.releaseDate); + + const duration = moment.duration(update.diff(release)); + const days = duration.asDays(); + + if (days >= 27) { + return "high"; + } + + if (days >= 25 && days < 27) { + return "medium"; + } + + if (days >= 20 && days < 25) { + return "light"; + } + + return ""; + } +}