Fix reduced motion breaking public galleries (#5423)
This commit is contained in:
		
							parent
							
								
									34118169ac
								
							
						
					
					
						commit
						8980aa804f
					
				| @ -1,34 +1,56 @@ | |||||||
| // Like react-motion's Motion, but checks to see if the user prefers
 | // Like react-motion's Motion, but checks to see if the user prefers
 | ||||||
| // reduced motion and uses a cross-fade in those cases.
 | // reduced motion and uses a cross-fade in those cases.
 | ||||||
| 
 | 
 | ||||||
|  | import React from 'react'; | ||||||
| import Motion from 'react-motion/lib/Motion'; | import Motion from 'react-motion/lib/Motion'; | ||||||
| import { connect } from 'react-redux'; | import PropTypes from 'prop-types'; | ||||||
| 
 | 
 | ||||||
| const stylesToKeep = ['opacity', 'backgroundOpacity']; | const stylesToKeep = ['opacity', 'backgroundOpacity']; | ||||||
| 
 | 
 | ||||||
|  | let reduceMotion; | ||||||
|  | 
 | ||||||
| const extractValue = (value) => { | const extractValue = (value) => { | ||||||
|   // This is either an object with a "val" property or it's a number
 |   // 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; |   return (typeof value === 'object' && value && 'val' in value) ? value.val : value; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| const mapStateToProps = (state, ownProps) => { | class OptionalMotion extends React.Component { | ||||||
|   const reduceMotion = state.getIn(['meta', 'reduce_motion']); |  | ||||||
| 
 | 
 | ||||||
|   if (reduceMotion) { |   static propTypes = { | ||||||
|     const { style, defaultStyle } = ownProps; |     defaultStyle: PropTypes.object, | ||||||
| 
 |     style: PropTypes.object, | ||||||
|     Object.keys(style).forEach(key => { |     children: PropTypes.func, | ||||||
|       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 }; |  | ||||||
|   } |   } | ||||||
|   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; | ||||||
|  | |||||||
| @ -27,6 +27,7 @@ | |||||||
|     = yield :header_tags |     = yield :header_tags | ||||||
| 
 | 
 | ||||||
|   - body_classes ||= @body_classes || '' |   - 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_classes += ' system-font' if current_account&.user&.setting_system_font_ui | ||||||
| 
 | 
 | ||||||
|   %body{ class: add_rtl_body_class(body_classes) } |   %body{ class: add_rtl_body_class(body_classes) } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user