1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-30 10:36:35 +02:00
joplin/packages/app-mobile/PluginAssetsLoader.ts

79 lines
2.3 KiB
TypeScript
Raw Normal View History

import shim from '@joplin/lib/shim';
const { dirname } = require('@joplin/lib/path-utils');
import Setting from '@joplin/lib/models/Setting';
const pluginAssets = require('./pluginAssets/index');
import KvStore from '@joplin/lib/services/KvStore';
import Logger from '@joplin/utils/Logger';
import FsDriverWeb from './utils/fs-driver/fs-driver-rn.web';
const logger = Logger.create('PluginAssetsLoader');
export default class PluginAssetsLoader {
private static instance_: PluginAssetsLoader = null;
public static instance() {
if (PluginAssetsLoader.instance_) return PluginAssetsLoader.instance_;
PluginAssetsLoader.instance_ = new PluginAssetsLoader();
return PluginAssetsLoader.instance_;
}
private destDir_() {
return `${Setting.value('resourceDir')}/pluginAssets`;
}
private async importAssetsMobile_() {
const destDir = this.destDir_();
for (const name in pluginAssets.files) {
const dataBase64 = pluginAssets.files[name].data;
const destPath = `${destDir}/${name}`;
await shim.fsDriver().mkdir(dirname(destPath));
await shim.fsDriver().unlink(destPath);
logger.info(`PluginAssetsLoader: Copying: ${name} => ${destPath}`);
await shim.fsDriver().writeFile(destPath, dataBase64);
}
}
private async importAssetsWeb_() {
const destDir = this.destDir_();
const fsDriver = shim.fsDriver() as FsDriverWeb;
await Promise.all(pluginAssets.files.map(async (name: string) => {
const destPath = `${destDir}/${name}`;
const response = await fetch(`pluginAssets/${name}`);
await shim.fsDriver().mkdir(dirname(destPath));
await shim.fsDriver().unlink(destPath);
await fsDriver.writeFile(destPath, await response.arrayBuffer(), 'Buffer');
}));
}
public async importAssets() {
const destDir = this.destDir_();
await shim.fsDriver().mkdir(destDir);
const hash = pluginAssets.hash;
if (hash === await KvStore.instance().value('PluginAssetsLoader.lastHash')) {
logger.info(`PluginAssetsLoader: Assets are up to date. Hash: ${hash}`);
return;
}
logger.info(`PluginAssetsLoader: Importing assets to ${destDir}`);
try {
if (shim.mobilePlatform() === 'web') {
await this.importAssetsWeb_();
} else {
await this.importAssetsMobile_();
}
} catch (error) {
logger.error(error);
}
await KvStore.instance().setValue('PluginAssetsLoader.lastHash', hash);
}
}