diff --git a/src/elderly/components/MediaLibraryGrid.tsx b/src/elderly/components/MediaLibraryGrid.tsx new file mode 100644 index 0000000..b4a5eab --- /dev/null +++ b/src/elderly/components/MediaLibraryGrid.tsx @@ -0,0 +1,167 @@ +import React, { useState, useMemo } from 'react'; +import { X } from 'lucide-react'; + +interface MediaItem { + id: string; + url: string; + thumbnailUrl?: string; + type: 'photo' | 'video'; + caption: string; + tags?: string[]; +} + +interface MediaLibraryGridProps { + mediaList: MediaItem[]; + currentIndex: number; + onSelect: (index: number) => void; + onClose: () => void; +} + +/** + * 媒体库网格视图 + * 类似手机相册的缩略图展示,支持标签筛选 + */ +export const MediaLibraryGrid: React.FC = ({ + mediaList, + currentIndex, + onSelect, + onClose, +}) => { + const [selectedTag, setSelectedTag] = useState('全部'); + + // 提取所有标签 + const allTags = useMemo(() => { + const tagsSet = new Set(); + mediaList.forEach(item => { + item.tags?.forEach(tag => tagsSet.add(tag)); + }); + return ['全部', ...Array.from(tagsSet).sort()]; + }, [mediaList]); + + // 根据选中的标签筛选媒体 + const filteredMedia = useMemo(() => { + if (selectedTag === '全部') { + return mediaList; + } + return mediaList.filter(item => item.tags?.includes(selectedTag)); + }, [mediaList, selectedTag]); + + return ( +
+ {/* 顶部区域 - 标题和标签 */} +
+ {/* 标题栏 */} +
+

回忆相册

+ +
+ + {/* 标签筛选栏 */} + {allTags.length > 1 && ( +
+
+ {allTags.map(tag => ( + + ))} +
+
+ )} +
+ + {/* 网格视图 */} +
+ {filteredMedia.length === 0 ? ( +
+

暂无"{selectedTag}"相关的照片或视频

+
+ ) : ( +
+ {filteredMedia.map((item) => { + // 找到该项在原始列表中的索引 + const originalIndex = mediaList.findIndex(m => m.id === item.id); + return ( + + ); + })} +
+ )} +
+ + {/* 底部信息 */} +
+

+ {selectedTag === '全部' + ? `共 ${mediaList.length} 张照片` + : `${selectedTag}:${filteredMedia.length} 张照片` + } +

+
+
+ ); +};