Create separate ImageFile component for image attachments

This commit is contained in:
Michaili K
2021-08-15 18:53:42 +02:00
parent 1b4d1e73df
commit 88c9775e23
3 changed files with 56 additions and 22 deletions

View File

@@ -0,0 +1,49 @@
import {Attachment} from "revolt-api/types/Autumn";
import styles from "./Attachment.module.scss";
import classNames from "classnames";
import {useContext, useState} from "preact/hooks";
import {useIntermediate} from "../../../../context/intermediate/Intermediate";
import {AppContext} from "../../../../context/revoltjs/RevoltClient";
enum ImageLoadingState
{
Loading,
Loaded,
Error
}
interface Props {
attachment: Attachment;
}
export default function ImageFile({ attachment }: Props)
{
const [loading, setLoading] = useState(ImageLoadingState.Loading);
const client = useContext(AppContext);
const { openScreen } = useIntermediate();
const url = client.generateFileURL(attachment)!;
return <img
src={url}
alt={attachment.filename}
loading="lazy"
className={classNames(styles.image, {
[styles.loading]: loading !== ImageLoadingState.Loaded
})}
onClick={() =>
openScreen({id: "image_viewer", attachment})
}
onMouseDown={(ev) =>
ev.button === 1 && window.open(url, "_blank")
}
onLoad={() =>
setLoading(ImageLoadingState.Loaded)
}
onError={() =>
setLoading(ImageLoadingState.Error)
}
/>
}