refactor: streamline post sync, fix image gallery, and clean up chat screen
- **Post sync optimization**: Clear store immediately when params change to prevent flashing old posts; replace instead of merge on refresh - **ImageGallery fix**: Use idempotent download option, migrate to Asset.create() API, fix Android file path requirement, ensure proper cleanup - **UserProfileScreen**: Add ImageGallery for post image viewing with consistent implementation - **SearchScreen**: Add entrance animation and empty state - **ChatScreen**: Remove unused state variables (lastSeq, firstSeq, isProgrammaticScrollRef) and dead imports
This commit is contained in:
@@ -213,6 +213,7 @@ export const ImageGallery: React.FC<ImageGalleryProps> = ({
|
||||
}
|
||||
|
||||
setSaving(true);
|
||||
let downloaded: InstanceType<typeof File> | null = null;
|
||||
try {
|
||||
const urlPath = currentImage.url.split('?')[0];
|
||||
const ext = urlPath.split('.').pop()?.toLowerCase() ?? 'jpg';
|
||||
@@ -222,13 +223,14 @@ export const ImageGallery: React.FC<ImageGalleryProps> = ({
|
||||
const fileName = `withyou_${Date.now()}.${fileExt}`;
|
||||
const destination = new File(Paths.cache, fileName);
|
||||
|
||||
// File.downloadFileAsync 是新版 expo-file-system/next 的静态方法
|
||||
const downloaded = await File.downloadFileAsync(currentImage.url, destination);
|
||||
// File.downloadFileAsync 是新版 expo-file-system 的静态方法
|
||||
downloaded = await File.downloadFileAsync(currentImage.url, destination, {
|
||||
idempotent: true,
|
||||
});
|
||||
|
||||
await MediaLibrary.saveToLibraryAsync(downloaded.uri);
|
||||
|
||||
// 清理缓存文件
|
||||
downloaded.delete();
|
||||
// expo-media-library v17+ 已移除顶层 saveToLibraryAsync,改用 Asset.create()
|
||||
// 在 Android 上 filePath 必须以 file:/// 开头
|
||||
await MediaLibrary.Asset.create(downloaded.uri);
|
||||
|
||||
onSave?.(currentImage.url);
|
||||
showToast('success');
|
||||
@@ -236,6 +238,14 @@ export const ImageGallery: React.FC<ImageGalleryProps> = ({
|
||||
console.error('[ImageGallery] 保存图片失败:', err);
|
||||
showToast('error');
|
||||
} finally {
|
||||
// 清理缓存文件(无论成功失败都清理,避免残留)
|
||||
if (downloaded) {
|
||||
try {
|
||||
downloaded.delete();
|
||||
} catch (cleanupErr) {
|
||||
console.warn('[ImageGallery] 清理缓存文件失败:', cleanupErr);
|
||||
}
|
||||
}
|
||||
setSaving(false);
|
||||
}
|
||||
}, [currentImage, saving, onSave, showToast]);
|
||||
|
||||
Reference in New Issue
Block a user