79 lines
2.5 KiB
TypeScript
79 lines
2.5 KiB
TypeScript
import * as loader from "tc-loader";
|
|
import React from "react";
|
|
import {joinClassList} from "tc-shared/ui/react-elements/Helper";
|
|
import {ClientIconRenderer} from "tc-shared/ui/react-elements/Icons";
|
|
import {ClientIcon} from "svg-sprites/client-icons";
|
|
import ReactDOM from "react-dom";
|
|
|
|
const cssStyle = require("./ImagePreview.scss");
|
|
|
|
const imagePreviewInstance = React.createRef<ImagePreview>();
|
|
class ImagePreview extends React.PureComponent<{}, {
|
|
imageUrl: string | undefined,
|
|
targetUrl: string | undefined
|
|
}> {
|
|
constructor(props) {
|
|
super(props);
|
|
|
|
this.state = { targetUrl: undefined, imageUrl: undefined };
|
|
}
|
|
|
|
render() {
|
|
return (
|
|
<div
|
|
className={joinClassList(cssStyle.overlay, (!this.state.imageUrl ? cssStyle.hidden : undefined))}
|
|
onClick={event => {
|
|
if(event.isDefaultPrevented()) {
|
|
return;
|
|
}
|
|
|
|
this.closePreview()
|
|
}}
|
|
>
|
|
<div className={cssStyle.containerMenuBar}>
|
|
<div
|
|
className={cssStyle.entry}
|
|
onClick={() => {
|
|
const win = window.open(this.state.targetUrl, '_blank');
|
|
win.focus();
|
|
}}
|
|
>
|
|
<ClientIconRenderer icon={ClientIcon.ImagePreviewBrowse} />
|
|
</div>
|
|
<div
|
|
className={cssStyle.entry}
|
|
onClick={() => this.closePreview()}
|
|
>
|
|
<ClientIconRenderer icon={ClientIcon.CloseButton} />
|
|
</div>
|
|
</div>
|
|
<div className={cssStyle.containerImage}>
|
|
<img src={this.state.imageUrl} title={this.state.targetUrl} alt={null} />
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
closePreview() {
|
|
this.setState({ imageUrl: undefined, targetUrl: undefined });
|
|
}
|
|
}
|
|
|
|
export const ImagePreviewHook = React.memo(() => {
|
|
return <ImagePreview ref={imagePreviewInstance} />;
|
|
})
|
|
|
|
export function showImagePreview(url: string, originalUrl: string) {
|
|
imagePreviewInstance.current?.setState({
|
|
imageUrl: url,
|
|
targetUrl: originalUrl
|
|
});
|
|
}
|
|
|
|
export function isImagePreviewAvailable() {
|
|
return !!imagePreviewInstance.current;
|
|
}
|
|
|
|
export function closeImagePreview() {
|
|
imagePreviewInstance.current?.closePreview();
|
|
} |