/** * 左侧菜单组件 * 基于 react-native-paper Drawer 组件重建 * 功能包括: * - 用户钱包信息 * - 菜单项导航 * - 利息宝显示 * - 登录状态判断 */ import React, { useState, useCallback, useMemo } from 'react'; import { View, Text, ScrollView, Modal, TouchableOpacity, Dimensions } from 'react-native'; import { Drawer, Button, Divider } from 'react-native-paper'; import { useColorScheme, useThemeColors } from '@/theme'; import { createThemeStyles } from '@/theme'; import { useIsLoggedIn, useUser } from '@/stores'; import Ionicons from '@expo/vector-icons/Ionicons'; import WalletAmount from '../WalletAmount'; const { width } = Dimensions.get('window'); /** * 创建主题样式 */ const styles = createThemeStyles((colors) => ({ overlay: { flex: 1, backgroundColor: 'rgba(0, 0, 0, 0.5)', }, drawerContainer: { flex: 1, backgroundColor: colors.background, width: width * 0.65, position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, }, container: { flex: 1, backgroundColor: colors.background, }, walletSection: { paddingHorizontal: 16, paddingVertical: 16, backgroundColor: colors.card, marginHorizontal: 12, marginVertical: 12, borderRadius: 12, }, walletLabel: { fontSize: 12, color: colors.text + '80', marginBottom: 8, }, walletButtons: { flexDirection: 'row', gap: 8, marginTop: 12, }, buttonText: { fontSize: 12, fontWeight: '600', }, lixibaoSection: { marginHorizontal: 12, marginVertical: 12, paddingHorizontal: 12, paddingVertical: 12, borderRadius: 12, borderWidth: 2, borderColor: colors.primary, backgroundColor: colors.card, flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', }, lixibaoLeft: { flexDirection: 'row', alignItems: 'center', flex: 1, }, lixibaoInfo: { flex: 1, }, lixibaoLabel: { fontSize: 12, color: colors.text + '80', }, lixibaoValue: { fontSize: 14, fontWeight: '700', color: colors.primary, marginTop: 4, }, emptyText: { textAlign: 'center', fontSize: 14, color: colors.text + '80', paddingVertical: 40, }, })); interface LeftMenuProps { visible: boolean; onClose: () => void; } interface MenuItem { id: string; title: string; icon: string; route?: string; requireLogin?: boolean; } /** * 左侧菜单组件 */ export default function LeftMenu({ visible, onClose }: LeftMenuProps) { const colorScheme = useColorScheme(); const s = styles[colorScheme]; const themeColors = useThemeColors(); const isLoggedIn = useIsLoggedIn(); const user = useUser(); const [walletBalance] = useState(0); // 从 store 获取 const [interestBalance] = useState(0); // 从 store 获取 // 菜单项配置 const menuItems: MenuItem[] = useMemo( () => [ { id: 'balance', title: '利息宝', icon: 'gift' }, { id: 'services', title: '客服', icon: 'headset', route: '/services', }, { id: 'collect', title: '收藏', icon: 'star', route: '/collect', }, { id: 'recent', title: '最近', icon: 'time', route: '/recent', }, { id: 'betRecord', title: '投注记录', icon: 'document-text', route: '/betRecord', requireLogin: true, }, { id: 'activity', title: '任务中心', icon: 'checkmark-circle', route: '/activity', }, { id: 'bonus', title: '福利中心', icon: 'gift', route: '/bonus', }, { id: 'rebate', title: '自助返水', icon: 'cash', route: '/rebate', }, { id: 'findBalance', title: '找回余额', icon: 'search', route: '/findBalance', }, { id: 'message', title: '消息中心', icon: 'mail', route: '/message', }, { id: 'promotion', title: '推广赚钱', icon: 'share-social', route: '/promotion', }, { id: 'backup', title: '备用网站', icon: 'link', route: '/backup', }, ], [] ); const handleMenuItemPress = useCallback( (item: MenuItem) => { if (item.requireLogin && !isLoggedIn) { // 显示登录提示 return; } // 导航到对应页面 console.log('Navigate to:', item.route); onClose(); }, [isLoggedIn, onClose] ); const handleDeposit = useCallback(() => { console.log('Navigate to deposit'); onClose(); }, [onClose]); const handleWithdraw = useCallback(() => { console.log('Navigate to withdraw'); onClose(); }, [onClose]); return ( {/* 用户信息或登录提示 */} {isLoggedIn && user ? ( <> {/* 钱包信息 */} 钱包余额 ) : ( 加入我们,开启畅赢人生! )} {/* 菜单项 */} {menuItems.map((item) => ( ( )} onPress={() => handleMenuItemPress(item)} active={false} right={() => ( )} style={{ marginHorizontal: 0 }} /> ))} ); }