mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-05-26 00:55:16 -07:00
42 lines
1.3 KiB
TypeScript
42 lines
1.3 KiB
TypeScript
export interface ConfigSettingsWindowLike {
|
|
isDestroyed(): boolean;
|
|
focus(): void;
|
|
loadFile(path: string): unknown;
|
|
on(event: 'closed', handler: () => void): unknown;
|
|
destroy?(): unknown;
|
|
}
|
|
|
|
export interface OpenConfigSettingsWindowDeps<TWindow extends ConfigSettingsWindowLike> {
|
|
getSettingsWindow(): TWindow | null;
|
|
setSettingsWindow(window: TWindow | null): void;
|
|
createSettingsWindow(): TWindow;
|
|
settingsHtmlPath: string;
|
|
log?: (message: string) => void;
|
|
}
|
|
|
|
export function createOpenConfigSettingsWindowHandler<TWindow extends ConfigSettingsWindowLike>(
|
|
deps: OpenConfigSettingsWindowDeps<TWindow>,
|
|
): () => boolean {
|
|
return () => {
|
|
const existing = deps.getSettingsWindow();
|
|
if (existing && !existing.isDestroyed()) {
|
|
existing.focus();
|
|
return true;
|
|
}
|
|
|
|
const window = deps.createSettingsWindow();
|
|
void Promise.resolve(window.loadFile(deps.settingsHtmlPath)).catch((error) => {
|
|
const message = error instanceof Error ? error.message : String(error);
|
|
deps.log?.(`Failed to load settings window: ${message}`);
|
|
deps.setSettingsWindow(null);
|
|
window.destroy?.();
|
|
});
|
|
deps.setSettingsWindow(window);
|
|
window.on('closed', () => {
|
|
deps.setSettingsWindow(null);
|
|
});
|
|
window.focus();
|
|
return true;
|
|
};
|
|
}
|