Files
OpenMediaCenter/src/elements/Preview/Preview.tsx
T

137 lines
4.5 KiB
TypeScript
Raw Normal View History

2020-10-25 18:48:23 +00:00
import React from 'react';
import style from './Preview.module.css';
import {Spinner} from 'react-bootstrap';
2020-12-29 19:39:30 +00:00
import {Link} from 'react-router-dom';
2020-12-17 20:53:22 +00:00
import GlobalInfos from '../../utils/GlobalInfos';
import {FontAwesomeIcon} from '@fortawesome/react-fontawesome';
import {faPhotoVideo} from '@fortawesome/free-solid-svg-icons';
2020-05-31 20:24:35 +02:00
2021-01-24 16:43:38 +01:00
interface PreviewProps {
2021-01-22 21:05:21 +00:00
name: string;
2021-04-16 21:12:56 +02:00
picLoader: (callback: (pic: string) => void) => void;
linkPath?: string;
onClick?: () => void;
2021-10-24 13:22:14 +00:00
aspectRatio?: number;
2021-01-22 21:05:21 +00:00
}
interface PreviewState {
2021-04-16 21:12:56 +02:00
picLoaded: boolean | null;
2021-01-22 21:05:21 +00:00
}
2020-08-12 17:50:25 +00:00
/**
* Component for single preview tile
* floating side by side
*/
2021-01-22 21:05:21 +00:00
class Preview extends React.Component<PreviewProps, PreviewState> {
2021-04-16 21:12:56 +02:00
// store the picture to display
pic?: string;
2021-10-24 13:22:14 +00:00
static readonly DefMinWidth = 266;
static readonly DefMaxWidth = 410;
static readonly DefMinHeight = 150;
static readonly DefMaxHeight = 400;
2021-01-22 21:05:21 +00:00
constructor(props: PreviewProps) {
super(props);
2020-05-31 20:24:35 +02:00
this.state = {
2021-04-16 21:12:56 +02:00
picLoaded: null
2020-05-31 20:24:35 +02:00
};
}
2021-01-22 21:05:21 +00:00
componentDidMount(): void {
2021-04-16 21:12:56 +02:00
this.props.picLoader((result) => {
this.pic = result;
2020-12-17 20:53:22 +00:00
this.setState({
2021-04-16 21:12:56 +02:00
picLoaded: result !== ''
2020-12-17 20:53:22 +00:00
});
});
2020-05-31 20:24:35 +02:00
}
2021-01-22 21:05:21 +00:00
render(): JSX.Element {
2021-10-24 13:22:14 +00:00
if (this.props.linkPath != null) {
2021-04-16 21:12:56 +02:00
return <Link to={this.props.linkPath}>{this.content()}</Link>;
} else {
return this.content();
}
}
content(): JSX.Element {
const themeStyle = GlobalInfos.getThemeStyle();
2021-10-24 13:22:14 +00:00
const ratio = this.props.aspectRatio;
let dimstyle = null;
// check if aspect ratio is passed
if (ratio != null) {
// if ratio is <1 we need to calc height
if (ratio < 1) {
const height = Preview.DefMaxWidth * ratio;
dimstyle = {height: height, width: Preview.DefMaxWidth};
} else {
const width = Preview.DefMaxHeight * ratio;
dimstyle = {width: width, height: Preview.DefMaxHeight};
}
}
2020-05-31 20:24:35 +02:00
return (
2021-04-16 21:12:56 +02:00
<div
className={style.videopreview + ' ' + themeStyle.secbackground + ' ' + themeStyle.preview}
onClick={this.props.onClick}>
2021-10-24 13:22:14 +00:00
<div
style={{maxWidth: dimstyle !== null ? dimstyle.width : Preview.DefMaxWidth}}
className={style.previewtitle + ' ' + themeStyle.lighttextcolor}>
{this.props.name}
</div>
<div style={dimstyle !== null ? dimstyle : undefined} className={style.previewpic}>
2021-04-16 21:12:56 +02:00
{this.state.picLoaded === false ? (
<FontAwesomeIcon
style={{
color: 'white',
marginTop: '55px'
}}
icon={faPhotoVideo}
size='5x'
/>
) : this.state.picLoaded === null ? (
<span className={style.loadAnimation}>
<Spinner animation='border' />
</span>
) : (
2021-10-24 13:22:14 +00:00
<img
style={
dimstyle !== null
? dimstyle
: {
minWidth: Preview.DefMinWidth,
maxWidth: Preview.DefMaxWidth,
minHeight: Preview.DefMinHeight,
maxHeight: Preview.DefMaxHeight
}
}
src={this.pic}
alt='Pic loading.'
/>
2021-04-16 21:12:56 +02:00
)}
2020-06-04 16:45:24 +02:00
</div>
2021-04-16 21:12:56 +02:00
<div className={style.previewbottom} />
</div>
2020-05-31 20:24:35 +02:00
);
}
}
2020-08-12 17:50:25 +00:00
/**
* Component for a Tag-name tile (used in category page)
*/
2021-03-14 14:51:53 +00:00
export class TagPreview extends React.Component<{name: string}> {
2021-01-22 21:05:21 +00:00
render(): JSX.Element {
const themeStyle = GlobalInfos.getThemeStyle();
2020-06-07 15:48:27 +02:00
return (
2021-03-14 14:51:53 +00:00
<div className={style.videopreview + ' ' + style.tagpreview + ' ' + themeStyle.secbackground + ' ' + themeStyle.preview}>
<div className={style.tagpreviewtitle + ' ' + themeStyle.lighttextcolor}>{this.props.name}</div>
2020-06-07 15:48:27 +02:00
</div>
);
}
}
2020-05-31 20:24:35 +02:00
export default Preview;