- packages/shared: 版本号解析 vX.Y.Z-dav-{client}-{build} + manifest远程检查
- packages/client-android: Expo52 + expo-updates JS bundle OTA
- PackageInstallerModule.kt: APK静默安装原生模块(~60行Kotlin)
- monorepo: pnpm workspace + 版本号体系
73 lines
1.9 KiB
TypeScript
73 lines
1.9 KiB
TypeScript
import { StatusBar } from 'expo-status-bar';
|
|
import { useEffect, useState } from 'react';
|
|
import { StyleSheet, Text, View, ActivityIndicator } from 'react-native';
|
|
import { onAppStartCheckUpdate } from './src/updater/index';
|
|
|
|
export default function App() {
|
|
const [status, setStatus] = useState<'checking' | 'up-to-date' | 'updating' | 'error'>('checking');
|
|
const [message, setMessage] = useState('正在检查更新...');
|
|
|
|
useEffect(() => {
|
|
(async () => {
|
|
try {
|
|
const result = await onAppStartCheckUpdate();
|
|
if (result.jsUpdate) {
|
|
setStatus('updating');
|
|
setMessage('发现 JS 更新,正在下载...(下次启动生效)');
|
|
} else if (result.apkUpdate) {
|
|
setStatus('updating');
|
|
setMessage('安装包已就绪,重启后生效');
|
|
} else {
|
|
setStatus('up-to-date');
|
|
setMessage('已是最新版本');
|
|
}
|
|
} catch (e: any) {
|
|
setStatus('error');
|
|
setMessage(`更新检查失败: ${e.message}`);
|
|
}
|
|
})();
|
|
}, []);
|
|
|
|
return (
|
|
<View style={styles.container}>
|
|
<StatusBar style="light" />
|
|
<Text style={styles.title}>Yuzu GCA</Text>
|
|
<Text style={styles.subtitle}>Global Control Assistant</Text>
|
|
<View style={styles.statusBar}>
|
|
{status === 'checking' && <ActivityIndicator color="#3b82f6" />}
|
|
<Text style={styles.statusText}>{message}</Text>
|
|
</View>
|
|
</View>
|
|
);
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
container: {
|
|
flex: 1,
|
|
backgroundColor: '#0f172a',
|
|
alignItems: 'center',
|
|
justifyContent: 'center',
|
|
padding: 24,
|
|
},
|
|
title: {
|
|
fontSize: 28,
|
|
fontWeight: '800',
|
|
color: '#e2e8f0',
|
|
marginBottom: 4,
|
|
},
|
|
subtitle: {
|
|
fontSize: 14,
|
|
color: '#94a3b8',
|
|
marginBottom: 32,
|
|
},
|
|
statusBar: {
|
|
flexDirection: 'row',
|
|
alignItems: 'center',
|
|
gap: 8,
|
|
},
|
|
statusText: {
|
|
fontSize: 14,
|
|
color: '#94a3b8',
|
|
},
|
|
});
|