import { Ionicons } from '@expo/vector-icons' import { Block, ConfirmModal, Img, Input, Text, Toast } from '@share/components' import { router, Stack } from 'expo-router' import { observer } from 'mobx-react-lite' import React, { useEffect, useState } from 'react' import { ScrollView } from 'react-native' import { authClient } from '@/lib/auth' import { userStore } from '@/stores' type InfoItem = { id: string label: string value: string valueGray?: boolean onPress: () => void } type EditNicknameModalProps = { initialName: string onConfirm: (name: string) => void | Promise onCancel: () => void } function EditNicknameModal({ initialName, onConfirm, onCancel }: EditNicknameModalProps) { const [name, setName] = useState(initialName) useEffect(() => { setName(initialName) }, [initialName]) return ( } title="修改昵称" onCancel={onCancel} onConfirm={() => onConfirm(name)} /> ) } export default observer(function ProfilePage() { const { user } = userStore const handleEditAvatar = () => { // TODO: 打开相册/拍照更换头像 Toast.show({ title: '更换头像功能开发中' }) } const handleEditNickname = () => { Toast.showModal( { const trimmed = name.trim() if (trimmed.length < 6 || trimmed.length > 12) { Toast.show({ title: '请输入6-12个字符' }) return } try { const res = await authClient.updateUser({ name: trimmed }) const err = (res as { error?: { message?: string } }).error if (err) { Toast.show({ title: err.message || '修改失败,请重试' }) return } if (userStore.user) { userStore.setUser({ ...userStore.user, name: trimmed }) } Toast.hideModal() Toast.show({ title: '昵称已更新' }) } catch (e) { Toast.show({ title: '修改失败,请重试' }) } }} onCancel={() => Toast.hideModal()} />, ) } const infoItems: InfoItem[] = [ { id: 'nickname', label: '昵称', value: user?.name || '未设置', onPress: handleEditNickname, }, { id: 'phone', label: '手机号', value: user?.phoneNumber || '', onPress: () => { Toast.show({ title: '手机号不可修改' }) }, } ] const renderHeader = () => ( router.back()} > 个人信息 ) const renderAvatarSection = () => ( {user?.image ? ( ) : ( )} 编辑 ) const renderInfoList = () => ( {infoItems.map((item) => ( {item.label} {item.value} {/*手机号 显示隐藏按钮 */} {item.id !== 'phone' && ( )} ))} ) return ( {renderHeader()} {renderAvatarSection()} {renderInfoList()} ) })