import classNames from "classnames"; import { absolutifyLink } from "@/helpers/utils"; import { Resource } from "@/types/proto-grpcweb/api/v2/resource_service"; import { getResourceType, getResourceUrl } from "@/utils/resource"; import MemoResource from "./MemoResource"; import showPreviewImageDialog from "./PreviewImageDialog"; import SquareDiv from "./kit/SquareDiv"; import "@/less/memo-resources.less"; interface Props { resourceList: Resource[]; className?: string; } 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) ); const imgUrls = imageResourceList.map((resource) => { return getResourceUrl(resource); }); const handleImageClick = (imgUrl: string) => { const index = imgUrls.findIndex((url) => url === imgUrl); showPreviewImageDialog(imgUrls, index); }; return ( <> {imageResourceList.length > 0 && (imageResourceList.length === 1 ? (
handleImageClick(getResourceUrl(imageResourceList[0]))} decoding="async" loading="lazy" />
) : (
{imageResourceList.map((resource) => { const url = getResourceUrl(resource); return ( handleImageClick(url)} decoding="async" loading="lazy" /> ); })}
))}
{videoResourceList.length > 0 && (
{videoResourceList.map((resource) => { const url = getResourceUrl(resource); return ( ); })}
)}
{otherResourceList.length > 0 && (
{otherResourceList.map((resource) => { return ; })}
)} ); }; export default MemoResourceListView;