2016-11-22 14:19:08 -06:00
import React from 'react' ;
import lbry from '../lbry.js' ;
import lighthouse from '../lighthouse.js' ;
2017-01-13 12:13:46 -05:00
import { FileTile } from '../component/file-tile.js' ;
2017-01-12 21:03:34 -05:00
import { Link , ToolTipLink } from '../component/link.js' ;
import { BusyMessage } from '../component/common.js' ;
2016-11-22 14:19:08 -06:00
2016-08-08 00:47:48 -04:00
var fetchResultsStyle = {
2016-04-09 20:00:56 -04:00
color : '#888' ,
textAlign : 'center' ,
fontSize : '1.2em'
} ;
var SearchActive = React . createClass ( {
render : function ( ) {
return (
2016-08-07 22:48:45 -04:00
< div style = { fetchResultsStyle } >
2016-08-21 10:55:32 -04:00
< BusyMessage message = "Looking up the Dewey Decimals" / >
2016-08-07 22:48:45 -04:00
< / d i v >
2016-04-09 20:00:56 -04:00
) ;
}
} ) ;
var searchNoResultsStyle = {
textAlign : 'center'
} , searchNoResultsMessageStyle = {
fontStyle : 'italic' ,
marginRight : '5px'
} ;
var SearchNoResults = React . createClass ( {
render : function ( ) {
return (
< section style = { searchNoResultsStyle } >
< span style = { searchNoResultsMessageStyle } > No one has checked anything in for { this . props . query } yet . < / s p a n >
2016-08-03 05:55:53 -04:00
< Link label = "Be the first" href = "?publish" / >
2016-04-09 20:00:56 -04:00
< / s e c t i o n >
) ;
}
} ) ;
var SearchResults = React . createClass ( {
render : function ( ) {
2017-01-12 23:12:53 -05:00
var rows = [ ] ,
seenNames = { } ; //fix this when the search API returns claim IDs
2017-01-10 01:59:32 -05:00
this . props . results . forEach ( function ( { name , value } ) {
2017-01-12 23:12:53 -05:00
if ( ! seenNames [ name ] ) {
seenNames [ name ] = name ;
rows . push (
< FileTile key = { name } name = { name } / >
) ;
}
2016-04-09 20:00:56 -04:00
} ) ;
return (
2016-08-07 22:48:45 -04:00
< div > { rows } < / d i v >
2016-04-09 20:00:56 -04:00
) ;
}
} ) ;
2016-08-07 22:48:45 -04:00
var featuredContentLegendStyle = {
2016-07-26 08:02:55 -04:00
fontSize : '12px' ,
color : '#aaa' ,
verticalAlign : '15%' ,
2016-05-16 09:20:32 -04:00
} ;
var FeaturedContent = React . createClass ( {
render : function ( ) {
2016-08-07 22:48:45 -04:00
return (
2016-07-26 08:02:55 -04:00
< div className = "row-fluid" >
< div className = "span6" >
< h3 > Featured Content < / h 3 >
2017-01-12 21:03:34 -05:00
< FileTile name = "bellflower" / >
< FileTile name = "itsadisaster" / >
< FileTile name = "dopeman" / >
< FileTile name = "smlawncare" / >
< FileTile name = "cinemasix" / >
2016-08-26 08:07:46 -04:00
2016-07-26 08:02:55 -04:00
< / d i v >
< div className = "span6" >
2016-08-07 16:36:57 -04:00
< h3 > Community Content < ToolTipLink style = { featuredContentLegendStyle } label = "What's this?"
2016-08-26 08:07:46 -04:00
tooltip = 'Community Content is a public space where anyone can share content with the rest of the LBRY community. Bid on the names "one," "two," "three," "four" and "five" to put your content here!' / > < / h 3 >
2017-01-12 21:03:34 -05:00
< FileTile name = "one" / >
< FileTile name = "two" / >
< FileTile name = "three" / >
< FileTile name = "four" / >
< FileTile name = "five" / >
2016-07-26 08:02:55 -04:00
< / d i v >
2016-05-16 09:20:32 -04:00
< / d i v >
2016-08-07 22:48:45 -04:00
) ;
2016-05-16 09:20:32 -04:00
}
} ) ;
2016-04-09 20:00:56 -04:00
2016-08-07 20:57:12 -04:00
var DiscoverPage = React . createClass ( {
2016-04-09 20:00:56 -04:00
userTypingTimer : null ,
2016-08-07 22:48:45 -04:00
componentDidUpdate : function ( ) {
2016-08-09 10:58:28 -04:00
if ( this . props . query != this . state . query )
2016-08-07 22:48:45 -04:00
{
2016-12-30 07:42:47 -05:00
this . handleSearchChanged ( this . props . query ) ;
}
} ,
componentWillReceiveProps : function ( nextProps , nextState ) {
if ( nextProps . query != nextState . query )
{
this . handleSearchChanged ( nextProps . query ) ;
2016-08-07 22:48:45 -04:00
}
} ,
2016-12-30 07:42:47 -05:00
handleSearchChanged : function ( query ) {
2016-08-22 09:14:56 -04:00
this . setState ( {
searching : true ,
2016-12-30 07:42:47 -05:00
query : query ,
2016-08-22 09:14:56 -04:00
} ) ;
2016-12-30 07:42:47 -05:00
lighthouse . search ( query , this . searchCallback ) ;
2016-08-22 09:14:56 -04:00
} ,
2016-12-30 07:42:47 -05:00
componentWillMount : function ( ) {
2016-08-07 20:57:12 -04:00
document . title = "Discover" ;
2016-09-29 03:43:18 -04:00
if ( this . props . query ) {
2016-08-22 09:14:56 -04:00
// Rendering with a query already typed
2017-01-04 11:51:58 -05:00
this . handleSearchChanged ( this . props . query ) ;
2016-08-22 09:14:56 -04:00
}
2016-08-07 20:57:12 -04:00
} ,
2016-04-09 20:00:56 -04:00
getInitialState : function ( ) {
return {
results : [ ] ,
2016-08-08 00:47:48 -04:00
query : this . props . query ,
2016-12-30 07:42:47 -05:00
searching : ( 'query' in this . props ) && ( this . props . query . length > 0 )
2016-04-09 20:00:56 -04:00
} ;
} ,
2016-08-08 00:47:48 -04:00
searchCallback : function ( results ) {
2016-04-09 20:00:56 -04:00
if ( this . state . searching ) //could have canceled while results were pending, in which case nothing to do
{
this . setState ( {
results : results ,
2016-08-08 00:47:48 -04:00
searching : false //multiple searches can be out, we're only done if we receive one we actually care about
2016-04-09 20:00:56 -04:00
} ) ;
}
} ,
render : function ( ) {
return (
2016-08-07 20:57:12 -04:00
< main >
2016-04-09 20:00:56 -04:00
{ this . state . searching ? < SearchActive / > : null }
2016-08-07 22:48:45 -04:00
{ ! this . state . searching && this . props . query && this . state . results . length ? < SearchResults results = { this . state . results } / > : null }
{ ! this . state . searching && this . props . query && ! this . state . results . length ? < SearchNoResults query = { this . props . query } / > : null }
{ ! this . props . query && ! this . state . searching ? < FeaturedContent / > : null }
2016-04-09 20:00:56 -04:00
< / m a i n >
) ;
}
2016-08-21 15:59:32 -05:00
} ) ;
2016-11-22 14:19:08 -06:00
export default DiscoverPage ;