diff --git a/app/profile.tsx b/app/profile.tsx index 8b7df88..ca6d1cf 100644 --- a/app/profile.tsx +++ b/app/profile.tsx @@ -1,3 +1,4 @@ +import * as ImagePicker from 'expo-image-picker' import { Ionicons } from '@expo/vector-icons' import { Block, ConfirmModal, Img, Input, Text, Toast } from '@share/components' import { router, Stack } from 'expo-router' @@ -5,8 +6,10 @@ import { observer } from 'mobx-react-lite' import React, { useEffect, useState } from 'react' import { ScrollView } from 'react-native' +import { imgPicker } from '@/@share/apis' import { authClient } from '@/lib/auth' import { userStore } from '@/stores' +import { uploadFile } from '@/utils' type InfoItem = { id: string @@ -55,9 +58,41 @@ function EditNicknameModal({ initialName, onConfirm, onCancel }: EditNicknameMod export default observer(function ProfilePage() { const { user } = userStore - const handleEditAvatar = () => { - // TODO: 打开相册/拍照更换头像 - Toast.show({ title: '更换头像功能开发中' }) + const handleEditAvatar = async () => { + try { + const assets = await imgPicker({ + maxImages: 1, + type: ImagePicker.MediaTypeOptions.Images, + resultType: 'asset', + }) + const asset = assets[0] as ImagePicker.ImagePickerAsset + if (!asset) return + + Toast.showLoading({ title: '上传中...', duration: 0 }) + const url = await uploadFile({ + uri: asset.uri, + mimeType: asset.mimeType ?? 'image/jpeg', + fileName: asset.fileName ?? `avatar_${Date.now()}.jpg`, + }) + + const res = await authClient.updateUser({ image: url }) + const err = (res as { error?: { message?: string } }).error + if (err) { + Toast.hideLoading() + Toast.show({ title: err.message || '头像更新失败,请重试' }) + return + } + if (userStore.user) { + userStore.setUser({ ...userStore.user, image: url }) + } + Toast.hideLoading() + Toast.show({ title: '头像已更新' }) + } catch (e) { + Toast.hideLoading() + if (e instanceof Error && e.message !== '未选择任何图片') { + Toast.show({ title: '上传失败,请重试' }) + } + } } const handleEditNickname = () => { diff --git a/app/settings.tsx b/app/settings.tsx index d896547..f9fc1f5 100644 --- a/app/settings.tsx +++ b/app/settings.tsx @@ -106,12 +106,12 @@ export default observer(function SettingsPage() { )} - {user?.name || user?.email || '未登录'} - {user?.email && user?.name && ( - {user.email} + {user?.name || user?.phoneNumber || '未登录'} + {user?.phoneNumber && user?.name && ( + {user.phoneNumber} )} - + )