yahoo/scrollable

View on GitHub
examples/main.js

Summary

Maintainability
A
2 hrs
Test Coverage
/* Copyright 2015, Yahoo Inc.
   Copyrights licensed under the MIT License.
   See the accompanying LICENSE file for terms. */
var React = require('react');
var ReactDOM = require('react-dom');

var container = document.getElementById('container');


var MinimalScroller = require('./minimal');
var ComsumptionMode = require('./consumption');
var FancyHeader = require('./fancy-header');
var Reminders = require('./reminders');
var NestedScrollers = require('./nested');
var NestedNative = require('./nested-native');

var App = React.createClass({

  getInitialState: function () {
    // intentionally get window.history.state, as this is also
    // available during reload.
    // this way it's possible to reload during development.
    var startWith = window.history.state || (document.location.hash+'').replace(/^#/,'') || 'nav';
    return {
      currentExample: startWith,
    };
  },

  switchExample: function(example, event) {
    if(event) {
      event.preventDefault();
      event.stopPropagation();
    }
    if (example !== this.state.currentExample) {
      this.setState({
        currentExample: example,
      });
      var url = (document.location.href+'').replace(/#.*$/,'') + '#' + example;
      window.history.pushState(example, '', url);
    }
  },

  componentDidMount: function () {
    var self = this;
    var url = (document.location.href+'').replace(/#.*$/,'') + '#' + self.state.currentExample;
    window.history.replaceState(self.state.currentExample, '', url);
    window.addEventListener('popstate', function(event) {
      if(event.state && event.state !== self.state.currentExample) {
        self.setState({
          currentExample: event.state,
        });
      }
    });
  },

  render: function () {
    var self = this;
    var render = self.state.currentExample;

    if (render === 'nav') {
      var examples = [
        { name:        'minimal',
          description: "minimal/ - the most minimalist example"},
        { name:        'consumption',
          description: "consumption/ - top and bottom bar consumption mode"},
        { name:        'fancy-header',
          description: "fancy-header/ - fading and parallax transitions based on scroll"},
        { name:        'reminders',
          description: "reminders/ - just like Apple's Reminders App"},
        { name:        'nested',
          description: "nested/ - Nested scrollers with orthogonal directions"},
        { name:        'nested-native',
          description: "nested-native/ - Nested scrollers WITHOUT <Scroller>"},
      ];

      var navList = examples.map(function(example) {
        var name = example.name;
        var click = self.switchExample.bind(self, example.name);
        return (
          <li key={'nav-'+name} style={{paddingTop: 10}}>
            <a href={"#"+name} onClick={click}>
              {example.description}
            </a>
          </li>
        );
      });
    }

    return (
      <div>

        { render === 'minimal'       && <MinimalScroller /> }
        { render === 'consumption'   && <ComsumptionMode /> }
        { render === 'fancy-header'  && <FancyHeader /> }
        { render === 'reminders'     && <Reminders /> }
        { render === 'nested'        && <NestedScrollers /> }
        { render === 'nested-native' && <NestedNative /> }

        { render === 'nav' &&
          <div style={{padding: '10px', fontSize: '14px'}}>
            <h4>Choose a scroll example:</h4>
            <ul style={{paddingLeft: '15px'}}>
              {navList}
            </ul>
            <br/><br/>
            <p>There is no navigation on the examples themselves.</p>
            <p>{"Remember to hit back when you're done."}</p>
          </div>
        }

      </div>
    );
  }

});

ReactDOM.render(<App />, container);