/** * 设置页 SettingsScreen(响应式适配) * 胡萝卜BBS - 应用设置 * 在宽屏下居中显示,最大宽度限制 */ import React from 'react'; import { View, StyleSheet, TouchableOpacity, Alert, ScrollView, } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import { useNavigation } from '@react-navigation/native'; import { MaterialCommunityIcons } from '@expo/vector-icons'; import { colors, spacing, fontSizes, borderRadius } from '../../theme'; import { useAuthStore } from '../../stores'; import { Text, ResponsiveContainer } from '../../components/common'; import { useResponsive } from '../../hooks'; interface SettingsItem { key: string; title: string; icon: string; onPress?: () => void; showArrow?: boolean; danger?: boolean; subtitle?: string; } // 设置分组配置 const SETTINGS_GROUPS = [ { title: '账号与安全', icon: 'shield-check-outline', items: [ { key: 'edit_profile', title: '编辑资料', icon: 'account-edit-outline', showArrow: true }, { key: 'privacy', title: '隐私设置', icon: 'shield-account-outline', showArrow: true }, { key: 'security', title: '账号安全', icon: 'lock-outline', showArrow: true }, { key: 'blocked_users', title: '黑名单', icon: 'account-off-outline', showArrow: true }, ], }, { title: '通知与通用', icon: 'bell-outline', items: [ { key: 'notification_settings', title: '通知设置', icon: 'bell-cog-outline', showArrow: true, subtitle: '推送、震动、提示音' }, ], }, { title: '关于与帮助', icon: 'information-outline', items: [ { key: 'about', title: '关于我们', icon: 'information-outline', showArrow: true, subtitle: '版本 1.0.2' }, { key: 'help', title: '帮助与反馈', icon: 'help-circle-outline', showArrow: true }, ], }, ]; export const SettingsScreen: React.FC = () => { const navigation = useNavigation(); const { logout } = useAuthStore(); const { isWideScreen } = useResponsive(); // 处理设置项点击 const handleItemPress = (key: string) => { switch (key) { case 'edit_profile': navigation.navigate('EditProfile' as never); break; case 'notification_settings': navigation.navigate('NotificationSettings' as never); break; case 'blocked_users': navigation.navigate('BlockedUsers' as never); break; case 'security': navigation.navigate('AccountSecurity' as never); break; case 'logout': Alert.alert( '退出登录', '确定要退出登录吗?', [ { text: '取消', style: 'cancel' }, { text: '确定', style: 'destructive', onPress: () => { logout(); } }, ] ); break; default: break; } }; // 渲染单个设置项 const renderSettingItem = (item: SettingsItem, index: number, total: number) => ( item.onPress ? item.onPress() : handleItemPress(item.key)} activeOpacity={0.7} > {item.title} {item.subtitle && ( {item.subtitle} )} {item.showArrow && ( )} ); // 渲染分组 const renderGroup = (group: typeof SETTINGS_GROUPS[0], groupIndex: number) => ( {group.title} {group.items.map((item, index) => renderSettingItem(item, index, group.items.length) )} ); // 退出登录按钮 const renderLogoutButton = () => ( handleItemPress('logout')} activeOpacity={0.7} > 退出登录 ); // 渲染内容 const renderContent = () => ( <> {SETTINGS_GROUPS.map((group, index) => renderGroup(group, index))} {renderLogoutButton()} {/* 底部版权信息 */} 萝卜社区 v1.0.2 © 2024 Carrot BBS. All rights reserved. ); return ( {isWideScreen ? ( {renderContent()} ) : ( {renderContent()} )} ); }; const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: colors.background.default, }, scrollContent: { paddingVertical: spacing.md, }, groupContainer: { marginBottom: spacing.lg, }, groupHeader: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: spacing.lg, marginBottom: spacing.sm, gap: spacing.xs, }, groupTitle: { fontWeight: '600', fontSize: fontSizes.sm, }, card: { backgroundColor: colors.background.paper, marginHorizontal: spacing.lg, borderRadius: borderRadius.lg, overflow: 'hidden', }, settingItem: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', paddingVertical: spacing.md, paddingHorizontal: spacing.md, borderBottomWidth: 1, borderBottomColor: colors.divider, }, settingItemFirst: { borderTopLeftRadius: borderRadius.lg, borderTopRightRadius: borderRadius.lg, }, settingItemLast: { borderBottomLeftRadius: borderRadius.lg, borderBottomRightRadius: borderRadius.lg, borderBottomWidth: 0, }, settingItemLeft: { flexDirection: 'row', alignItems: 'center', flex: 1, }, iconContainer: { width: 36, height: 36, borderRadius: borderRadius.md, backgroundColor: colors.primary.light + '20', justifyContent: 'center', alignItems: 'center', marginRight: spacing.md, }, dangerIconContainer: { backgroundColor: colors.error.light + '20', }, settingContent: { flex: 1, }, subtitle: { marginTop: 2, }, logoutButton: { flexDirection: 'row', alignItems: 'center', justifyContent: 'center', backgroundColor: colors.background.paper, marginHorizontal: spacing.lg, marginTop: spacing.sm, marginBottom: spacing.lg, paddingVertical: spacing.md, borderRadius: borderRadius.lg, gap: spacing.sm, }, logoutText: { fontWeight: '500', }, footer: { alignItems: 'center', marginTop: spacing.xl, paddingBottom: spacing.xl, }, copyright: { marginTop: spacing.xs, }, }); export default SettingsScreen;