- Add PostContentRenderer component for rendering posts/comments with segments - Add PostMentionInput component for @mention support in post/comment creation - Add VoteSegmentData and vote segment type for unified post creation API - Update post and comment services to support segments in API requests - Fix auth service to clear tokens before login/register - Improve database initialization with proper close/retry logic - Add verification check before allowing post creation - Add metro web shims for react-native-webrtc full package and requireNativeComponent - Update build config with git hash based version numbers
105 lines
2.8 KiB
JavaScript
105 lines
2.8 KiB
JavaScript
const appJson = require('./app.json');
|
||
const { execSync } = require('child_process');
|
||
|
||
const isDevVariant = process.env.APP_VARIANT === 'dev';
|
||
const releaseApiBaseUrl = 'https://withyou.littlelan.cn/api/v1';
|
||
const releaseUpdatesBaseUrl = 'https://updates.littlelan.cn';
|
||
const devApiBaseUrl = process.env.EXPO_PUBLIC_API_BASE_URL || 'http://192.168.31.238:8080/api/v1';
|
||
|
||
function getGitShortHash() {
|
||
try {
|
||
return execSync('git rev-parse --short=4 HEAD', { encoding: 'utf-8' }).trim();
|
||
} catch {
|
||
return '0000';
|
||
}
|
||
}
|
||
|
||
const gitBuildSuffix = getGitShortHash();
|
||
|
||
function toManifestUrl(baseUrl, portOverride) {
|
||
const parsed = new URL(baseUrl);
|
||
if (portOverride != null) {
|
||
parsed.port = String(portOverride);
|
||
}
|
||
parsed.pathname = '/api/manifest';
|
||
parsed.search = '';
|
||
parsed.hash = '';
|
||
return parsed.toString();
|
||
}
|
||
|
||
const releaseUpdatesUrl =
|
||
process.env.EXPO_PUBLIC_UPDATES_URL || toManifestUrl(releaseUpdatesBaseUrl);
|
||
const devUpdatesUrl =
|
||
process.env.EXPO_PUBLIC_DEV_UPDATES_URL || toManifestUrl(devApiBaseUrl, 3001);
|
||
|
||
const expo = appJson.expo;
|
||
|
||
// 检测是否为 Web 平台
|
||
const isWeb = process.env.EXPO_TARGET === 'web' || process.env.PLATFORM === 'web';
|
||
|
||
// 原生平台特有的插件(在 Web 端会报错)
|
||
const nativeOnlyPlugins = [
|
||
'expo-camera',
|
||
'expo-notifications',
|
||
'expo-background-fetch',
|
||
'expo-media-library',
|
||
'expo-image-picker',
|
||
'expo-video',
|
||
'expo-sqlite',
|
||
'./plugins/withMainActivityConfigChange',
|
||
];
|
||
|
||
// 过滤插件:Web 端排除原生插件
|
||
const filteredPlugins = isWeb
|
||
? expo.plugins.filter((plugin) => {
|
||
const pluginName = Array.isArray(plugin) ? plugin[0] : plugin;
|
||
return !nativeOnlyPlugins.includes(pluginName);
|
||
})
|
||
: expo.plugins;
|
||
|
||
module.exports = {
|
||
...expo,
|
||
name: isDevVariant ? `${expo.name} Dev` : expo.name,
|
||
runtimeVersion: {
|
||
policy: 'appVersion',
|
||
},
|
||
updates: {
|
||
...(expo.updates || {}),
|
||
url: isDevVariant ? devUpdatesUrl : releaseUpdatesUrl,
|
||
checkAutomatically: 'ON_LOAD',
|
||
fallbackToCacheTimeout: 0,
|
||
},
|
||
ios: {
|
||
...expo.ios,
|
||
buildNumber: gitBuildSuffix,
|
||
},
|
||
android: {
|
||
...expo.android,
|
||
package: 'cn.qczlit.withyou',
|
||
versionCode: parseInt(gitBuildSuffix, 16),
|
||
},
|
||
// Web 端使用过滤后的插件
|
||
plugins: filteredPlugins,
|
||
extra: {
|
||
...(expo.extra || {}),
|
||
appVariant: isDevVariant ? 'dev' : 'release',
|
||
apiBaseUrl: isDevVariant ? devApiBaseUrl : releaseApiBaseUrl,
|
||
updatesUrl: isDevVariant ? devUpdatesUrl : releaseUpdatesUrl,
|
||
},
|
||
// Web 端配置
|
||
...(isWeb && {
|
||
web: {
|
||
...expo.web,
|
||
build: {
|
||
...expo.web?.build,
|
||
// 配置 Web 端别名,避免加载原生模块
|
||
babel: {
|
||
dangerouslyAddModulePathsToTranspile: [
|
||
'react-native-webrtc',
|
||
],
|
||
},
|
||
},
|
||
},
|
||
}),
|
||
};
|