From 575bc834f5b20d1e29530fb9663fc9eef7b8bf54 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Sat, 7 May 2022 12:46:21 -0500 Subject: [PATCH] StillImage: convert to TSX --- app/soapbox/components/still_image.js | 64 -------------------------- app/soapbox/components/still_image.tsx | 46 ++++++++++++++++++ 2 files changed, 46 insertions(+), 64 deletions(-) delete mode 100644 app/soapbox/components/still_image.js create mode 100644 app/soapbox/components/still_image.tsx diff --git a/app/soapbox/components/still_image.js b/app/soapbox/components/still_image.js deleted file mode 100644 index 323960a37..000000000 --- a/app/soapbox/components/still_image.js +++ /dev/null @@ -1,64 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; -import { connect } from 'react-redux'; - -import { getSettings } from 'soapbox/actions/settings'; - -const mapStateToProps = state => ({ - autoPlayGif: getSettings(state).get('autoPlayGif'), -}); - -export default @connect(mapStateToProps) -class StillImage extends React.PureComponent { - - static propTypes = { - alt: PropTypes.string, - autoPlayGif: PropTypes.bool.isRequired, - className: PropTypes.node, - src: PropTypes.string.isRequired, - style: PropTypes.object, - }; - - static defaultProps = { - alt: '', - className: '', - style: {}, - } - - hoverToPlay() { - const { autoPlayGif, src } = this.props; - return src && !autoPlayGif && (src.endsWith('.gif') || src.startsWith('blob:')); - } - - setCanvasRef = c => { - this.canvas = c; - } - - setImageRef = i => { - this.img = i; - } - - handleImageLoad = () => { - if (this.hoverToPlay()) { - const img = this.img; - const canvas = this.canvas; - canvas.width = img.naturalWidth; - canvas.height = img.naturalHeight; - canvas.getContext('2d').drawImage(img, 0, 0); - } - } - - render() { - const { alt, className, src, style } = this.props; - const hoverToPlay = this.hoverToPlay(); - - return ( -
- {alt} - {hoverToPlay && } -
- ); - } - -} diff --git a/app/soapbox/components/still_image.tsx b/app/soapbox/components/still_image.tsx new file mode 100644 index 000000000..d2ee256a3 --- /dev/null +++ b/app/soapbox/components/still_image.tsx @@ -0,0 +1,46 @@ +import classNames from 'classnames'; +import React, { useRef } from 'react'; + +import { useSettings } from 'soapbox/hooks'; + +interface IStillImage { + /** Image alt text. */ + alt?: string, + /** Extra class names for the outer
container. */ + className?: string, + /** URL to the image */ + src: string, + /** Extra CSS styles on the outer
element. */ + style?: React.CSSProperties, +} + +/** Renders images on a canvas, only playing GIFs if autoPlayGif is enabled. */ +const StillImage: React.FC = ({ alt, className, src, style }) => { + const settings = useSettings(); + const autoPlayGif = settings.get('autoPlayGif'); + + const canvas = useRef(null); + const img = useRef(null); + + const hoverToPlay = ( + src && !autoPlayGif && (src.endsWith('.gif') || src.startsWith('blob:')) + ); + + const handleImageLoad = () => { + if (hoverToPlay && canvas.current && img.current) { + canvas.current.width = img.current.naturalWidth; + canvas.current.height = img.current.naturalHeight; + canvas.current.getContext('2d')?.drawImage(img.current, 0, 0); + } + }; + + + return ( +
+ {alt} + {hoverToPlay && } +
+ ); +}; + +export default StillImage;