var searchInputStyle = { width: '400px', display: 'block', marginBottom: '48px', marginLeft: 'auto', marginRight: 'auto' }, fetchResultsStyle = { color: '#888', textAlign: 'center', fontSize: '1.2em' }; var SearchActive = React.createClass({ render: function() { return (
Looking up the Dewey Decimals
); } }); var searchNoResultsStyle = { textAlign: 'center' }, searchNoResultsMessageStyle = { fontStyle: 'italic', marginRight: '5px' }; var SearchNoResults = React.createClass({ render: function() { return (
No one has checked anything in for {this.props.query} yet.
); } }); var SearchResults = React.createClass({ render: function() { var rows = []; this.props.results.forEach(function(result) { rows.push( ); }); return (
{rows}
); } }); var searchRowImgStyle = { maxWidth: '100%', maxHeight: '250px', display: 'block', marginLeft: 'auto', marginRight: 'auto', float: 'left' }, searchRowTitleStyle = { fontWeight: 'bold' }, searchRowCostStyle = { float: 'right', marginLeft: '20px', marginTop: '5px', display: 'inline-block' }, searchRowNameStyle = { fontSize: '0.9em', color: '#666', marginBottom: '24px', clear: 'both' }, searchRowDescriptionStyle = { color : '#444', marginBottom: '24px', fontSize: '0.9em' }; var SearchResultRow = React.createClass({ getInitialState: function() { return { downloading: false } }, render: function() { return (
{'Photo

{this.props.title}

lbry://{this.props.name}

{this.props.description}

); } }); var featuredContentItemStyle = { fontSize: '0.95em', marginTop: '10px', maxHeight: '220px' }, featuredContentItemImgStyle = { maxWidth: '100%', maxHeight: '100%', display: 'block', marginLeft: 'auto', marginRight: 'auto', marginTop: '5px', }, featuredContentHeaderStyle = { fontWeight: 'bold', marginBottom: '5px' }, featuredContentSubheaderStyle = { marginBottom: '10px', fontSize: '0.9em' }, featuredContentItemDescriptionStyle = { color: '#444', marginBottom: '5px', fontSize: '0.9em', }, featuredContentItemCostStyle = { float: 'right' }; var FeaturedContentItem = React.createClass({ _maxDescriptionLength: 250, propTypes: { name: React.PropTypes.string, }, getInitialState: function() { return { metadata: null, title: null, amount: 0.0, }; }, componentWillMount: function() { lbry.resolveName(this.props.name, (metadata) => { this.setState({ metadata: metadata, title: metadata.title || ('lbry://' + this.props.name), }) }); lbry.getCostEstimate(this.props.name, (amount) => { this.setState({ amount: amount, }); }); }, render: function() { if (this.state.metadata == null) { // Still waiting for metadata return null; } var metadata = this.state.metadata; if ('narrow' in this.props) { // Workaround -- narrow thumbnails look a bit funky without some extra left margin. // Find a way to do this in CSS. var thumbStyle = Object.assign({}, featuredContentItemImgStyle, { position: 'relative', maxHeight: '102px', left: '13px', }); } else { var thumbStyle = featuredContentItemImgStyle; } return (
{'Photo

{this.state.title}

   

{metadata.description.slice(0, this._maxDescriptionLength) + (metadata.description.length > this._maxDescriptionLength ? ' ...' : '')}

); } }); var featuredContentStyle = { width: '100%', marginTop: '-8px', }, featuredContentLegendStyle = { fontSize: '12px', color: '#aaa', verticalAlign: '15%', }; var FeaturedContent = React.createClass({ render: function() { return (

Featured Content

Community Content

); } }); var discoverMainStyle = { color: '#333' }; var Discover = React.createClass({ userTypingTimer: null, getInitialState: function() { return { results: [], searching: false, query: '' }; }, search: function() { if (this.state.query) { console.log('search'); lbry.search(this.state.query, this.searchCallback.bind(this, this.state.query)); } else { this.setState({ searching: false, results: [] }); } }, searchCallback: function(originalQuery, results) { if (this.state.searching) //could have canceled while results were pending, in which case nothing to do { this.setState({ results: results, searching: this.state.query != originalQuery, //multiple searches can be out, we're only done if we receive one we actually care about }); } }, onQueryChange: function(event) { if (this.userTypingTimer) { clearTimeout(this.userTypingTimer); } //@TODO: Switch to React.js timing this.userTypingTimer = setTimeout(this.search, 800); // 800ms delay, tweak for faster/slower this.setState({ searching: event.target.value.length > 0, query: event.target.value }); }, render: function() { console.log(this.state); return (
{ this.state.searching ? : null } { !this.state.searching && this.state.query && this.state.results.length ? : null } { !this.state.searching && this.state.query && !this.state.results.length ? : null } { !this.state.query && !this.state.searching ? : null }
); } }); var logoStyle = { padding: '48px 12px', textAlign: 'center', maxHeight: '80px', }, imgStyle = { //@TODO: remove this, img should be properly scaled once size is settled height: '80px' }; var Header = React.createClass({ render: function() { return (
); } }); var topBarStyle = { 'float': 'right', 'position': 'relative', 'height': '26px', }, balanceStyle = { 'marginRight': '5px', 'position': 'relative', 'top': '1px', }; var mainMenuStyle = { position: 'absolute', top: '26px', right: '0px', }; var MainMenu = React.createClass({ render: function() { var isLinux = /linux/i.test(navigator.userAgent); // @TODO: find a way to use getVersionInfo() here without messy state management // @TODO: Need a wallet icon return (
{isLinux ? : null}
); } }); var TopBar = React.createClass({ getInitialState: function() { return { balance: 0, }; }, componentDidMount: function() { lbry.getBalance(function(balance) { this.setState({ balance: balance }); }.bind(this)); }, onClose: function() { window.location.href = "?start"; }, render: function() { return ( ); } }); var HomePage = React.createClass({ componentDidMount: function() { lbry.getStartNotice(function(notice) { if (notice) { alert(notice); } }); }, render: function() { return (
); } });