feat: initial commit - GitHub Stars Manager

This commit is contained in:
EchoZenith
2026-04-27 23:58:12 +08:00
commit 9283271b48
20 changed files with 12781 additions and 0 deletions

111
App.js Normal file
View File

@@ -0,0 +1,111 @@
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,
},
});