Merge pull request #184 from tootsuite/master
Fix reduced motion breaking public galleries (#5423)
This commit is contained in:
		| @@ -1,34 +1,56 @@ | ||||
| // Like react-motion's Motion, but checks to see if the user prefers | ||||
| // reduced motion and uses a cross-fade in those cases. | ||||
|  | ||||
| import React from 'react'; | ||||
| import Motion from 'react-motion/lib/Motion'; | ||||
| import { connect } from 'react-redux'; | ||||
| import PropTypes from 'prop-types'; | ||||
|  | ||||
| const stylesToKeep = ['opacity', 'backgroundOpacity']; | ||||
|  | ||||
| let reduceMotion; | ||||
|  | ||||
| const extractValue = (value) => { | ||||
|   // This is either an object with a "val" property or it's a number | ||||
|   return (typeof value === 'object' && value && 'val' in value) ? value.val : value; | ||||
| }; | ||||
|  | ||||
| const mapStateToProps = (state, ownProps) => { | ||||
|   const reduceMotion = state.getIn(['meta', 'reduce_motion']); | ||||
| class OptionalMotion extends React.Component { | ||||
|  | ||||
|   if (reduceMotion) { | ||||
|     const { style, defaultStyle } = ownProps; | ||||
|  | ||||
|     Object.keys(style).forEach(key => { | ||||
|       if (stylesToKeep.includes(key)) { | ||||
|         return; | ||||
|       } | ||||
|       // If it's setting an x or height or scale or some other value, we need | ||||
|       // to preserve the end-state value without actually animating it | ||||
|       style[key] = defaultStyle[key] = extractValue(style[key]); | ||||
|     }); | ||||
|  | ||||
|     return { style, defaultStyle }; | ||||
|   static propTypes = { | ||||
|     defaultStyle: PropTypes.object, | ||||
|     style: PropTypes.object, | ||||
|     children: PropTypes.func, | ||||
|   } | ||||
|   return {}; | ||||
| }; | ||||
|  | ||||
| export default connect(mapStateToProps)(Motion); | ||||
|   render() { | ||||
|  | ||||
|     const { style, defaultStyle, children } = this.props; | ||||
|  | ||||
|     if (typeof reduceMotion !== 'boolean') { | ||||
|       // This never changes without a page reload, so we can just grab it | ||||
|       // once from the body classes as opposed to using Redux's connect(), | ||||
|       // which would unnecessarily update every state change | ||||
|       reduceMotion = document.body.classList.contains('reduce-motion'); | ||||
|     } | ||||
|     if (reduceMotion) { | ||||
|       Object.keys(style).forEach(key => { | ||||
|         if (stylesToKeep.includes(key)) { | ||||
|           return; | ||||
|         } | ||||
|         // If it's setting an x or height or scale or some other value, we need | ||||
|         // to preserve the end-state value without actually animating it | ||||
|         style[key] = defaultStyle[key] = extractValue(style[key]); | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     return ( | ||||
|       <Motion style={style} defaultStyle={defaultStyle}> | ||||
|         {children} | ||||
|       </Motion> | ||||
|     ); | ||||
|   } | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| export default OptionalMotion; | ||||
|   | ||||
| @@ -29,6 +29,7 @@ | ||||
|     = yield :header_tags | ||||
|  | ||||
|   - body_classes ||= @body_classes || '' | ||||
|   - body_classes += ' reduce-motion' if current_account&.user&.setting_reduce_motion | ||||
|   - body_classes += ' system-font' if current_account&.user&.setting_system_font_ui | ||||
|  | ||||
|   %body{ class: add_rtl_body_class(body_classes) } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user