import React, { useEffect, useState, useCallback } from 'react'; import { View, Text, TouchableOpacity, StyleSheet, ActivityIndicator, Alert } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import { useRouter } from 'expo-router'; import { Ionicons } from '@expo/vector-icons'; import { useAuthStore } from '../store/authStore'; import { useSettingsStore } from '../store/settingsStore'; import { useTheme } from '../utils/theme'; import { useCheckUpdate } from '../hooks/useCheckUpdate'; import { getImageCacheSize, clearImageCache, formatBytes } from '../utils/cache'; export default function SettingsScreen() { const router = useRouter(); const { isLoggedIn, logout } = useAuthStore(); const { darkMode, setDarkMode, trafficSaving, setTrafficSaving } = useSettingsStore(); const theme = useTheme(); const { currentVersion, isChecking, downloadProgress, checkUpdate } = useCheckUpdate(); const [cacheSize, setCacheSize] = useState(null); const [clearingCache, setClearingCache] = useState(false); const refreshCacheSize = useCallback(async () => { const size = await getImageCacheSize(); setCacheSize(size); }, []); useEffect(() => { refreshCacheSize(); }, []); const handleClearCache = async () => { Alert.alert('清除缓存', '确定要清除所有缓存吗?', [ { text: '取消', style: 'cancel' }, { text: '清除', style: 'destructive', onPress: async () => { setClearingCache(true); await clearImageCache(); setClearingCache(false); setCacheSize(0); Alert.alert('已完成', '缓存已清除'); }, }, ]); }; const handleLogout = async () => { await logout(); router.back(); }; return ( router.back()} style={styles.backBtn}> 设置 版本信息 当前版本 v{currentVersion} 更新 {isChecking ? ( <> 检查中... ) : downloadProgress !== null ? ( 下载中 {downloadProgress}% ) : ( 检查更新 )} 外观 setDarkMode(false)} activeOpacity={0.7} > 浅色 setDarkMode(true)} activeOpacity={0.7} > 深色 流量 setTrafficSaving(false)} activeOpacity={0.7} > 标准 setTrafficSaving(true)} activeOpacity={0.7} > 节流 {trafficSaving && ( 封面低画质 · 首页视频不自动播放 · 视频默认 360p )} 存储 缓存大小 {cacheSize === null ? '计算中...' : formatBytes(cacheSize)} {clearingCache ? : 清除缓存 } {isLoggedIn && ( 退出登录 )} ); } const styles = StyleSheet.create({ safe: { flex: 1 }, topBar: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 8, paddingVertical: 8, borderBottomWidth: StyleSheet.hairlineWidth, }, backBtn: { padding: 4, width: 32 }, spacer: { width: 32 }, topTitle: { flex: 1, fontSize: 16, fontWeight: '600', textAlign: 'center', }, section: { marginTop: 16, paddingHorizontal: 16, paddingVertical: 14, borderTopWidth: StyleSheet.hairlineWidth, borderBottomWidth: StyleSheet.hairlineWidth, }, sectionLabel: { fontSize: 13, marginBottom: 10 }, optionRow: { flexDirection: 'row', gap: 10 }, option: { paddingHorizontal: 10, paddingVertical: 2, borderRadius: 16, }, optionActive: { backgroundColor: '#00AEEC' }, optionText: { fontSize: 13, fontWeight: '500' }, optionTextActive: { color: '#fff', fontWeight: '600' }, hint: { fontSize: 12, marginTop: 8 }, versionRow: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', }, versionLabel: { fontSize: 14 }, versionValue: { fontSize: 14 }, updateBtn: { flexDirection: 'row', alignItems: 'center', paddingVertical: 6, }, updateBtnText: { fontSize: 14, color: '#00AEEC', fontWeight: '600' }, cacheRow: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', }, cacheLabel: { fontSize: 14 }, cacheValue: { fontSize: 12, marginTop: 2 }, clearBtn: { backgroundColor: '#00AEEC', paddingHorizontal: 14, paddingVertical: 6, borderRadius: 16, minWidth: 80, alignItems: 'center', }, clearBtnText: { color: '#fff', fontSize: 13, fontWeight: '600' }, logoutBtn: { margin: 24, paddingVertical: 12, borderRadius: 8, borderWidth: 1, alignItems: 'center', }, logoutText: { fontSize: 15, fontWeight: '600' }, });