mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-02-28 06:22:45 -08:00
refactor: extract overlay visibility runtime wiring
This commit is contained in:
74
src/main/runtime/overlay-visibility-runtime.test.ts
Normal file
74
src/main/runtime/overlay-visibility-runtime.test.ts
Normal 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);
|
||||
});
|
||||
78
src/main/runtime/overlay-visibility-runtime.ts
Normal file
78
src/main/runtime/overlay-visibility-runtime.ts
Normal 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,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user