Skip to content
Snippets Groups Projects
Select Git revision
  • a01b939dfbe51494d1d1831634746cef3dc50a26
  • annotation-on-video default protected
  • demo_ci
  • 3-upstream-01022023
  • master
  • gh3538-captions
  • 16-adapt-for-images-annot
  • 15-api-for-annotations-on-video
  • 15-annotations-on-videos
  • video_for_annotations
  • wip-1-annotations-on-videos
  • 9-videoviewer-tests
  • 9_wip_videotests
  • 6-fix-tests-and-ci
  • _fix_ci
  • wip-webpack-from-git
16 results

ThumbnailNavigation.js

Blame
  • App.js 2.32 KiB
    import React, { Component } from 'react';
    import { connect } from 'react-redux';
    import PropTypes from 'prop-types';
    import { actions } from '../store';
    import Display from './Display';
    import ManifestForm from './ManifestForm';
    import ManifestListItem from './ManifestListItem';
    import Workspace from './Workspace';
    
    /**
     * This is the top level Mirador component.
     * @prop {Object} manifests
     */
    class App extends Component {
      /**
       * constructor -
       */
      constructor(props) {
        super(props);
        this.state = {
          lastRequested: '',
        };
    
        this.setLastRequested = this.setLastRequested.bind(this);
      }
    
      /**
       * setLastRequested - Sets the state lastRequested
       *
       * @private
       */
      setLastRequested(requested) {
        this.setState({
          lastRequested: requested,
        });
      }
    
      /**
       * computedContent - computes the content to be displayed based on logic
       *
       * @return {type}  description
       * @private
       */
      computedContent() {
        const manifest = this.props.manifests[this.state.lastRequested];
        if (manifest) {
          if (manifest.isFetching) {
            return '☕';
          } else if (manifest.error) {
            return manifest.error.message;
          }
          return JSON.stringify(manifest.json, 0, 2);
        }
        return 'Nothing Selected Yet';
      }
    
      /**
       * render
       * @return {String} - HTML markup for the component
       */
      render() {
        const manifestList = Object.keys(this.props.manifests).map(manifest => (
          <ManifestListItem
            key={manifest}
            manifest={manifest}
          />
        ));
        return (
          <div className="App">
            <ManifestForm setLastRequested={this.setLastRequested} />
            <ul>{manifestList}</ul>
    
            <Display
              manifest={this.props.manifests[this.state.lastRequested]}
            />
            <Workspace />
          </div>
        );
      }
    }
    
    App.propTypes = {
      manifests: PropTypes.instanceOf(Object).isRequired,
    };
    
    /**
     * mapStateToProps - to hook up connect
     * @memberof App
     * @private
     */
    const mapStateToProps = state => (
      {
        manifests: state.manifests,
      }
    );
    
    /**
     * mapDispatchToProps - used to hook up connect to action creators
     * @memberof App
     * @private
     */
    const mapDispatchToProps = dispatch => ({
      fetchManifest: manifestUrl => (
        dispatch(actions.fetchManifest(manifestUrl))
      ),
    });
    
    export default connect(
      mapStateToProps,
      mapDispatchToProps,
    )(App);