1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-24 10:27:10 +02:00
joplin/packages/app-mobile/index.web.ts
2024-08-02 14:51:49 +01:00

70 lines
2.3 KiB
TypeScript

import { AppRegistry } from 'react-native';
import Root from './root';
require('./web/rnVectorIconsSetup.js');
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Necessary until Root doesn't extend `any`
AppRegistry.registerComponent('Joplin', () => Root as any);
// Fill properties not yet available in the TypeScript DOM types.
interface ExtendedNavigator extends Navigator {
virtualKeyboard?: { overlaysContent: boolean };
}
declare const navigator: ExtendedNavigator;
// Should prevent the browser from auto-deleting background data.
const requestPersistentStorage = async () => {
if (!(await navigator.storage.persisted())) {
await navigator.storage.persist();
}
};
const keepAppAboveKeyboard = () => {
let updateQueued = false;
// This prevents the virtual keyboard from covering content near the bottom of the screen
// (e.g. the markdown toolbar) on both iOS and Android. As of June 2024, this can't be
// done with the Virtual Keyboard API on iOS.
const handleViewportChange = () => {
if (updateQueued) return;
updateQueued = true;
requestAnimationFrame(() => {
updateQueued = false;
// The visual viewport changes as the user zooms in and out. Only adjust the body's height
// when the user's (pinch/touchpad) zoom level is roughly 100% or less.
if (window.visualViewport.scale <= 1.01) {
document.body.style.height = `${window.visualViewport.height}px`;
// Additional scroll space can also be added by the browser when focusing a text input (e.g.
// the markdown editor). Make sure that the top of the editor is still visible:
document.scrollingElement.scrollTop = 0;
} else {
document.body.style.height = '';
}
});
};
if (window.visualViewport) {
window.visualViewport.addEventListener('resize', handleViewportChange);
}
};
addEventListener('DOMContentLoaded', async () => {
if (window.crossOriginIsolated === false) {
// Currently, reloading should be handled by serviceWorker.ts -- this change is left for
// debugging purposes.
document.body.prepend(
document.createTextNode('Warning: crossOriginIsolated is false. SharedArrayBuffer and similar APIs may not work correctly. Try refreshing the page.'),
);
}
keepAppAboveKeyboard();
void requestPersistentStorage();
AppRegistry.runApplication('Joplin', {
rootTag: document.querySelector('#root'),
});
});