@formidable-webview/webshell
Version:
🔥 Craft Robust React Native WebView-based components with ease.
35 lines (30 loc) • 1.05 kB
text/typescript
import Feature from '../Feature';
import featuresLoaderScript from './web-features-loader.webjs';
import { PropsSpecs } from '../types';
function serializeFeature(feature: Feature<any, PropsSpecs<any, any>>) {
return `{source:${feature.script},identifier:${JSON.stringify(
feature.identifier
)},options:${JSON.stringify(feature.options || {})}}`;
}
function registerFeature(feat: Feature<any, any>) {
return `try {
window.ReactNativeWebshell.registerFeature(${serializeFeature(feat)});
} catch (e) {
window.ReactNativeWebshell.sendErrorMessage(${JSON.stringify(
feat.identifier
)},e);
};`;
}
function assembleScript(feats: Feature<any, any>[]) {
return `${featuresLoaderScript}(function(){${feats
.map(registerFeature)
.join('\n')};})();`;
}
export class WebFeaturesLoader<F extends Feature<any, any>[]> {
readonly features: F;
readonly assembledFeaturesScript: string;
constructor(features: F) {
this.features = features;
this.assembledFeaturesScript = assembleScript(features);
}
}