// src/views/Profile/ProfilePage.js import React, { useState, useRef } from 'react'; import { Box, Container, VStack, HStack, Text, Heading, Avatar, Button, Input, Textarea, FormControl, FormLabel, SimpleGrid, Card, CardBody, CardHeader, Stat, StatLabel, StatNumber, StatHelpText, Badge, Divider, Select, useToast, IconButton, Flex, Progress, Tag, TagLabel, TagCloseButton, Wrap, WrapItem, Modal, ModalOverlay, ModalContent, ModalHeader, ModalBody, ModalCloseButton, useDisclosure } from '@chakra-ui/react'; import { EditIcon, CheckIcon, CloseIcon, AddIcon } from '@chakra-ui/icons'; import { useAuth } from '../../contexts/AuthContext'; import { logger } from '../../utils/logger'; import { useProfileEvents } from '../../hooks/useProfileEvents'; export default function ProfilePage() { const { user, updateUser } = useAuth(); const [isEditing, setIsEditing] = useState(false); const [isLoading, setIsLoading] = useState(false); // 🎯 初始化个人资料埋点Hook const profileEvents = useProfileEvents({ pageType: 'profile' }); const [newTag, setNewTag] = useState(''); const { isOpen, onOpen, onClose } = useDisclosure(); const fileInputRef = useRef(); const toast = useToast(); // 表单数据状态 const [formData, setFormData] = useState({ nickname: user?.nickname || '', bio: user?.bio || '', location: user?.location || '', gender: user?.gender || '', birth_date: user?.birth_date || '', trading_experience: user?.trading_experience || '', investment_style: user?.investment_style || '', risk_preference: user?.risk_preference || '', investment_amount: user?.investment_amount || '', preferred_markets: user?.preferred_markets ? user.preferred_markets.split(',') : [], creator_tags: user?.creator_tags ? user.creator_tags.split(',') : [] }); const handleInputChange = (e) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); }; const handleSaveProfile = async () => { setIsLoading(true); try { // 这里应该调用后端API更新用户信息 const updatedData = { ...formData, preferred_markets: formData.preferred_markets.join(','), creator_tags: formData.creator_tags.join(',') }; logger.debug('ProfilePage', '保存个人资料', { userId: user?.id }); // 模拟API调用 await new Promise(resolve => setTimeout(resolve, 1000)); updateUser(updatedData); setIsEditing(false); // 🎯 追踪个人资料更新成功 const updatedFields = Object.keys(formData).filter( key => user?.[key] !== formData[key] ); profileEvents.trackProfileUpdated(updatedFields, updatedData); // ✅ 保留关键操作提示 toast({ title: "个人资料更新成功", status: "success", duration: 3000, isClosable: true, }); } catch (error) { logger.error('ProfilePage', 'handleSaveProfile', error, { userId: user?.id }); // 🎯 追踪个人资料更新失败 const attemptedFields = Object.keys(formData); profileEvents.trackProfileUpdateFailed(attemptedFields, error.message); // ✅ 保留错误提示 toast({ title: "更新失败", description: error.message, status: "error", duration: 3000, isClosable: true, }); } finally { setIsLoading(false); } }; const handleAvatarUpload = (event) => { const file = event.target.files[0]; if (file) { logger.debug('ProfilePage', '上传头像', { fileName: file.name, fileSize: file.size }); // 这里应该上传文件到服务器 const reader = new FileReader(); reader.onload = (e) => { updateUser({ avatar_url: e.target.result }); // 🎯 追踪头像上传 profileEvents.trackAvatarUploaded('file_upload', file.size); // ✅ 保留关键操作提示 toast({ title: "头像更新成功", status: "success", duration: 3000, isClosable: true, }); }; reader.readAsDataURL(file); } }; const addMarketTag = () => { if (newTag && !formData.preferred_markets.includes(newTag)) { setFormData(prev => ({ ...prev, preferred_markets: [...prev.preferred_markets, newTag] })); setNewTag(''); } }; const removeMarketTag = (tagToRemove) => { setFormData(prev => ({ ...prev, preferred_markets: prev.preferred_markets.filter(tag => tag !== tagToRemove) })); }; const getProgressColor = (score) => { if (score >= 800) return 'green'; if (score >= 500) return 'blue'; if (score >= 200) return 'yellow'; return 'red'; }; return ( {/* 页面标题 */} 个人资料 {!isEditing ? ( ) : ( )} {/* 左侧:基本信息 */} 基本信息 {/* 头像和基本信息 */} {isEditing && ( )} 用户名: {user?.username} {user?.is_verified && ( 已实名认证 )} {user?.has_wechat && ( 微信已绑定 )} {user?.is_creator && ( 创作者 )} 昵称 {isEditing ? ( ) : ( {user?.nickname || '未设置'} )} 性别 {isEditing ? ( ) : ( {user?.gender === 'male' ? '男' : user?.gender === 'female' ? '女' : user?.gender === 'other' ? '其他' : '未设置'} )} 所在地 {isEditing ? ( ) : ( {user?.location || '未设置'} )} 生日 {isEditing ? ( ) : ( {user?.birth_date || '未设置'} )} 个人简介 {isEditing ? (