You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-11-23 22:36:32 +02:00
80 lines
2.4 KiB
TypeScript
80 lines
2.4 KiB
TypeScript
import Renderer from './Renderer';
|
|
import WebViewToRNMessenger from '../../../utils/ipc/WebViewToRNMessenger';
|
|
import { RendererProcessApi, MainProcessApi, RendererWebViewOptions } from '../types';
|
|
|
|
interface WebViewLib {
|
|
initialize(config: unknown): void;
|
|
}
|
|
|
|
interface WebViewApi {
|
|
postMessage: (contentScriptId: string, args: unknown)=> void;
|
|
}
|
|
|
|
interface ExtendedWindow extends Window {
|
|
webviewLib: WebViewLib;
|
|
webviewApi: WebViewApi;
|
|
joplinPostMessage_: (message: string, args: unknown)=> void;
|
|
}
|
|
|
|
declare const window: ExtendedWindow;
|
|
declare const webviewLib: WebViewLib;
|
|
|
|
const initializeMessenger = (options: RendererWebViewOptions) => {
|
|
const messenger = new WebViewToRNMessenger<RendererProcessApi, MainProcessApi>(
|
|
'renderer',
|
|
null,
|
|
);
|
|
|
|
window.joplinPostMessage_ = (message: string, _args: unknown) => {
|
|
return messenger.remoteApi.onPostMessage(message);
|
|
};
|
|
|
|
window.webviewApi = {
|
|
postMessage: messenger.remoteApi.onPostPluginMessage,
|
|
};
|
|
|
|
webviewLib.initialize({
|
|
postMessage: (message: string) => {
|
|
messenger.remoteApi.onPostMessage(message);
|
|
},
|
|
});
|
|
// Share the webview library globally so that the renderer can access it.
|
|
window.webviewLib = webviewLib;
|
|
|
|
const renderer = new Renderer({
|
|
...options,
|
|
fsDriver: messenger.remoteApi.fsDriver,
|
|
});
|
|
|
|
messenger.setLocalInterface({
|
|
renderer,
|
|
jumpToHash: (hash: string) => {
|
|
location.hash = `#${hash}`;
|
|
},
|
|
});
|
|
|
|
return { messenger };
|
|
};
|
|
|
|
// eslint-disable-next-line import/prefer-default-export -- This is a bundle entrypoint
|
|
export const initialize = (options: RendererWebViewOptions) => {
|
|
const { messenger } = initializeMessenger(options);
|
|
|
|
const lastScrollTop: number|null = null;
|
|
const onMainContentScroll = () => {
|
|
const newScrollTop = document.scrollingElement.scrollTop;
|
|
if (lastScrollTop !== newScrollTop) {
|
|
messenger.remoteApi.onScroll(newScrollTop);
|
|
}
|
|
};
|
|
|
|
// Listen for events on both scrollingElement and window
|
|
// - On Android, scrollingElement.addEventListener('scroll', callback) doesn't call callback on
|
|
// scroll. However, window.addEventListener('scroll', callback) does.
|
|
// - iOS needs a listener to be added to scrollingElement -- events aren't received when
|
|
// the listener is added to window with window.addEventListener('scroll', ...).
|
|
document.scrollingElement?.addEventListener('scroll', onMainContentScroll);
|
|
window.addEventListener('scroll', onMainContentScroll);
|
|
};
|
|
|