Capturator/react-responsive-media

View on GitHub
src/ResponsiveContainer.js

Summary

Maintainability
A
0 mins
Test Coverage
var React = require('react');
var cloneWithProps = require('react/lib/cloneWithProps');
var MQ = require('mediaquery');

var ResponsiveContainer = React.createClass({
  getInitialState: function () {
    this.mm = window.matchMedia;

    this.mq = MQ.asArray(this.props.mq);

    return {
      currentMedia: this.mq
        .reduce((prev, next, index, array) => {
          if (index === array.length) {
            prev[next[0]] = true;
          } else {
            prev[next[0]] = false;
          }
          return prev;
        }, {})
    };
  },

  componentDidMount: function () {
    this.updateMediaQueries();
    var mm = this.mm;
    var mq = this.mq;

    Object.keys(mq).forEach(q => {
      mm(mq[q]).addListener(() => {
        this.updateMediaQueries();
      });
    });
  },

  updateMediaQueries: function () {
    var mm = this.mm;
    var mq = this.mq;

    this.setState({
      currentMedia: this.mq
        .reduce((prev, next) => {
          prev[next[0]] = mm(next[1]).matches;
          return prev;
        }, {})
    });
  },

  render: function () {
    return cloneWithProps(React.Children.only(this.props.children), {
      currentMedia: this.state.currentMedia
    });
  }
});

module.exports = ResponsiveContainer;