// gomuks - A Matrix client written in Go. // Copyright (C) 2024 Sumner Evans // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . import React, { use } from "react" import { getEncryptedMediaURL, getMediaURL } from "@/api/media" import { RoomStateStore, usePreference } from "@/api/statestore" import { MemDBEvent, URLPreview } from "@/api/types" import { ImageContainerSize, calculateMediaSize } from "@/util/mediasize" import ClientContext from "../ClientContext" import { LightboxContext } from "../modal" import "./URLPreviews.css" const URLPreviews = ({ event, room }: { room: RoomStateStore event: MemDBEvent }) => { const client = use(ClientContext)! const renderPreviews = usePreference(client.store, room, "render_url_previews") if (event.redacted_by || !renderPreviews) { return null } const previews = (event.content["com.beeper.linkpreviews"] ?? event.content["m.url_previews"]) as URLPreview[] if (!previews || !previews.length) { return null } return
{previews .filter(p => p["og:title"] || p["og:image"] || p["beeper:image:encryption"]) .map(p => { const mediaURL = p["beeper:image:encryption"] ? getEncryptedMediaURL(p["beeper:image:encryption"].url) : getMediaURL(p["og:image"]) const aspectRatio = (p["og:image:width"] ?? 1) / (p["og:image:height"] ?? 1) let containerSize: ImageContainerSize | undefined let inline = false if (aspectRatio < 1.2) { containerSize = { width: 80, height: 80 } inline = true } const style = calculateMediaSize(p["og:image:width"], p["og:image:height"], containerSize) const url = p["og:url"] ?? p.matched_url const title = p["og:title"] ?? p["og:url"] ?? url const mediaContainer =
return
{title}
{p["og:description"]}
{mediaURL && (inline ?
{mediaContainer}
: mediaContainer)}
})}
} export default React.memo(URLPreviews)