From fab73d196f1f20f806d4d7b4543a1a402d6687f5 Mon Sep 17 00:00:00 2001 From: jinyaqiu Date: Mon, 4 Aug 2025 20:00:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=AE=BE=E7=BD=AE=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(tabs)/setting.tsx | 15 ++- components/user-message.tsx/look.tsx | 5 +- lib/background-uploader/types.ts | 131 ++++++++++++++------------- 3 files changed, 80 insertions(+), 71 deletions(-) diff --git a/app/(tabs)/setting.tsx b/app/(tabs)/setting.tsx index eda0964..dcfb7d2 100644 --- a/app/(tabs)/setting.tsx +++ b/app/(tabs)/setting.tsx @@ -11,7 +11,7 @@ import { checkNotificationPermission, getLocationPermission, getPermissions, req import { ThemedText } from '@/components/ThemedText'; import { useAuth } from '@/contexts/auth-context'; import { fetchApi } from '@/lib/server-api-util'; -import { Address } from '@/types/user'; +import { Address, User, UserInfoDetails } from '@/types/user'; import * as Location from 'expo-location'; import { useFocusEffect, useRouter } from 'expo-router'; import * as SecureStore from 'expo-secure-store'; @@ -20,8 +20,14 @@ import { useTranslation } from 'react-i18next'; import { Linking, Platform, Pressable, ScrollView, StyleSheet, Text, TouchableOpacity, View } from 'react-native'; import { useSafeAreaInsets } from "react-native-safe-area-context"; -const Setting = (props: { userInfo: any }) => { - const { userInfo } = props; +const Setting = (props: { userInfo: UserInfoDetails }) => { + const [userInfo, setUserInfo] = useState(null); + + const getUserInfo = async () => { + const res = await fetchApi("/iam/user-info"); + setUserInfo(res); + } + const insets = useSafeAreaInsets(); const { t } = useTranslation(); // 判断当前语言环境 @@ -200,6 +206,7 @@ const Setting = (props: { userInfo: any }) => { // 获取语言环境 useEffect(() => { getLanguage(); + getUserInfo() }, []) return ( @@ -220,7 +227,7 @@ const Setting = (props: { userInfo: any }) => { {/* 用户信息 */} @@ -32,11 +33,11 @@ export default function Look(props: Props) { {t('auth.userMessage.avatorText2', { ns: 'login' })} { - fileData[0]?.previewUrl + fileData[0]?.preview || fileData[0]?.previewUrl ? : avatar diff --git a/lib/background-uploader/types.ts b/lib/background-uploader/types.ts index e7ace0c..d4c2e5f 100644 --- a/lib/background-uploader/types.ts +++ b/lib/background-uploader/types.ts @@ -1,8 +1,8 @@ import * as MediaLibrary from 'expo-media-library'; export type ExtendedAsset = MediaLibrary.Asset & { - size?: number; - exif?: Record | null; + size?: number; + exif?: Record | null; }; // 上传任务类型 @@ -18,92 +18,93 @@ export type UploadTask = { // 文件元数据信息 interface FileSize { - value: number; - unit: string; + value: number; + unit: string; } interface FileMetadata { - originalName: string; - type: string; - isCompressed: string; - fileType: string; + originalName: string; + type: string; + isCompressed: string; + fileType: string; } // 后端返回的文件信息 interface FileInfo { - file_id: number; - name: string; - size: FileSize; - content_type: string; // 这里与 ConfirmUpload 的 content_type 定义不同,需要注意 - upload_time: string; - storage_medium: string; - file_path: string; // 这里与 ConfirmUpload 的 file_path 定义不同 - uploader_id: number; - upload_status: string; - deletion_status: string; - metadata: FileMetadata; + file_id: number; + name: string; + size: FileSize; + content_type: string; // 这里与 ConfirmUpload 的 content_type 定义不同,需要注意 + upload_time: string; + storage_medium: string; + file_path: string; // 这里与 ConfirmUpload 的 file_path 定义不同 + uploader_id: number; + upload_status: string; + deletion_status: string; + metadata: FileMetadata; } // 上传队列项 - 作为唯一的类型定义 // 定义 EXIF 数据类型 export type ExifData = { - GPSLatitude?: number | undefined; - GPSLongitude?: number | undefined; - GPSAltitude?: number | undefined; - DateTimeOriginal?: string | undefined; - Make?: string | undefined; - Model?: string | undefined; - ExposureTime?: number | undefined; - FNumber?: number | undefined; - ISOSpeedRatings?: number | undefined; - FocalLength?: number | undefined; - [key: string]: any; + GPSLatitude?: number | undefined; + GPSLongitude?: number | undefined; + GPSAltitude?: number | undefined; + DateTimeOriginal?: string | undefined; + Make?: string | undefined; + Model?: string | undefined; + ExposureTime?: number | undefined; + FNumber?: number | undefined; + ISOSpeedRatings?: number | undefined; + FocalLength?: number | undefined; + [key: string]: any; }; // 默认的 EXIF 数据结构 export const defaultExifData: ExifData = { - GPSLatitude: undefined, - GPSLongitude: undefined, - GPSAltitude: undefined, - DateTimeOriginal: undefined, - Make: undefined, - Model: undefined, - ExposureTime: undefined, - FNumber: undefined, - ISOSpeedRatings: undefined, - FocalLength: undefined, + GPSLatitude: undefined, + GPSLongitude: undefined, + GPSAltitude: undefined, + DateTimeOriginal: undefined, + Make: undefined, + Model: undefined, + ExposureTime: undefined, + FNumber: undefined, + ISOSpeedRatings: undefined, + FocalLength: undefined, }; // 压缩图片可配置参数 export interface ImagesuploaderProps { - children?: React.ReactNode; - style?: import('react-native').StyleProp; - onPickImage?: (file: File, exifData: ExifData) => void; - compressQuality?: number; - maxWidth?: number; - maxHeight?: number; - preserveExif?: boolean; - uploadOriginal?: boolean; - onUploadComplete?: (result: FileUploadItem[]) => void; - onProgress?: (progress: any) => void; // TODO: Define a proper type for progress - multipleChoice?: boolean; - fileType?: any[]; // TODO: Use MediaType from expo-image-picker - showPreview?: boolean; + children?: React.ReactNode; + style?: import('react-native').StyleProp; + onPickImage?: (file: File, exifData: ExifData) => void; + compressQuality?: number; + maxWidth?: number; + maxHeight?: number; + preserveExif?: boolean; + uploadOriginal?: boolean; + onUploadComplete?: (result: FileUploadItem[]) => void; + onProgress?: (progress: any) => void; // TODO: Define a proper type for progress + multipleChoice?: boolean; + fileType?: any[]; // TODO: Use MediaType from expo-image-picker + showPreview?: boolean; } export interface FileUploadItem { - id: string; - uri: string; // 用于本地展示的资源URI - name: string; - progress: number; - status: 'pending' | 'uploading' | 'success' | 'error'; // 统一状态 - error?: string | null; - previewUrl: string; // 预览URL - file?: File; - type: 'image' | 'video'; - thumbnail?: string; // 缩略图URL - thumbnailFile?: File; // 缩略图文件对象 - originalFile?: FileInfo // 上传后返回的文件信息 + id: string; + uri: string; // 用于本地展示的资源URI + name: string; + progress: number; + status: 'pending' | 'uploading' | 'success' | 'error'; // 统一状态 + error?: string | null; + previewUrl: string; // 预览URL + preview: string; // 预览URL + file?: File; + type: 'image' | 'video'; + thumbnail?: string; // 缩略图URL + thumbnailFile?: File; // 缩略图文件对象 + originalFile?: FileInfo // 上传后返回的文件信息 } // 确认上传返回