diff --git a/src/ui/component/cardMedia/FreezeframeWrapper.jsx b/src/ui/component/cardMedia/FreezeframeWrapper.jsx new file mode 100644 index 000000000..a46f40ae5 --- /dev/null +++ b/src/ui/component/cardMedia/FreezeframeWrapper.jsx @@ -0,0 +1,34 @@ +import React, { useEffect } from 'react'; +import PropTypes from 'prop-types'; +import Freezeframe from 'freezeframe'; + +const FreezeframeWrapper = props => { + const imgRef = React.useRef(); + const freezeframe = React.useRef(); + + const { src, className, options } = props; + + useEffect(() => { + freezeframe.current = new Freezeframe(imgRef.current, options); + }, [options]); + + return ( +
+ +
+ ); +}; + +FreezeframeWrapper.propTypes = { + src: PropTypes.string.isRequired, + className: PropTypes.string.isRequired, + // Docs: https://github.com/ctrl-freaks/freezeframe.js/tree/master/packages/freezeframe + options: PropTypes.shape({ + selector: PropTypes.string, + trigger: PropTypes.oneOf(['hover', 'click', false]), + overlay: PropTypes.boolean, + responsive: PropTypes.boolean, + }), +}; + +export default FreezeframeWrapper; diff --git a/src/ui/component/cardMedia/view.jsx b/src/ui/component/cardMedia/view.jsx index b1f38f853..d976ec151 100644 --- a/src/ui/component/cardMedia/view.jsx +++ b/src/ui/component/cardMedia/view.jsx @@ -1,21 +1,24 @@ // @flow import React from 'react'; +import FreezeframeWrapper from './FreezeframeWrapper'; import Placeholder from './placeholder.png'; type Props = { thumbnail: ?string, // externally sourced image }; +const className = 'media__thumb'; + class CardMedia extends React.PureComponent { render() { const { thumbnail } = this.props; - return ( -
- ); + if (thumbnail && thumbnail.endsWith('gif')) { + return ; + } + + const url = thumbnail || Placeholder; + return
; } }