diff --git a/web/src/components/MemoResourceListView.tsx b/web/src/components/MemoResourceListView.tsx index 538f0ac3..8ffb2772 100644 --- a/web/src/components/MemoResourceListView.tsx +++ b/web/src/components/MemoResourceListView.tsx @@ -1,4 +1,4 @@ -import classNames from "classnames"; +import { memo } from "react"; import { absolutifyLink } from "@/helpers/utils"; import { Resource } from "@/types/proto/api/v2/resource_service"; import { getResourceType, getResourceUrl } from "@/utils/resource"; @@ -6,106 +6,102 @@ import MemoResource from "./MemoResource"; import showPreviewImageDialog from "./PreviewImageDialog"; import SquareDiv from "./kit/SquareDiv"; -interface Props { - resourceList: Resource[]; - className?: string; -} +const MemoResourceListView = ({ resourceList = [] }: { resourceList: Resource[] }) => { + const mediaResources: Resource[] = []; + const otherResources: Resource[] = []; -const getDefaultProps = (): Props => { - return { - className: "", - resourceList: [], - }; -}; - -const MemoResourceListView: React.FC = (props: Props) => { - const { className, resourceList } = { - ...getDefaultProps(), - ...props, - }; - const imageResourceList = resourceList.filter((resource) => getResourceType(resource).startsWith("image")); - const videoResourceList = resourceList.filter((resource) => resource.type.startsWith("video")); - const otherResourceList = resourceList.filter( - (resource) => !imageResourceList.includes(resource) && !videoResourceList.includes(resource) - ); + resourceList.forEach((resource) => { + const type = getResourceType(resource); + if (type === "image/*" || type === "video/*") { + mediaResources.push(resource); + return; + } - const imgUrls = imageResourceList.map((resource) => { - return getResourceUrl(resource); + otherResources.push(resource); }); const handleImageClick = (imgUrl: string) => { + const imgUrls = mediaResources + .filter((resource) => getResourceType(resource) === "image/*") + .map((resource) => getResourceUrl(resource)); const index = imgUrls.findIndex((url) => url === imgUrl); showPreviewImageDialog(imgUrls, index); }; - return ( - <> - {imageResourceList.length > 0 && - (imageResourceList.length === 1 ? ( -
- handleImageClick(getResourceUrl(imageResourceList[0]))} - decoding="async" - /> -
- ) : ( -
- {imageResourceList.map((resource) => { - const url = getResourceUrl(resource); - return ( - - handleImageClick(url)} - decoding="async" - /> - - ); - })} -
- ))} + const MediaCard = ({ resource, thumbnail }: { resource: Resource; thumbnail?: boolean }) => { + const type = getResourceType(resource); + const url = getResourceUrl(resource); + if (type === "image/*") { + return ( + handleImageClick(url)} + decoding="async" + /> + ); + } -
- {videoResourceList.length > 0 && ( -
- {videoResourceList.map((resource) => { - const url = getResourceUrl(resource); - return ( - - - - ); - })} -
- )} -
+ if (type === "video/*") { + return ( +