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

84 lines
2 KiB
TypeScript
Raw Normal View History

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>
<source srcSet={this.src('webp')} type="image/webp" />
<source srcSet={this.src('jpg')} type="image/jpeg" />
<img
src={this.src('jpg')}
alt={this.alt()}
className={`
${!this.props.icon && !this.props.iconOverlay && 'img-fluid '}
${
this.props.thumbnail && !this.props.icon
? 'thumbnail rounded '
: 'img-expanded '
}
${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
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) {
params['thumbnail'] = thumbnailSize;
} else if (this.props.icon) {
params['thumbnail'] = iconThumbnailSize;
} else {
params['thumbnail'] = maxImageSize;
}
let paramsStr = `?${new URLSearchParams(params).toString()}`;
let out = `${host}/pictrs/image/${path}${paramsStr}`;
return out;
}
alt(): string {
if (this.props.icon) {
return '';
}
return this.props.alt || '';
}
}