build(metro): add web shims for native React Native API compatibility
Some checks failed
Frontend CI / ota-android (push) Failing after 11s
Frontend CI / build-and-push-web (push) Failing after 1m14s
Frontend CI / build-android-apk (push) Has been cancelled

Add Metro configuration to resolve native-only React Native APIs with web-compatible shims. This enables packages like react-native-pager-view to work on the web platform by providing shim implementations for codegenNativeComponent, codegenNativeCommands, and CodegenTypes that are unavailable in react-native-web.

Also simplify Android signing configuration in CI by using standard Gradle property names (MYAPP_UPLOAD_*) and remove the build.gradle patching step.
This commit is contained in:
lafay
2026-04-22 20:17:38 +08:00
parent 437dab3b6e
commit dcae47218f
7 changed files with 84 additions and 28 deletions

View File

@@ -0,0 +1,17 @@
const Double = Number;
const Int32 = Number;
const Float = Number;
const WithDefault = (type, defaultValue) => type;
module.exports = {
Double,
Float,
Int32,
WithDefault,
DirectEventHandler: () => null,
BubblingEventHandler: () => null,
Stringish: String,
ColorValue: null,
HandledState: String,
WithSpringAnimation: (type) => type,
};

View File

@@ -0,0 +1,15 @@
function codegenNativeCommands(options) {
const commands = {};
if (options && options.supportedCommands) {
options.supportedCommands.forEach((commandName) => {
commands[commandName] = (ref, ...args) => {
if (ref && ref.current && typeof ref.current[commandName] === 'function') {
ref.current[commandName](...args);
}
};
});
}
return commands;
}
module.exports = codegenNativeCommands;

View File

@@ -0,0 +1,18 @@
const React = require('react');
function codegenNativeComponent(componentName, options) {
const componentNameClean = componentName
.replace(/^RNC/, '')
.replace(/^RNS/, '')
.replace(/^RN/, '');
const NativeComponent = React.forwardRef((props, ref) => {
const { children, ...rest } = props;
return React.createElement('div', { ...rest, ref, 'data-native-component': componentNameClean }, children);
});
NativeComponent.displayName = componentName;
return NativeComponent;
}
module.exports = codegenNativeComponent;