mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-02-28 06:22:45 -08:00
refactor: extract overlay visibility facade runtime
This commit is contained in:
63
src/core/services/overlay-visibility-facade-service.test.ts
Normal file
63
src/core/services/overlay-visibility-facade-service.test.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
import test from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
import {
|
||||
OverlayVisibilityFacadeDeps,
|
||||
setVisibleOverlayVisibleRuntimeFacadeService,
|
||||
toggleInvisibleOverlayRuntimeFacadeService,
|
||||
toggleVisibleOverlayRuntimeFacadeService,
|
||||
} from "./overlay-visibility-facade-service";
|
||||
|
||||
function makeDeps(initialVisible = false, initialInvisible = false): {
|
||||
deps: OverlayVisibilityFacadeDeps;
|
||||
getState: () => { visible: boolean; invisible: boolean; mpvSubVisible: boolean | null };
|
||||
} {
|
||||
let visible = initialVisible;
|
||||
let invisible = initialInvisible;
|
||||
let mpvSubVisible: boolean | null = null;
|
||||
|
||||
const deps: OverlayVisibilityFacadeDeps = {
|
||||
getVisibleOverlayVisible: () => visible,
|
||||
getInvisibleOverlayVisible: () => invisible,
|
||||
setVisibleOverlayVisibleState: (value) => {
|
||||
visible = value;
|
||||
},
|
||||
setInvisibleOverlayVisibleState: (value) => {
|
||||
invisible = value;
|
||||
},
|
||||
updateVisibleOverlayVisibility: () => {},
|
||||
updateInvisibleOverlayVisibility: () => {},
|
||||
syncInvisibleOverlayMousePassthrough: () => {},
|
||||
shouldBindVisibleOverlayToMpvSubVisibility: () => true,
|
||||
isMpvConnected: () => true,
|
||||
setMpvSubVisibility: (value) => {
|
||||
mpvSubVisible = value;
|
||||
},
|
||||
};
|
||||
|
||||
return {
|
||||
deps,
|
||||
getState: () => ({ visible, invisible, mpvSubVisible }),
|
||||
};
|
||||
}
|
||||
|
||||
test("setVisibleOverlayVisibleRuntimeFacadeService updates visible state and mpv subtitle visibility", () => {
|
||||
const { deps, getState } = makeDeps(false, true);
|
||||
setVisibleOverlayVisibleRuntimeFacadeService(true, deps);
|
||||
assert.deepEqual(getState(), {
|
||||
visible: true,
|
||||
invisible: true,
|
||||
mpvSubVisible: false,
|
||||
});
|
||||
});
|
||||
|
||||
test("toggleVisibleOverlayRuntimeFacadeService flips visible overlay state", () => {
|
||||
const { deps, getState } = makeDeps(false, false);
|
||||
toggleVisibleOverlayRuntimeFacadeService(deps);
|
||||
assert.equal(getState().visible, true);
|
||||
});
|
||||
|
||||
test("toggleInvisibleOverlayRuntimeFacadeService flips invisible overlay state", () => {
|
||||
const { deps, getState } = makeDeps(false, false);
|
||||
toggleInvisibleOverlayRuntimeFacadeService(deps);
|
||||
assert.equal(getState().invisible, true);
|
||||
});
|
||||
64
src/core/services/overlay-visibility-facade-service.ts
Normal file
64
src/core/services/overlay-visibility-facade-service.ts
Normal file
@@ -0,0 +1,64 @@
|
||||
import {
|
||||
setInvisibleOverlayVisibleService,
|
||||
setVisibleOverlayVisibleService,
|
||||
} from "./overlay-visibility-runtime-service";
|
||||
|
||||
export interface OverlayVisibilityFacadeDeps {
|
||||
getVisibleOverlayVisible: () => boolean;
|
||||
getInvisibleOverlayVisible: () => boolean;
|
||||
setVisibleOverlayVisibleState: (visible: boolean) => void;
|
||||
setInvisibleOverlayVisibleState: (visible: boolean) => void;
|
||||
updateVisibleOverlayVisibility: () => void;
|
||||
updateInvisibleOverlayVisibility: () => void;
|
||||
syncInvisibleOverlayMousePassthrough: () => void;
|
||||
shouldBindVisibleOverlayToMpvSubVisibility: () => boolean;
|
||||
isMpvConnected: () => boolean;
|
||||
setMpvSubVisibility: (visible: boolean) => void;
|
||||
}
|
||||
|
||||
export function setVisibleOverlayVisibleRuntimeFacadeService(
|
||||
visible: boolean,
|
||||
deps: OverlayVisibilityFacadeDeps,
|
||||
): void {
|
||||
setVisibleOverlayVisibleService({
|
||||
visible,
|
||||
setVisibleOverlayVisibleState: deps.setVisibleOverlayVisibleState,
|
||||
updateVisibleOverlayVisibility: deps.updateVisibleOverlayVisibility,
|
||||
updateInvisibleOverlayVisibility: deps.updateInvisibleOverlayVisibility,
|
||||
syncInvisibleOverlayMousePassthrough: deps.syncInvisibleOverlayMousePassthrough,
|
||||
shouldBindVisibleOverlayToMpvSubVisibility:
|
||||
deps.shouldBindVisibleOverlayToMpvSubVisibility,
|
||||
isMpvConnected: deps.isMpvConnected,
|
||||
setMpvSubVisibility: deps.setMpvSubVisibility,
|
||||
});
|
||||
}
|
||||
|
||||
export function setInvisibleOverlayVisibleRuntimeFacadeService(
|
||||
visible: boolean,
|
||||
deps: OverlayVisibilityFacadeDeps,
|
||||
): void {
|
||||
setInvisibleOverlayVisibleService({
|
||||
visible,
|
||||
setInvisibleOverlayVisibleState: deps.setInvisibleOverlayVisibleState,
|
||||
updateInvisibleOverlayVisibility: deps.updateInvisibleOverlayVisibility,
|
||||
syncInvisibleOverlayMousePassthrough: deps.syncInvisibleOverlayMousePassthrough,
|
||||
});
|
||||
}
|
||||
|
||||
export function toggleVisibleOverlayRuntimeFacadeService(
|
||||
deps: OverlayVisibilityFacadeDeps,
|
||||
): void {
|
||||
setVisibleOverlayVisibleRuntimeFacadeService(
|
||||
!deps.getVisibleOverlayVisible(),
|
||||
deps,
|
||||
);
|
||||
}
|
||||
|
||||
export function toggleInvisibleOverlayRuntimeFacadeService(
|
||||
deps: OverlayVisibilityFacadeDeps,
|
||||
): void {
|
||||
setInvisibleOverlayVisibleRuntimeFacadeService(
|
||||
!deps.getInvisibleOverlayVisible(),
|
||||
deps,
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user