mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-16 12:42:06 +00:00
fix: fix onConfigChange
This commit is contained in:
15
src/index.ts
15
src/index.ts
@ -47,7 +47,7 @@ import {
|
|||||||
getAllLoadedMainPlugins,
|
getAllLoadedMainPlugins,
|
||||||
loadAllMainPlugins,
|
loadAllMainPlugins,
|
||||||
} from '@/loader/main';
|
} from '@/loader/main';
|
||||||
import { PluginBaseConfig } from '@/plugins/utils/builder';
|
import {PluginConfig, PluginDef} from "@/types/plugins";
|
||||||
|
|
||||||
// Catch errors and log them
|
// Catch errors and log them
|
||||||
unhandled({
|
unhandled({
|
||||||
@ -113,11 +113,11 @@ ipcMain.handle('get-main-plugin-names', () => Object.keys(mainPlugins));
|
|||||||
const initHook = (win: BrowserWindow) => {
|
const initHook = (win: BrowserWindow) => {
|
||||||
ipcMain.handle(
|
ipcMain.handle(
|
||||||
'get-config',
|
'get-config',
|
||||||
(_, id: keyof PluginBuilderList) =>
|
(_, id: string) =>
|
||||||
deepmerge(
|
deepmerge(
|
||||||
mainPlugins[id].config,
|
mainPlugins[id].config,
|
||||||
config.get(`plugins.${id}`) ?? {},
|
config.get(`plugins.${id}`) ?? {},
|
||||||
) as PluginBuilderList[typeof id]['config'],
|
) as PluginConfig,
|
||||||
);
|
);
|
||||||
ipcMain.handle('set-config', (_, name: string, obj: object) =>
|
ipcMain.handle('set-config', (_, name: string, obj: object) =>
|
||||||
config.setPartial(`plugins.${name}`, obj),
|
config.setPartial(`plugins.${name}`, obj),
|
||||||
@ -137,11 +137,11 @@ const initHook = (win: BrowserWindow) => {
|
|||||||
const isEqual = deepEqual(oldPluginConfigList[id], newPluginConfig);
|
const isEqual = deepEqual(oldPluginConfigList[id], newPluginConfig);
|
||||||
|
|
||||||
if (!isEqual) {
|
if (!isEqual) {
|
||||||
const oldConfig = oldPluginConfigList[id] as PluginBaseConfig;
|
const oldConfig = oldPluginConfigList[id] as PluginConfig;
|
||||||
const config = deepmerge(
|
const config = deepmerge(
|
||||||
mainPlugins[id].config,
|
mainPlugins[id].config,
|
||||||
newPluginConfig,
|
newPluginConfig,
|
||||||
) as PluginBaseConfig;
|
) as PluginConfig;
|
||||||
|
|
||||||
if (config.enabled !== oldConfig?.enabled) {
|
if (config.enabled !== oldConfig?.enabled) {
|
||||||
if (config.enabled) {
|
if (config.enabled) {
|
||||||
@ -159,9 +159,10 @@ const initHook = (win: BrowserWindow) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const mainPlugin = getAllLoadedMainPlugins()[id];
|
const mainPlugin = getAllLoadedMainPlugins()[id] as PluginDef<unknown, unknown, unknown>;
|
||||||
if (mainPlugin) {
|
if (mainPlugin) {
|
||||||
if (config.enabled) {
|
if (config.enabled && typeof mainPlugin.backend !== 'function') {
|
||||||
|
mainPlugin.backend?.onConfigChange?.(config);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,8 +7,10 @@ import { MenuContext } from '@/types/contexts';
|
|||||||
import config from '@/config';
|
import config from '@/config';
|
||||||
import { setApplicationMenu } from '@/menu';
|
import { setApplicationMenu } from '@/menu';
|
||||||
|
|
||||||
|
import type { PluginConfig } from '@/types/plugins';
|
||||||
|
|
||||||
const menuTemplateMap: Record<string, MenuItemConstructorOptions[]> = {};
|
const menuTemplateMap: Record<string, MenuItemConstructorOptions[]> = {};
|
||||||
const createContext = (id: string, win: BrowserWindow): MenuContext => ({
|
const createContext = (id: string, win: BrowserWindow): MenuContext<PluginConfig> => ({
|
||||||
getConfig: () => config.plugins.getOptions(id),
|
getConfig: () => config.plugins.getOptions(id),
|
||||||
setConfig: (newConfig) => {
|
setConfig: (newConfig) => {
|
||||||
config.setPartial(`plugins.${id}`, newConfig);
|
config.setPartial(`plugins.${id}`, newConfig);
|
||||||
@ -23,13 +25,13 @@ const createContext = (id: string, win: BrowserWindow): MenuContext => ({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export const forceLoadMenuPlugin = (id: string, win: BrowserWindow) => {
|
export const forceLoadMenuPlugin = async (id: string, win: BrowserWindow) => {
|
||||||
try {
|
try {
|
||||||
const plugin = allPlugins[id];
|
const plugin = allPlugins[id];
|
||||||
if (!plugin) return;
|
if (!plugin) return;
|
||||||
|
|
||||||
const menu = plugin.menu?.(createContext(id, win));
|
const menu = plugin.menu?.(createContext(id, win));
|
||||||
if (menu) menuTemplateMap[id] = menu;
|
if (menu) menuTemplateMap[id] = await menu;
|
||||||
else return;
|
else return;
|
||||||
|
|
||||||
console.log('[YTMusic]', `Successfully loaded '${id}::menu'`);
|
console.log('[YTMusic]', `Successfully loaded '${id}::menu'`);
|
||||||
@ -42,7 +44,7 @@ export const loadAllMenuPlugins = (win: BrowserWindow) => {
|
|||||||
const pluginConfigs = config.plugins.getPlugins();
|
const pluginConfigs = config.plugins.getPlugins();
|
||||||
|
|
||||||
for (const [pluginId, pluginDef] of Object.entries(allPlugins)) {
|
for (const [pluginId, pluginDef] of Object.entries(allPlugins)) {
|
||||||
const config = deepmerge(pluginDef.config, pluginConfigs[pluginId] ?? {});
|
const config = deepmerge(pluginDef.config, pluginConfigs[pluginId] ?? {}) as PluginConfig;
|
||||||
|
|
||||||
if (config.enabled) {
|
if (config.enabled) {
|
||||||
forceLoadMenuPlugin(pluginId, win);
|
forceLoadMenuPlugin(pluginId, win);
|
||||||
|
|||||||
@ -1,14 +1,14 @@
|
|||||||
import { deepmerge } from 'deepmerge-ts';
|
import { deepmerge } from 'deepmerge-ts';
|
||||||
import { preloadPlugins } from 'virtual:plugins';
|
import { preloadPlugins } from 'virtual:plugins';
|
||||||
|
|
||||||
import { type PluginDef } from '@/types/plugins';
|
import type { PluginConfig, PluginDef } from '@/types/plugins';
|
||||||
import { type PreloadContext } from '@/types/contexts';
|
import { type PreloadContext } from '@/types/contexts';
|
||||||
import { startPlugin, stopPlugin } from '@/utils';
|
import { startPlugin, stopPlugin } from '@/utils';
|
||||||
|
|
||||||
import config from '@/config';
|
import config from '@/config';
|
||||||
|
|
||||||
const loadedPluginMap: Record<string, PluginDef> = {};
|
const loadedPluginMap: Record<string, PluginDef<unknown, unknown, unknown>> = {};
|
||||||
const createContext = (id: string): PreloadContext => ({
|
const createContext = (id: string): PreloadContext<PluginConfig> => ({
|
||||||
getConfig: () => config.plugins.getOptions(id),
|
getConfig: () => config.plugins.getOptions(id),
|
||||||
setConfig: (newConfig) => {
|
setConfig: (newConfig) => {
|
||||||
config.setPartial(`plugins.${id}`, newConfig);
|
config.setPartial(`plugins.${id}`, newConfig);
|
||||||
@ -52,7 +52,7 @@ export const loadAllPreloadPlugins = () => {
|
|||||||
const pluginConfigs = config.plugins.getPlugins();
|
const pluginConfigs = config.plugins.getPlugins();
|
||||||
|
|
||||||
for (const [pluginId, pluginDef] of Object.entries(preloadPlugins)) {
|
for (const [pluginId, pluginDef] of Object.entries(preloadPlugins)) {
|
||||||
const config = deepmerge(pluginDef.config, pluginConfigs[pluginId] ?? {});
|
const config = deepmerge(pluginDef.config, pluginConfigs[pluginId] ?? {}) as PluginConfig;
|
||||||
|
|
||||||
if (config.enabled) {
|
if (config.enabled) {
|
||||||
forceLoadPreloadPlugin(pluginId);
|
forceLoadPreloadPlugin(pluginId);
|
||||||
@ -70,7 +70,7 @@ export const unloadAllPreloadPlugins = () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getLoadedPreloadPlugin = (id: string): PluginDef | undefined => {
|
export const getLoadedPreloadPlugin = (id: string): PluginDef<unknown, unknown, unknown> | undefined => {
|
||||||
return loadedPluginMap[id];
|
return loadedPluginMap[id];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import { PluginConfig, PluginDef } from '@/types/plugins';
|
|||||||
import { startPlugin, stopPlugin } from '@/utils';
|
import { startPlugin, stopPlugin } from '@/utils';
|
||||||
|
|
||||||
const unregisterStyleMap: Record<string, (() => void)[]> = {};
|
const unregisterStyleMap: Record<string, (() => void)[]> = {};
|
||||||
const loadedPluginMap: Record<string, PluginDef<unknown, unknown, unknown, PluginConfig>> = {};
|
const loadedPluginMap: Record<string, PluginDef<unknown, unknown, unknown>> = {};
|
||||||
|
|
||||||
const createContext = <Config extends PluginConfig>(id: string): RendererContext<Config> => ({
|
const createContext = <Config extends PluginConfig>(id: string): RendererContext<Config> => ({
|
||||||
getConfig: () => window.mainConfig.plugins.getOptions(id),
|
getConfig: () => window.mainConfig.plugins.getOptions(id),
|
||||||
@ -77,7 +77,7 @@ export const loadAllRendererPlugins = () => {
|
|||||||
const pluginConfigs = window.mainConfig.plugins.getPlugins();
|
const pluginConfigs = window.mainConfig.plugins.getPlugins();
|
||||||
|
|
||||||
for (const [pluginId, pluginDef] of Object.entries(rendererPlugins)) {
|
for (const [pluginId, pluginDef] of Object.entries(rendererPlugins)) {
|
||||||
const config = deepmerge(pluginDef.config, pluginConfigs[pluginId] ?? {});
|
const config = deepmerge(pluginDef.config, pluginConfigs[pluginId] ?? {}) as PluginConfig;
|
||||||
|
|
||||||
if (config.enabled) {
|
if (config.enabled) {
|
||||||
forceLoadRendererPlugin(pluginId);
|
forceLoadRendererPlugin(pluginId);
|
||||||
@ -95,7 +95,7 @@ export const unloadAllRendererPlugins = () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getLoadedRendererPlugin = (id: string): PluginDef | undefined => {
|
export const getLoadedRendererPlugin = (id: string): PluginDef<unknown, unknown, unknown> | undefined => {
|
||||||
return loadedPluginMap[id];
|
return loadedPluginMap[id];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,3 @@
|
|||||||
import {
|
|
||||||
PluginBaseConfig,
|
|
||||||
} from '@/plugins/utils/builder';
|
|
||||||
|
|
||||||
import { startingPages } from './providers/extracted-data';
|
import { startingPages } from './providers/extracted-data';
|
||||||
import setupSongInfo from './providers/song-info-front';
|
import setupSongInfo from './providers/song-info-front';
|
||||||
import {
|
import {
|
||||||
@ -12,6 +8,7 @@ import {
|
|||||||
loadAllRendererPlugins,
|
loadAllRendererPlugins,
|
||||||
} from './loader/renderer';
|
} from './loader/renderer';
|
||||||
|
|
||||||
|
import type { PluginConfig } from '@/types/plugins';
|
||||||
import type { YoutubePlayer } from '@/types/youtube-player';
|
import type { YoutubePlayer } from '@/types/youtube-player';
|
||||||
|
|
||||||
let api: (Element & YoutubePlayer) | null = null;
|
let api: (Element & YoutubePlayer) | null = null;
|
||||||
@ -126,13 +123,13 @@ function onApiLoaded() {
|
|||||||
|
|
||||||
window.ipcRenderer.on(
|
window.ipcRenderer.on(
|
||||||
'plugin:unload',
|
'plugin:unload',
|
||||||
(_event, id: keyof PluginBuilderList) => {
|
(_event, id: string) => {
|
||||||
forceUnloadRendererPlugin(id);
|
forceUnloadRendererPlugin(id);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
window.ipcRenderer.on(
|
window.ipcRenderer.on(
|
||||||
'plugin:enable',
|
'plugin:enable',
|
||||||
(_event, id: keyof PluginBuilderList) => {
|
(_event, id: string) => {
|
||||||
forceLoadRendererPlugin(id);
|
forceLoadRendererPlugin(id);
|
||||||
if (api) {
|
if (api) {
|
||||||
const plugin = getLoadedRendererPlugin(id);
|
const plugin = getLoadedRendererPlugin(id);
|
||||||
@ -145,7 +142,7 @@ function onApiLoaded() {
|
|||||||
|
|
||||||
window.ipcRenderer.on(
|
window.ipcRenderer.on(
|
||||||
'config-changed',
|
'config-changed',
|
||||||
(_event, id: string, newConfig: PluginBaseConfig) => {
|
(_event, id: string, newConfig: PluginConfig) => {
|
||||||
const plugin = getAllLoadedRendererPlugins()[id];
|
const plugin = getAllLoadedRendererPlugins()[id];
|
||||||
if (plugin && typeof plugin.renderer !== 'function') {
|
if (plugin && typeof plugin.renderer !== 'function') {
|
||||||
plugin.renderer?.onConfigChange?.(newConfig);
|
plugin.renderer?.onConfigChange?.(newConfig);
|
||||||
|
|||||||
Reference in New Issue
Block a user