diff --git a/src/common/user-store.ts b/src/common/user-store.ts index 1a81c981f7..8faacbf85a 100644 --- a/src/common/user-store.ts +++ b/src/common/user-store.ts @@ -28,6 +28,7 @@ export interface UserPreferences { downloadBinariesPath?: string; kubectlBinariesPath?: string; trayEnabled?: boolean; + openAtLogin?: boolean; } export class UserStore extends BaseStore { @@ -39,14 +40,7 @@ export class UserStore extends BaseStore { migrations: migrations, }); - // track telemetry availability - reaction(() => this.preferences.allowTelemetry, allowed => { - tracker.event("telemetry", allowed ? "enabled" : "disabled"); - }); - - // refresh new contexts - this.whenLoaded.then(this.refreshNewContexts); - reaction(() => this.kubeConfigPath, this.refreshNewContexts); + this.handleOnLoad(); } @observable lastSeenAppVersion = "0.0.0" @@ -61,8 +55,31 @@ export class UserStore extends BaseStore { downloadMirror: "default", downloadKubectlBinaries: true, // Download kubectl binaries matching cluster version trayEnabled: true, + openAtLogin: true, }; + protected async handleOnLoad() { + await this.whenLoaded; + + // refresh new contexts + this.refreshNewContexts(); + reaction(() => this.kubeConfigPath, this.refreshNewContexts); + + if (app) { + // track telemetry availability + reaction(() => this.preferences.allowTelemetry, allowed => { + tracker.event("telemetry", allowed ? "enabled" : "disabled"); + }); + + // open at system start-up + reaction(() => this.preferences.openAtLogin, open => { + app.setLoginItemSettings({ openAtLogin: open }); + }, { + fireImmediately: true, + }); + } + } + get isNewVersion() { return semver.gt(getAppVersion(), this.lastSeenAppVersion); } diff --git a/src/main/window-manager.ts b/src/main/window-manager.ts index c0b6bba2db..e768058fb3 100644 --- a/src/main/window-manager.ts +++ b/src/main/window-manager.ts @@ -2,7 +2,7 @@ import type { ClusterId } from "../common/cluster-store"; import { clusterStore } from "../common/cluster-store"; import { userStore } from "../common/user-store"; import { observable, reaction } from "mobx"; -import { BrowserWindow, dialog, ipcMain, shell, webContents } from "electron" +import { app, BrowserWindow, dialog, ipcMain, shell, webContents } from "electron" import windowStateKeeper from "electron-window-state" import { initMenu } from "./menu"; import { initTray } from "./tray"; @@ -35,6 +35,8 @@ export class WindowManager { }); } if (!this.mainWindow) { + app.dock?.show(); // show icon in dock (mac-os only) + const { width, height, x, y } = this.windowState; this.mainWindow = new BrowserWindow({ x, y, width, height, @@ -62,6 +64,7 @@ export class WindowManager { this.windowState.unmanage(); this.mainWindow = null; this.splashWindow = null; + app.dock?.hide(); // hide icon in dock (mac-os) }) } try { diff --git a/src/renderer/components/+preferences/preferences.scss b/src/renderer/components/+preferences/preferences.scss index 62bd307cd1..57054af5d4 100644 --- a/src/renderer/components/+preferences/preferences.scss +++ b/src/renderer/components/+preferences/preferences.scss @@ -57,4 +57,8 @@ box-shadow: 0 0 0 1px $borderFaintColor; } } + + .Checkbox { + align-self: start; // limit clickable area to checkbox + text + } } \ No newline at end of file diff --git a/src/renderer/components/+preferences/preferences.tsx b/src/renderer/components/+preferences/preferences.tsx index 8b98750dac..9c67bbd5a6 100644 --- a/src/renderer/components/+preferences/preferences.tsx +++ b/src/renderer/components/+preferences/preferences.tsx @@ -173,6 +173,26 @@ export class Preferences extends React.Component { })} +

Auto start-up

+ Open on start-up} + value={preferences.openAtLogin} + onChange={v => preferences.openAtLogin = v} + /> + + Opens Lens app on operation system login + + +

Tray icon

+ Enable tray icon} + value={preferences.trayEnabled} + onChange={v => preferences.trayEnabled = v} + /> + + Adds OS-level tray icon and menu to get quick access to Lens + +

Certificate Trust

Allow untrusted Certificate Authorities} @@ -194,16 +214,6 @@ export class Preferences extends React.Component { Telemetry & usage data is collected to continuously improve the Lens experience. - -

Tray icon

- Enable tray icon} - value={preferences.trayEnabled} - onChange={v => preferences.trayEnabled = v} - /> - - Adds OS-level tray icon and menu to get quick access to Lens - );