diff --git a/apps/desktop/src/app/components/passkeys.component.ts b/apps/desktop/src/app/components/passkeys.component.ts
index f2cffd88934..3ed675d44f8 100644
--- a/apps/desktop/src/app/components/passkeys.component.ts
+++ b/apps/desktop/src/app/components/passkeys.component.ts
@@ -2,6 +2,8 @@ import { Component } from "@angular/core";
import { JslibModule } from "@bitwarden/angular/jslib.module";
+import { DesktopSettingsService } from "../../platform/services/desktop-settings.service";
+
export type BrowserSyncVerificationDialogParams = {
fingerprint: string[];
};
@@ -9,7 +11,9 @@ export type BrowserSyncVerificationDialogParams = {
@Component({
standalone: true,
template: `
-
+

+
+
`,
imports: [JslibModule],
})
-export class PasskeysComponent {}
+export class PasskeysComponent {
+ constructor(private readonly desktopSettingsService: DesktopSettingsService) {}
+
+ async closeModal() {
+ console.log("closing modal");
+ await this.desktopSettingsService.setInModalMode(false);
+ }
+}
diff --git a/apps/desktop/src/main/tray.main.ts b/apps/desktop/src/main/tray.main.ts
index d8d160adbca..666a9370a05 100644
--- a/apps/desktop/src/main/tray.main.ts
+++ b/apps/desktop/src/main/tray.main.ts
@@ -211,6 +211,8 @@ export class TrayMain {
// Restyle existing
const existingWin = this.windowMain.win;
+ await this.desktopSettingsService.setInModalMode(true);
+
existingWin.setBounds({
width: 500,
height: 400,
diff --git a/apps/desktop/src/main/window.main.ts b/apps/desktop/src/main/window.main.ts
index 8e7cfdfc455..eb5441a0c07 100644
--- a/apps/desktop/src/main/window.main.ts
+++ b/apps/desktop/src/main/window.main.ts
@@ -3,7 +3,7 @@ import * as path from "path";
import * as url from "url";
import { app, BrowserWindow, ipcMain, nativeTheme, screen, session } from "electron";
-import { firstValueFrom } from "rxjs";
+import { concatMap, firstValueFrom, pairwise } from "rxjs";
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
import { AbstractStorageService } from "@bitwarden/common/platform/abstractions/storage.service";
@@ -11,6 +11,7 @@ import { processisolations } from "@bitwarden/desktop-napi";
import { BiometricStateService } from "@bitwarden/key-management";
import { WindowState } from "../platform/models/domain/window-state";
+import { applyMainWindowStyles } from "../platform/popup-modal-styles";
import { DesktopSettingsService } from "../platform/services/desktop-settings.service";
import {
cleanUserAgent,
@@ -45,7 +46,7 @@ export class WindowMain {
private desktopSettingsService: DesktopSettingsService,
private argvCallback: (argv: string[]) => void = null,
private createWindowCallback: (win: BrowserWindow) => void,
- ) {}
+ ) { }
init(): Promise
{
// Perform a hard reload of the render process by crashing it. This is suboptimal but ensures that all memory gets
@@ -69,6 +70,18 @@ export class WindowMain {
this.logService.info("Render process reloaded");
});
+ this.desktopSettingsService.inModalMode$
+ .pipe(
+ pairwise(),
+ concatMap(async ([lastValue, newValue]) => {
+ console.log("inModalMode updated", { lastValue, newValue });
+ if (lastValue && !newValue) {
+ applyMainWindowStyles(this.win, this.windowStates[mainWindowSizeKey]);
+ }
+ }),
+ )
+ .subscribe();
+
return new Promise((resolve, reject) => {
try {
if (!isMacAppStore() && !isSnapStore()) {
@@ -203,7 +216,6 @@ export class WindowMain {
},
});
} else {
- //
this.win = new BrowserWindow({
width: 450,
height: 450,
@@ -353,7 +365,16 @@ export class WindowMain {
}
private async updateWindowState(configKey: string, win: BrowserWindow) {
+ console.log("updateWindowState");
if (win == null || win.isDestroyed()) {
+ console.log("no window/destroyed");
+ return;
+ }
+
+ const inModalMode = await firstValueFrom(this.desktopSettingsService.inModalMode$);
+
+ if (inModalMode) {
+ console.log("in modal mode, ignore");
return;
}
diff --git a/apps/desktop/src/platform/popup-modal-styles.ts b/apps/desktop/src/platform/popup-modal-styles.ts
new file mode 100644
index 00000000000..3bd3abf92e3
--- /dev/null
+++ b/apps/desktop/src/platform/popup-modal-styles.ts
@@ -0,0 +1,15 @@
+import { BrowserWindow } from "electron";
+
+import { WindowState } from "./models/domain/window-state";
+
+export function applyPopupModalStyles(window: BrowserWindow) {
+ //
+}
+
+export function applyMainWindowStyles(window: BrowserWindow, existingWindowState: WindowState) {
+ window.setMinimumSize(400, 400);
+ window.setSize(existingWindowState.width, existingWindowState.height);
+ window.setPosition(existingWindowState.x, existingWindowState.y);
+ window.setWindowButtonVisibility(true);
+ window.setMenuBarVisibility(true);
+}
diff --git a/apps/desktop/src/platform/services/desktop-settings.service.ts b/apps/desktop/src/platform/services/desktop-settings.service.ts
index ff29ce50a0f..13b3de5bebd 100644
--- a/apps/desktop/src/platform/services/desktop-settings.service.ts
+++ b/apps/desktop/src/platform/services/desktop-settings.service.ts
@@ -71,6 +71,10 @@ const MINIMIZE_ON_COPY = new UserKeyDefinition(DESKTOP_SETTINGS_DISK, "
clearOn: [], // User setting, no need to clear
});
+const IN_MODAL_MODE = new KeyDefinition(DESKTOP_SETTINGS_DISK, "inModalMode", {
+ deserializer: (b) => b,
+});
+
/**
* Various settings for controlling application behavior specific to the desktop client.
*/
@@ -147,6 +151,10 @@ export class DesktopSettingsService {
*/
minimizeOnCopy$ = this.minimizeOnCopyState.state$.pipe(map(Boolean));
+ private readonly inModalModeState = this.stateProvider.getGlobal(IN_MODAL_MODE);
+
+ inModalMode$ = this.inModalModeState.state$.pipe(map(Boolean));
+
constructor(private stateProvider: StateProvider) {
this.window$ = this.windowState.state$.pipe(
map((window) =>
@@ -255,4 +263,7 @@ export class DesktopSettingsService {
async setMinimizeOnCopy(value: boolean, userId: UserId) {
await this.stateProvider.getUser(userId, MINIMIZE_ON_COPY).update(() => value);
}
+ async setInModalMode(value: boolean) {
+ await this.inModalModeState.update(() => value);
+ }
}