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}
)}
-
+
)