1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- // @flow
-
- import PropTypes from 'prop-types';
- import React, { Component } from 'react';
- import { connect } from 'react-redux';
-
- import { ASPECT_RATIO_NARROW, ASPECT_RATIO_WIDE } from '../constants';
-
- /**
- * 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.
- *
- * @param {AspectRatioAware} component - An {@link AspectRatioAware} which may
- * have an {@code aspectRatio} React prop.
- * @returns {boolean}
- */
- export function isNarrowAspectRatio(component: React$Component<*>) {
- return component.props.aspectRatio === ASPECT_RATIO_NARROW;
- }
-
- /**
- * Decorates a specific React {@code Component} class into an
- * {@link AspectRatioAware} which provides the React prop {@code aspectRatio}
- * updated on each redux state change.
- *
- * @param {Class<React$Component>} WrappedComponent - A React {@code Component}
- * class to be wrapped.
- * @returns {AspectRatioAwareWrapper}
- */
- 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 = {
- /**
- * Either {@link ASPECT_RATIO_NARROW} or {@link ASPECT_RATIO_WIDE}.
- */
- aspectRatio: PropTypes.oneOf([
- ASPECT_RATIO_NARROW,
- ASPECT_RATIO_WIDE
- ])
- }
-
- /**
- * Implement's React render method to wrap the nested component.
- *
- * @returns {React$Element}
- */
- render(): React$Element<*> {
- return <WrappedComponent { ...this.props } />;
- }
- }
-
- return connect(_mapStateToProps)(AspectRatioAware);
- }
-
- /**
- * Maps (parts of) the redux state to {@link AspectRatioAware} props.
- *
- * @param {Object} state - The whole redux state.
- * @private
- * @returns {{
- * aspectRatio: Symbol
- * }}
- */
- function _mapStateToProps(state) {
- return {
- aspectRatio: state['features/base/responsive-ui'].aspectRatio
- };
- }
|