feat: add auto-importer for menu

This commit is contained in:
JellyBrick
2023-11-09 09:57:32 +09:00
parent 59426c56db
commit 05564d4a58
4 changed files with 16 additions and 37 deletions

View File

@ -12,6 +12,7 @@ export default defineConfig({
plugins: [ plugins: [
viteResolve({ viteResolve({
'virtual:MainPlugins': pluginVirtualModuleGenerator('back'), 'virtual:MainPlugins': pluginVirtualModuleGenerator('back'),
'virtual:MenuPlugins': pluginVirtualModuleGenerator('menu'),
}), }),
], ],
publicDir: 'assets', publicDir: 'assets',

View File

@ -7,21 +7,9 @@ import config from './config';
import { startingPages } from './providers/extracted-data'; import { startingPages } from './providers/extracted-data';
import promptOptions from './providers/prompt-options'; import promptOptions from './providers/prompt-options';
import adblockerMenu from './plugins/adblocker/menu'; // eslint-disable-next-line import/order
import ambientModeMenu from './plugins/ambient-mode/menu'; import { pluginList as menuList } from 'virtual:MenuPlugins';
import captionsSelectorMenu from './plugins/captions-selector/menu';
import crossfadeMenu from './plugins/crossfade/menu';
import disableAutoplayMenu from './plugins/disable-autoplay/menu';
import discordMenu from './plugins/discord/menu';
import downloaderMenu from './plugins/downloader/menu';
import inAppMenuTitlebarMenu from './plugins/in-app-menu/menu';
import lyricsGeniusMenu from './plugins/lyrics-genius/menu';
import notificationsMenu from './plugins/notifications/menu';
import pictureInPictureMenu from './plugins/picture-in-picture/menu';
import preciseVolumeMenu from './plugins/precise-volume/menu';
import shortcutsMenu from './plugins/shortcuts/menu';
import videoToggleMenu from './plugins/video-toggle/menu';
import visualizerMenu from './plugins/visualizer/menu';
import { getAvailablePluginNames } from './plugins/utils'; import { getAvailablePluginNames } from './plugins/utils';
export type MenuTemplate = Electron.MenuItemConstructorOptions[]; export type MenuTemplate = Electron.MenuItemConstructorOptions[];
@ -31,24 +19,6 @@ const inAppMenuActive = config.plugins.isEnabled('in-app-menu');
const betaPlugins = ['crossfade', 'lumiastream']; const betaPlugins = ['crossfade', 'lumiastream'];
const pluginMenus = {
'adblocker': adblockerMenu,
'ambient-mode': ambientModeMenu,
'disable-autoplay': disableAutoplayMenu,
'captions-selector': captionsSelectorMenu,
'crossfade': crossfadeMenu,
'discord': discordMenu,
'downloader': downloaderMenu,
'in-app-menu': inAppMenuTitlebarMenu,
'lyrics-genius': lyricsGeniusMenu,
'notifications': notificationsMenu,
'picture-in-picture': pictureInPictureMenu,
'precise-volume': preciseVolumeMenu,
'shortcuts': shortcutsMenu,
'video-toggle': videoToggleMenu,
'visualizer': visualizerMenu,
};
const pluginEnabledMenu = (plugin: string, label = '', hasSubmenu = false, refreshMenu: (() => void ) | undefined = undefined): Electron.MenuItemConstructorOptions => ({ const pluginEnabledMenu = (plugin: string, label = '', hasSubmenu = false, refreshMenu: (() => void ) | undefined = undefined): Electron.MenuItemConstructorOptions => ({
label: label || plugin, label: label || plugin,
type: 'checkbox', type: 'checkbox',
@ -86,8 +56,8 @@ export const mainMenuTemplate = (win: BrowserWindow): MenuTemplate => {
pluginLabel += ' [beta]'; pluginLabel += ' [beta]';
} }
if (Object.hasOwn(pluginMenus, pluginName)) { if (Object.hasOwn(menuList, pluginName)) {
const getPluginMenu = pluginMenus[pluginName as keyof typeof pluginMenus]; const getPluginMenu = menuList[pluginName];
if (!config.plugins.isEnabled(pluginName)) { if (!config.plugins.isEnabled(pluginName)) {
return pluginEnabledMenu(pluginName, pluginLabel, true, innerRefreshMenu); return pluginEnabledMenu(pluginName, pluginLabel, true, innerRefreshMenu);
@ -98,7 +68,7 @@ export const mainMenuTemplate = (win: BrowserWindow): MenuTemplate => {
submenu: [ submenu: [
pluginEnabledMenu(pluginName, 'Enabled', true, innerRefreshMenu), pluginEnabledMenu(pluginName, 'Enabled', true, innerRefreshMenu),
{ type: 'separator' }, { type: 'separator' },
...getPluginMenu(win, config.plugins.getOptions(pluginName), innerRefreshMenu), ...(getPluginMenu(win, config.plugins.getOptions(pluginName), innerRefreshMenu) as MenuTemplate),
], ],
} satisfies Electron.MenuItemConstructorOptions; } satisfies Electron.MenuItemConstructorOptions;
} }

View File

@ -5,6 +5,14 @@ declare module 'virtual:MainPlugins' {
export const pluginList: Record<string, (win: BrowserWindow, options: ConfigType) => Promise<void>>; export const pluginList: Record<string, (win: BrowserWindow, options: ConfigType) => Promise<void>>;
} }
declare module 'virtual:MenuPlugins' {
import type { BrowserWindow } from 'electron';
import type { MenuTemplate } from './menu';
import type { ConfigType } from './config/dynamic';
export const pluginList: Record<string, (win: BrowserWindow, options: ConfigType, refreshMenu: () => void) => MenuTemplate>;
}
declare module 'virtual:PreloadPlugins' { declare module 'virtual:PreloadPlugins' {
export const pluginList: Record<string, () => Promise<void>>; export const pluginList: Record<string, () => Promise<void>>;
} }

View File

@ -5,7 +5,7 @@ import { globSync } from 'glob';
const snakeToCamel = (text: string) => text.replace(/-(\w)/g, (_, letter: string) => letter.toUpperCase()); const snakeToCamel = (text: string) => text.replace(/-(\w)/g, (_, letter: string) => letter.toUpperCase());
export const pluginVirtualModuleGenerator = (mode: 'back' | 'preload' | 'front') => { export const pluginVirtualModuleGenerator = (mode: 'back' | 'preload' | 'front' | 'menu') => {
const srcPath = resolve(__dirname, '..', 'src'); const srcPath = resolve(__dirname, '..', 'src');
const plugins = globSync(`${srcPath}/plugins/*`) const plugins = globSync(`${srcPath}/plugins/*`)