refactor: extract overlay visibility runtime wiring

This commit is contained in:
2026-02-20 02:02:52 -08:00
parent 3aeb10ae61
commit 5b432fa156
5 changed files with 191 additions and 83 deletions

View File

@@ -0,0 +1,74 @@
import assert from 'node:assert/strict';
import test from 'node:test';
import { createOverlayVisibilityRuntime } from './overlay-visibility-runtime';
test('overlay visibility runtime wires set/toggle handlers through composed deps', () => {
let visible = false;
let invisible = true;
let setVisibleCoreCalls = 0;
let setInvisibleCoreCalls = 0;
let lastBoundSubVisibility: boolean | null = null;
const runtime = createOverlayVisibilityRuntime({
setVisibleOverlayVisibleDeps: {
setVisibleOverlayVisibleCore: (options) => {
setVisibleCoreCalls += 1;
options.setVisibleOverlayVisibleState(options.visible);
options.updateVisibleOverlayVisibility();
options.updateInvisibleOverlayVisibility();
options.syncInvisibleOverlayMousePassthrough();
if (options.shouldBindVisibleOverlayToMpvSubVisibility() && options.isMpvConnected()) {
options.setMpvSubVisibility(options.visible);
}
},
setVisibleOverlayVisibleState: (nextVisible) => {
visible = nextVisible;
},
updateVisibleOverlayVisibility: () => {},
updateInvisibleOverlayVisibility: () => {},
syncInvisibleOverlayMousePassthrough: () => {},
shouldBindVisibleOverlayToMpvSubVisibility: () => true,
isMpvConnected: () => true,
setMpvSubVisibility: (nextVisible) => {
lastBoundSubVisibility = nextVisible;
},
},
setInvisibleOverlayVisibleDeps: {
setInvisibleOverlayVisibleCore: (options) => {
setInvisibleCoreCalls += 1;
options.setInvisibleOverlayVisibleState(options.visible);
options.updateInvisibleOverlayVisibility();
options.syncInvisibleOverlayMousePassthrough();
},
setInvisibleOverlayVisibleState: (nextVisible) => {
invisible = nextVisible;
},
updateInvisibleOverlayVisibility: () => {},
syncInvisibleOverlayMousePassthrough: () => {},
},
getVisibleOverlayVisible: () => visible,
getInvisibleOverlayVisible: () => invisible,
});
runtime.setVisibleOverlayVisible(true);
assert.equal(visible, true);
assert.equal(lastBoundSubVisibility, true);
runtime.toggleVisibleOverlay();
assert.equal(visible, false);
runtime.setOverlayVisible(true);
assert.equal(visible, true);
runtime.toggleOverlay();
assert.equal(visible, false);
runtime.setInvisibleOverlayVisible(false);
assert.equal(invisible, false);
runtime.toggleInvisibleOverlay();
assert.equal(invisible, true);
assert.equal(setVisibleCoreCalls, 4);
assert.equal(setInvisibleCoreCalls, 2);
});

View File

@@ -0,0 +1,78 @@
import {
createSetInvisibleOverlayVisibleHandler,
createSetVisibleOverlayVisibleHandler,
createToggleInvisibleOverlayHandler,
createToggleVisibleOverlayHandler,
} from './overlay-visibility-actions';
import {
createBuildSetInvisibleOverlayVisibleMainDepsHandler,
createBuildSetVisibleOverlayVisibleMainDepsHandler,
createBuildToggleInvisibleOverlayMainDepsHandler,
createBuildToggleVisibleOverlayMainDepsHandler,
} from './overlay-visibility-actions-main-deps';
import { createSetOverlayVisibleHandler, createToggleOverlayHandler } from './overlay-main-actions';
import {
createBuildSetOverlayVisibleMainDepsHandler,
createBuildToggleOverlayMainDepsHandler,
} from './overlay-main-actions-main-deps';
type SetVisibleOverlayVisibleMainDeps = Parameters<
typeof createBuildSetVisibleOverlayVisibleMainDepsHandler
>[0];
type SetInvisibleOverlayVisibleMainDeps = Parameters<
typeof createBuildSetInvisibleOverlayVisibleMainDepsHandler
>[0];
export type OverlayVisibilityRuntimeDeps = {
setVisibleOverlayVisibleDeps: SetVisibleOverlayVisibleMainDeps;
setInvisibleOverlayVisibleDeps: SetInvisibleOverlayVisibleMainDeps;
getVisibleOverlayVisible: () => boolean;
getInvisibleOverlayVisible: () => boolean;
};
export function createOverlayVisibilityRuntime(deps: OverlayVisibilityRuntimeDeps) {
const setVisibleOverlayVisibleMainDeps = createBuildSetVisibleOverlayVisibleMainDepsHandler(
deps.setVisibleOverlayVisibleDeps,
)();
const setVisibleOverlayVisible = createSetVisibleOverlayVisibleHandler(
setVisibleOverlayVisibleMainDeps,
);
const setInvisibleOverlayVisibleMainDeps = createBuildSetInvisibleOverlayVisibleMainDepsHandler(
deps.setInvisibleOverlayVisibleDeps,
)();
const setInvisibleOverlayVisible = createSetInvisibleOverlayVisibleHandler(
setInvisibleOverlayVisibleMainDeps,
);
const toggleVisibleOverlayMainDeps = createBuildToggleVisibleOverlayMainDepsHandler({
getVisibleOverlayVisible: deps.getVisibleOverlayVisible,
setVisibleOverlayVisible: (visible) => setVisibleOverlayVisible(visible),
})();
const toggleVisibleOverlay = createToggleVisibleOverlayHandler(toggleVisibleOverlayMainDeps);
const toggleInvisibleOverlayMainDeps = createBuildToggleInvisibleOverlayMainDepsHandler({
getInvisibleOverlayVisible: deps.getInvisibleOverlayVisible,
setInvisibleOverlayVisible: (visible) => setInvisibleOverlayVisible(visible),
})();
const toggleInvisibleOverlay = createToggleInvisibleOverlayHandler(toggleInvisibleOverlayMainDeps);
const setOverlayVisibleMainDeps = createBuildSetOverlayVisibleMainDepsHandler({
setVisibleOverlayVisible: (visible) => setVisibleOverlayVisible(visible),
})();
const setOverlayVisible = createSetOverlayVisibleHandler(setOverlayVisibleMainDeps);
const toggleOverlayMainDeps = createBuildToggleOverlayMainDepsHandler({
toggleVisibleOverlay: () => toggleVisibleOverlay(),
})();
const toggleOverlay = createToggleOverlayHandler(toggleOverlayMainDeps);
return {
setVisibleOverlayVisible,
setInvisibleOverlayVisible,
toggleVisibleOverlay,
toggleInvisibleOverlay,
setOverlayVisible,
toggleOverlay,
};
}