mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-05-26 12:55:16 -07:00
Fix CodeRabbit review feedback
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
export type StatsWindowLayerSuspensionState = {
|
||||
count: number;
|
||||
};
|
||||
|
||||
export function createStatsWindowLayerSuspensionState(): StatsWindowLayerSuspensionState {
|
||||
return { count: 0 };
|
||||
}
|
||||
|
||||
export function isStatsWindowLayerSuspended(state: StatsWindowLayerSuspensionState): boolean {
|
||||
return state.count > 0;
|
||||
}
|
||||
|
||||
export function suspendStatsWindowLayer(state: StatsWindowLayerSuspensionState): boolean {
|
||||
state.count += 1;
|
||||
return state.count === 1;
|
||||
}
|
||||
|
||||
export function restoreStatsWindowLayer(state: StatsWindowLayerSuspensionState): boolean {
|
||||
if (state.count <= 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
state.count -= 1;
|
||||
return state.count === 0;
|
||||
}
|
||||
|
||||
export function resetStatsWindowLayerSuspension(state: StatsWindowLayerSuspensionState): void {
|
||||
state.count = 0;
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import assert from 'node:assert/strict';
|
||||
import test from 'node:test';
|
||||
import {
|
||||
createStatsWindowLayerSuspensionState,
|
||||
isStatsWindowLayerSuspended,
|
||||
resetStatsWindowLayerSuspension,
|
||||
restoreStatsWindowLayer,
|
||||
suspendStatsWindowLayer,
|
||||
} from './stats-window-layer';
|
||||
|
||||
test('stats window layer suspension reset clears missed native dialog closes', () => {
|
||||
const state = createStatsWindowLayerSuspensionState();
|
||||
|
||||
assert.equal(suspendStatsWindowLayer(state), true);
|
||||
assert.equal(suspendStatsWindowLayer(state), false);
|
||||
assert.equal(isStatsWindowLayerSuspended(state), true);
|
||||
|
||||
resetStatsWindowLayerSuspension(state);
|
||||
|
||||
assert.equal(isStatsWindowLayerSuspended(state), false);
|
||||
assert.equal(restoreStatsWindowLayer(state), false);
|
||||
assert.equal(suspendStatsWindowLayer(state), true);
|
||||
});
|
||||
@@ -15,11 +15,18 @@ import {
|
||||
STATS_WINDOW_TITLE,
|
||||
} from './stats-window-runtime.js';
|
||||
import { ensureHyprlandWindowFloatingByTitle } from './hyprland-window-placement.js';
|
||||
import {
|
||||
createStatsWindowLayerSuspensionState,
|
||||
isStatsWindowLayerSuspended,
|
||||
resetStatsWindowLayerSuspension,
|
||||
restoreStatsWindowLayer,
|
||||
suspendStatsWindowLayer,
|
||||
} from './stats-window-layer.js';
|
||||
|
||||
let statsWindow: BrowserWindow | null = null;
|
||||
let toggleRegistered = false;
|
||||
let nativeDialogLayerRegistered = false;
|
||||
let nativeDialogLayerSuspensionCount = 0;
|
||||
const nativeDialogLayerSuspension = createStatsWindowLayerSuspensionState();
|
||||
|
||||
export interface StatsWindowOptions {
|
||||
/** Absolute path to stats/dist/ directory */
|
||||
@@ -67,7 +74,7 @@ function showStatsWindow(window: BrowserWindow, options: StatsWindowOptions): vo
|
||||
}
|
||||
|
||||
export function promoteStatsOverlayAbovePlayback(): boolean {
|
||||
if (nativeDialogLayerSuspensionCount > 0) {
|
||||
if (isStatsWindowLayerSuspended(nativeDialogLayerSuspension)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -91,8 +98,7 @@ export function demoteStatsOverlayBelowDialogs(): boolean {
|
||||
}
|
||||
|
||||
export function suspendStatsWindowLayerForNativeDialog(): void {
|
||||
nativeDialogLayerSuspensionCount += 1;
|
||||
if (nativeDialogLayerSuspensionCount !== 1) {
|
||||
if (!suspendStatsWindowLayer(nativeDialogLayerSuspension)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -100,16 +106,15 @@ export function suspendStatsWindowLayerForNativeDialog(): void {
|
||||
}
|
||||
|
||||
export function restoreStatsWindowLayerAfterNativeDialog(): void {
|
||||
if (nativeDialogLayerSuspensionCount <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
nativeDialogLayerSuspensionCount -= 1;
|
||||
if (nativeDialogLayerSuspensionCount === 0) {
|
||||
if (restoreStatsWindowLayer(nativeDialogLayerSuspension)) {
|
||||
promoteStatsOverlayAbovePlayback();
|
||||
}
|
||||
}
|
||||
|
||||
function resetStatsWindowLayerAfterLifecycleEnd(): void {
|
||||
resetStatsWindowLayerSuspension(nativeDialogLayerSuspension);
|
||||
}
|
||||
|
||||
export async function withStatsWindowLayerSuspendedForNativeDialog<T>(
|
||||
showDialog: () => Promise<T>,
|
||||
): Promise<T> {
|
||||
@@ -172,6 +177,7 @@ export function toggleStatsOverlay(options: StatsWindowOptions): void {
|
||||
statsWindow.on('closed', () => {
|
||||
options.onVisibilityChanged?.(false);
|
||||
statsWindow = null;
|
||||
resetStatsWindowLayerAfterLifecycleEnd();
|
||||
});
|
||||
|
||||
statsWindow.webContents.on('before-input-event', (event, input) => {
|
||||
@@ -222,4 +228,5 @@ export function destroyStatsWindow(): void {
|
||||
statsWindow.destroy();
|
||||
statsWindow = null;
|
||||
}
|
||||
resetStatsWindowLayerAfterLifecycleEnd();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user