2017-10-13 16:13:46 +00:00
|
|
|
// @flow
|
2017-11-03 20:14:38 +00:00
|
|
|
|
2017-10-13 16:13:46 +00:00
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
import React, { Component } from 'react';
|
|
|
|
import { connect } from 'react-redux';
|
|
|
|
|
2017-11-03 20:14:38 +00:00
|
|
|
import { ASPECT_RATIO_NARROW, ASPECT_RATIO_WIDE } from '../constants';
|
|
|
|
|
|
|
|
/**
|
2017-11-07 14:28:08 +00:00
|
|
|
* Determines whether a specific React {@code Component} decorated into an
|
|
|
|
* {@link AspectRatioAware} has {@link ASPECT_RATIO_NARROW} as the value of its
|
|
|
|
* {@code aspectRatio} React prop.
|
2017-11-03 20:14:38 +00:00
|
|
|
*
|
2017-11-07 14:28:08 +00:00
|
|
|
* @param {AspectRatioAware} component - An {@link AspectRatioAware} which may
|
|
|
|
* have an {@code aspectRatio} React prop.
|
2017-11-03 20:14:38 +00:00
|
|
|
* @returns {boolean}
|
|
|
|
*/
|
|
|
|
export function isNarrowAspectRatio(component: React$Component<*>) {
|
|
|
|
return component.props.aspectRatio === ASPECT_RATIO_NARROW;
|
|
|
|
}
|
2017-10-13 16:13:46 +00:00
|
|
|
|
|
|
|
/**
|
2017-11-03 20:14:38 +00:00
|
|
|
* Decorates a specific React {@code Component} class into an
|
|
|
|
* {@link AspectRatioAware} which provides the React prop {@code aspectRatio}
|
|
|
|
* updated on each redux state change.
|
2017-10-13 16:13:46 +00:00
|
|
|
*
|
2017-11-03 20:14:38 +00:00
|
|
|
* @param {Class<React$Component>} WrappedComponent - A React {@code Component}
|
|
|
|
* class to be wrapped.
|
2017-10-13 16:13:46 +00:00
|
|
|
* @returns {AspectRatioAwareWrapper}
|
|
|
|
*/
|
2017-11-03 20:14:38 +00:00
|
|
|
export function makeAspectRatioAware(
|
|
|
|
WrappedComponent: Class<React$Component<*>>
|
|
|
|
): Class<React$Component<*>> {
|
|
|
|
/**
|
|
|
|
* Renders {@code WrappedComponent} with the React prop {@code aspectRatio}.
|
|
|
|
*/
|
|
|
|
class AspectRatioAware extends Component<*> {
|
|
|
|
/**
|
|
|
|
* Properties of the aspect ratio aware wrapper.
|
|
|
|
*/
|
|
|
|
static propTypes = {
|
2017-10-13 16:13:46 +00:00
|
|
|
/**
|
2017-11-03 20:14:38 +00:00
|
|
|
* Either {@link ASPECT_RATIO_NARROW} or {@link ASPECT_RATIO_WIDE}.
|
2017-10-13 16:13:46 +00:00
|
|
|
*/
|
2017-11-03 20:14:38 +00:00
|
|
|
aspectRatio: PropTypes.oneOf([
|
|
|
|
ASPECT_RATIO_NARROW,
|
|
|
|
ASPECT_RATIO_WIDE
|
|
|
|
])
|
|
|
|
}
|
2017-10-13 16:13:46 +00:00
|
|
|
|
2017-11-03 20:14:38 +00:00
|
|
|
/**
|
|
|
|
* Implement's React render method to wrap the nested component.
|
|
|
|
*
|
|
|
|
* @returns {React$Element}
|
|
|
|
*/
|
|
|
|
render(): React$Element<*> {
|
|
|
|
return <WrappedComponent { ...this.props } />;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return connect(_mapStateToProps)(AspectRatioAware);
|
2017-10-13 16:13:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2017-11-07 14:28:08 +00:00
|
|
|
* Maps (parts of) the redux state to {@link AspectRatioAware} props.
|
2017-10-13 16:13:46 +00:00
|
|
|
*
|
2017-11-07 14:28:08 +00:00
|
|
|
* @param {Object} state - The whole redux state.
|
|
|
|
* @private
|
2017-10-13 16:13:46 +00:00
|
|
|
* @returns {{
|
|
|
|
* aspectRatio: Symbol
|
|
|
|
* }}
|
|
|
|
*/
|
|
|
|
function _mapStateToProps(state) {
|
|
|
|
return {
|
|
|
|
aspectRatio: state['features/base/aspect-ratio'].aspectRatio
|
|
|
|
};
|
|
|
|
}
|