var _ = require('underscore'); var React = require('react/addons'); var Router = require('react-router'); var RetinaImage = require('react-retina-image'); var ImageCard = require('./ImageCard.react'); var Promise = require('bluebird'); var metrics = require('../utils/MetricsUtil'); var classNames = require('classnames'); var repositoryActions = require('../actions/RepositoryActions'); var repositoryStore = require('../stores/RepositoryStore'); var accountStore = require('../stores/AccountStore'); var accountActions = require('../actions/AccountActions'); var _searchPromise = null; module.exports = React.createClass({ mixins: [Router.Navigation, Router.State], getInitialState: function () { return { query: '', loading: repositoryStore.loading(), repos: repositoryStore.all(), username: accountStore.getState().username, verified: accountStore.getState().verified, accountLoading: accountStore.getState().loading, error: repositoryStore.getState().error }; }, componentDidMount: function () { this.refs.searchInput.getDOMNode().focus(); repositoryStore.listen(this.update); accountStore.listen(this.updateAccount); repositoryActions.search(); }, componentWillUnmount: function () { if (_searchPromise) { _searchPromise.cancel(); } repositoryStore.unlisten(this.update); accountStore.unlisten(this.updateAccount); }, update: function () { this.setState({ loading: repositoryStore.loading(), repos: repositoryStore.all() }); }, updateAccount: function () { this.setState({ username: accountStore.getState().username, verified: accountStore.getState().verified, accountLoading: accountStore.getState().loading }); }, search: function (query) { if (_searchPromise) { _searchPromise.cancel(); _searchPromise = null; } this.setState({ query: query, loading: true }); _searchPromise = Promise.delay(200).cancellable().then(() => { metrics.track('Searched for Images'); _searchPromise = null; repositoryActions.search(query); }).catch(Promise.CancellationError, () => {}); }, handleChange: function (e) { var query = e.target.value; if (query === this.state.query) { return; } this.search(query); }, handleFilter: function (filter) { // If we're clicking on the filter again - refresh if (filter === 'userrepos' && this.getQuery().filter === 'userrepos') { repositoryActions.repos(); } if (filter === 'recommended' && this.getQuery().filter === 'recommended') { repositoryActions.recommended(); } this.transitionTo('search', {}, {filter: filter}); metrics.track('Filtered Results', { filter: filter }); }, handleCheckVerification: function () { accountActions.verify(); metrics.track('Verified Account', { from: 'search' }); }, render: function () { let filter = this.getQuery().filter || 'all'; let repos = _.values(this.state.repos) .filter(repo => repo.name.toLowerCase().indexOf(this.state.query.toLowerCase()) !== -1 || repo.namespace.toLowerCase().indexOf(this.state.query.toLowerCase()) !== -1) .filter(repo => filter === 'all' || (filter === 'recommended' && repo.is_recommended) || (filter === 'userrepos' && repo.is_user_repo)); let results; if (this.state.error) { results = (

There was an error contacting Docker Hub.

); } else if (filter === 'userrepos' && !accountStore.getState().username) { results = (

Log In or Sign Up to access your Docker Hub repositories.

); } else if (filter === 'userrepos' && !accountStore.getState().verified) { let spinner = this.state.accountLoading ?
: null; results = (

Please verify your Docker Hub account email address

{spinner}
); } else if (this.state.loading) { results = (

Loading Images

); } else if (repos.length) { let recommendedItems = repos.filter(repo => repo.is_recommended).map(image => ); let otherItems = repos.filter(repo => !repo.is_recommended && !repo.is_user_repo).map(image => ); let recommendedResults = recommendedItems.length ? (

Recommended

{recommendedItems}
) : null; let userRepoItems = repos.filter(repo => repo.is_user_repo).map(image => ); let userRepoResults = userRepoItems.length ? (

My Repositories

{userRepoItems}
) : null; let otherResults = otherItems.length ? (

Other Repositories

{otherItems}
) : null; results = (
{recommendedResults} {userRepoResults} {otherResults}
); } else { if (this.state.query.length) { results = (

Cannot find a matching image.

); } else { results = (

No Images

); } } let loadingClasses = classNames({ hidden: !this.state.loading, spinner: true, loading: true, 'la-ball-clip-rotate': true, 'la-dark': true, 'la-sm': true }); let magnifierClasses = classNames({ hidden: this.state.loading, icon: true, 'icon-magnifier': true, 'search-icon': true }); return (
Select a Docker image to create a container.
FILTER BY All Recommended My Repositories
{results}
); } });