1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-18 09:35:20 +02:00
joplin/packages/app-mobile/components/NoteEditor/hooks/useCodeMirrorPlugins.ts
Henry Heino 55cafb8891
Android: Add support for Markdown editor plugins (#10086)
Co-authored-by: Laurent Cozic <laurent22@users.noreply.github.com>
2024-03-11 15:02:15 +00:00

58 lines
2.1 KiB
TypeScript

import { ContentScriptData } from '@joplin/editor/types';
import PluginService from '@joplin/lib/services/plugins/PluginService';
import { ContentScriptType } from '@joplin/lib/services/plugins/api/types';
import { PluginStates } from '@joplin/lib/services/plugins/reducer';
import shim from '@joplin/lib/shim';
import Logger from '@joplin/utils/Logger';
import { dirname } from '@joplin/utils/path';
import { useMemo } from 'react';
const logger = Logger.create('useCodeMirrorPlugins');
const useCodeMirrorPlugins = (pluginStates: PluginStates) => {
return useMemo(() => {
const pluginService = PluginService.instance();
const plugins: ContentScriptData[] = [];
for (const pluginState of Object.values(pluginStates)) {
const pluginId = pluginState.id;
const contentScripts = pluginState.contentScripts[ContentScriptType.CodeMirrorPlugin] ?? [];
if (!pluginService.plugins[pluginId]) {
// This can happen just after uninstalling a plugin -- the pluginState still exists but the plugin
// isn't registered with the PluginService.
logger.warn(`Plugin ${pluginId} not loaded but is present in contentScripts.`);
continue;
}
const plugin = pluginService.pluginById(pluginId);
for (const contentScript of contentScripts) {
const contentScriptId = contentScript.id;
plugins.push({
pluginId,
contentScriptId,
contentScriptJs: async () => {
return await shim.fsDriver().readFile(contentScript.path);
},
loadCssAsset: (name: string) => {
// TODO: This logic is currently shared with app-desktop. Refactor
const assetPath = dirname(contentScript.path);
const path = shim.fsDriver().resolveRelativePathWithinDir(assetPath, name);
return shim.fsDriver().readFile(path, 'utf8');
},
postMessageHandler: async (message: any): Promise<any> => {
logger.debug(`Got message from plugin ${pluginId} content script ${contentScriptId}. Message:`, message);
return plugin.emitContentScriptMessage(contentScriptId, message);
},
});
}
}
return plugins;
}, [pluginStates]);
};
export default useCodeMirrorPlugins;