Skip to content

Commit 53e5631

Browse files
committed
dnd: Move duration logic from dnd-util.ts to index.ts and suppress tooltip on click.
Decouples logic for better separation of concerns and disables the tooltip to prevent dropdown overlap.
1 parent dc3f156 commit 53e5631

File tree

4 files changed

+30
-55
lines changed

4 files changed

+30
-55
lines changed

app/common/dnd-util.ts

Lines changed: 1 addition & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@ type Toggle = {
1818
newSettings: Partial<DndSettings>;
1919
};
2020

21-
let dndTimeout: NodeJS.Timeout | null = null;
22-
23-
export function toggle(durationInMinutes?: number): Toggle {
21+
export function toggle(): Toggle {
2422
const dnd = !ConfigUtil.getConfigItem("dnd", false);
2523
const dndSettingList: SettingName[] = ["showNotification", "silent"];
2624
if (process.platform === "win32") {
@@ -58,40 +56,6 @@ export function toggle(durationInMinutes?: number): Toggle {
5856
}
5957

6058
ConfigUtil.setConfigItem("dnd", dnd);
61-
if (dnd && durationInMinutes && !Number.isNaN(durationInMinutes)) {
62-
if (dndTimeout) {
63-
clearTimeout(dndTimeout);
64-
}
65-
66-
dndTimeout = setTimeout(
67-
() => {
68-
toggle(); // Revert DND after timeout
69-
70-
const restoredSettings = ConfigUtil.getConfigItem(
71-
"dndPreviousSettings",
72-
{
73-
showNotification: true,
74-
silent: false,
75-
...(process.platform === "win32" && {
76-
flashTaskbarOnMessage: true,
77-
}),
78-
},
79-
);
80-
81-
if (restoredSettings) {
82-
for (const settingName of dndSettingList) {
83-
ConfigUtil.setConfigItem(
84-
settingName,
85-
restoredSettings[settingName]!,
86-
);
87-
}
88-
}
89-
90-
ConfigUtil.setConfigItem("dnd", false);
91-
},
92-
durationInMinutes * 60 * 1000,
93-
);
94-
}
9559

9660
return {dnd, newSettings};
9761
}

app/common/typed-ipc.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ export type RendererMessage = {
6969
autoHideMenubar: boolean,
7070
updateMenu: boolean,
7171
) => void;
72+
"toggle-dnd-request": (duration?: number) => void;
7273
"toggle-dnd": (
7374
state: boolean,
7475
newSettings: Partial<DndSettings>,

app/main/index.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import * as remoteMain from "@electron/remote/main";
1818
import windowStateKeeper from "electron-window-state";
1919

2020
import * as ConfigUtil from "../common/config-util.js";
21+
import * as DNDUtil from "../common/dnd-util.js";
2122
import {bundlePath, bundleUrl, publicPath} from "../common/paths.js";
2223
import * as t from "../common/translation-util.js";
2324
import type {RendererMessage} from "../common/typed-ipc.js";
@@ -48,6 +49,8 @@ let badgeCount: number;
4849

4950
let isQuitting = false;
5051

52+
let dndRevertTimeout: NodeJS.Timeout | null = null;
53+
5154
// Load this file in main window
5255
const mainUrl = new URL("app/renderer/main.html", bundleUrl).href;
5356

@@ -403,10 +406,30 @@ function createMainWindow(): BrowserWindow {
403406
ipcMain.on(
404407
"forward-message",
405408
<Channel extends keyof RendererMessage>(
406-
_event: IpcMainEvent,
409+
event: IpcMainEvent,
407410
listener: Channel,
408411
...parameters: Parameters<RendererMessage[Channel]>
409412
) => {
413+
if (listener === "toggle-dnd-request") {
414+
const [duration] = parameters as [number?];
415+
const result = DNDUtil.toggle(); // Toggle DND
416+
send(event.sender, "toggle-dnd", result.dnd, result.newSettings);
417+
418+
if (result.dnd && duration && !Number.isNaN(duration)) {
419+
if (dndRevertTimeout) clearTimeout(dndRevertTimeout);
420+
421+
dndRevertTimeout = setTimeout(
422+
() => {
423+
const revert = DNDUtil.toggle();
424+
send(event.sender, "toggle-dnd", revert.dnd, revert.newSettings);
425+
},
426+
duration * 60 * 1000,
427+
);
428+
}
429+
430+
return;
431+
}
432+
410433
send(page, listener, ...parameters);
411434
},
412435
);

app/renderer/js/main.ts

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import * as Sentry from "@sentry/electron/renderer";
99

1010
import type {Config} from "../../common/config-util.js";
1111
import * as ConfigUtil from "../../common/config-util.js";
12-
import * as DNDUtil from "../../common/dnd-util.js";
1312
import type {DndSettings} from "../../common/dnd-util.js";
1413
import * as EnterpriseUtil from "../../common/enterprise-util.js";
1514
import {html} from "../../common/html.js";
@@ -444,8 +443,9 @@ export class ServerManagerView {
444443

445444
initLeftSidebarEvents(): void {
446445
this.$dndButton.addEventListener("click", () => {
447-
const dropdown = document.querySelector("dnd-dropdown");
446+
const dropdown = document.querySelector("#dnd-dropdown");
448447
dropdown?.classList.toggle("hidden");
448+
this.$dndTooltip.classList.add("hidden");
449449
});
450450
const dropdownItems = document.querySelectorAll("#dnd-dropdown div");
451451
for (const item of dropdownItems) {
@@ -454,22 +454,9 @@ export class ServerManagerView {
454454
const value = target.dataset.minutes;
455455
const duration = value === "forever" ? undefined : Number(value);
456456

457-
const dndUtil = DNDUtil.toggle(duration);
458-
if (dndUtil.dnd && duration !== undefined) {
459-
console.log(`[DND] Started for ${duration} minutes`);
460-
} else {
461-
console.log("[DND] No timeout set (manual resume)");
462-
}
463-
464-
ipcRenderer.send(
465-
"forward-message",
466-
"toggle-dnd",
467-
dndUtil.dnd,
468-
dndUtil.newSettings,
469-
duration,
470-
);
457+
ipcRenderer.send("forward-message", "toggle-dnd-request", duration);
471458

472-
document.querySelector("dnd-dropdown")?.classList.add("hidden");
459+
document.querySelector("#dnd-dropdown")?.classList.add("hidden");
473460
});
474461
}
475462

0 commit comments

Comments
 (0)