Files
2026-04-27 23:58:12 +08:00

112 lines
2.7 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { useState, useEffect } from 'react';
import { View, ActivityIndicator, Text, StyleSheet } from 'react-native';
import { initDatabase, getGitHubToken } from './services/database';
import TokenInput from './components/TokenInput';
import HomeScreen from './screens/HomeScreen';
import SettingsScreen from './screens/SettingsScreen';
import RepoDetailScreen from './screens/RepoDetailScreen';
import CategoryManageScreen from './screens/CategoryManageScreen';
export default function App() {
// 当前显示的页面loading / token_input / home / settings / repo_detail / category_manage
const [screen, setScreen] = useState('loading');
const [selectedRepo, setSelectedRepo] = useState(null);
// 启动时检查是否已存在 Token决定进入首页或 Token 输入页
useEffect(() => {
checkToken();
}, []);
const checkToken = async () => {
try {
await initDatabase();
const token = await getGitHubToken();
setScreen(token ? 'home' : 'token_input');
} catch (e) {
console.error('初始化失败:', e);
setScreen('token_input');
}
};
const handleTokenSaved = () => {
setScreen('home');
};
const handleTokenExpired = () => {
setScreen('token_input');
};
const handleOpenRepoDetail = (repo) => {
setSelectedRepo(repo);
setScreen('repo_detail');
};
const handleCloseRepoDetail = () => {
setSelectedRepo(null);
setScreen('home');
};
// 根据 screen 状态渲染对应页面
if (screen === 'loading') {
return (
<View style={styles.center}>
<ActivityIndicator size="large" color="#0366d6" />
<Text style={styles.loadingText}>启动中...</Text>
</View>
);
}
if (screen === 'token_input') {
return <TokenInput onTokenSaved={handleTokenSaved} />;
}
if (screen === 'settings') {
return (
<SettingsScreen
onGoBack={() => setScreen('home')}
onTokenExpired={handleTokenExpired}
/>
);
}
if (screen === 'repo_detail' && selectedRepo) {
return (
<RepoDetailScreen
repo={selectedRepo}
onGoBack={handleCloseRepoDetail}
/>
);
}
if (screen === 'category_manage') {
return (
<CategoryManageScreen
onGoBack={() => setScreen('home')}
/>
);
}
return (
<HomeScreen
onTokenExpired={handleTokenExpired}
onOpenSettings={() => setScreen('settings')}
onOpenRepoDetail={handleOpenRepoDetail}
onOpenCategoryManage={() => setScreen('category_manage')}
/>
);
}
const styles = StyleSheet.create({
center: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#f5f5f5',
},
loadingText: {
marginTop: 10,
color: '#888',
fontSize: 14,
},
});