lemmy-ui/src/shared/components/common/pictrs-image.tsx

85 lines
2 KiB
TypeScript
Raw Normal View History

2021-02-22 02:39:04 +00:00
import { Component } from "inferno";
const iconThumbnailSize = 96;
const thumbnailSize = 256;
2020-12-03 14:28:13 +00:00
const maxImageSize = 3000;
interface PictrsImageProps {
src: string;
alt?: string;
icon?: boolean;
thumbnail?: boolean;
nsfw?: boolean;
iconOverlay?: boolean;
pushup?: boolean;
}
export class PictrsImage extends Component<PictrsImageProps, any> {
constructor(props: any, context: any) {
super(props, context);
}
render() {
return (
<picture>
2021-02-22 02:39:04 +00:00
<source srcSet={this.src("webp")} type="image/webp" />
<source srcSet={this.src("jpg")} type="image/jpeg" />
<img
2021-02-22 02:39:04 +00:00
src={this.src("jpg")}
alt={this.alt()}
loading="lazy"
className={`
2021-02-22 02:39:04 +00:00
${!this.props.icon && !this.props.iconOverlay && "img-fluid "}
${
this.props.thumbnail && !this.props.icon
2021-02-22 02:39:04 +00:00
? "thumbnail rounded "
: "img-expanded "
}
2021-02-22 02:39:04 +00:00
${this.props.thumbnail && this.props.nsfw && "img-blur "}
${this.props.icon && "rounded-circle img-icon mr-2 "}
${this.props.iconOverlay && "ml-2 mb-0 rounded-circle avatar-overlay "}
${this.props.pushup && "avatar-pushup "}
`}
/>
</picture>
);
}
src(format: string): string {
// sample url:
// http://localhost:8535/pictrs/image/file.png?thumbnail=256&format=jpg
2021-02-22 02:39:04 +00:00
let split = this.props.src.split("/pictrs/image/");
// If theres not multiple, then its not a pictrs image
if (split.length == 1) {
return this.props.src;
}
let host = split[0];
let path = split[1];
let params = { format };
if (this.props.thumbnail) {
2021-02-22 02:39:04 +00:00
params["thumbnail"] = thumbnailSize;
} else if (this.props.icon) {
2021-02-22 02:39:04 +00:00
params["thumbnail"] = iconThumbnailSize;
} else {
2021-02-22 02:39:04 +00:00
params["thumbnail"] = maxImageSize;
}
let paramsStr = `?${new URLSearchParams(params).toString()}`;
let out = `${host}/pictrs/image/${path}${paramsStr}`;
return out;
}
alt(): string {
if (this.props.icon) {
2021-02-22 02:39:04 +00:00
return "";
}
2021-02-22 02:39:04 +00:00
return this.props.alt || "";
}
}