2016-05-30 14:54:08 +02:00
var moreMenuStyle = {
2016-05-29 13:04:25 +02:00
position : 'absolute' ,
display : 'block' ,
top : '26px' ,
left : '-13px' ,
} ;
var MyFilesRowMoreMenu = React . createClass ( {
2016-05-30 14:54:08 +02:00
onRevealClicked : function ( ) {
lbry . revealFile ( this . props . path ) ;
} ,
onRemoveClicked : function ( ) {
lbry . deleteFile ( this . props . lbryUri , false ) ;
} ,
2016-05-29 13:04:25 +02:00
onDeleteClicked : function ( ) {
2016-08-07 17:27:00 +02:00
var alertText = 'Are you sure you\'d like to delete "' + this . props . title + '?" This will ' +
( this . completed ? ' stop the download and ' : '' ) +
'permanently remove the file from your system.' ;
2016-05-29 13:04:25 +02:00
if ( confirm ( alertText ) ) {
lbry . deleteFile ( this . props . lbryUri ) ;
}
} ,
render : function ( ) {
return (
2016-05-30 14:54:08 +02:00
< div style = { moreMenuStyle } >
2016-05-29 13:04:25 +02:00
< Menu { ... this . props } >
2016-08-08 05:31:21 +02:00
< section className = "card" >
< MenuItem onClick = { this . onRevealClicked } label = "Reveal file" / > { /* @TODO: Switch to OS specific wording */ }
< MenuItem onClick = { this . onRemoveClicked } label = "Remove from LBRY" / >
< MenuItem onClick = { this . onDeleteClicked } label = "Remove and delete file" / >
< / s e c t i o n >
2016-05-29 13:04:25 +02:00
< / M e n u >
< / d i v >
) ;
}
} ) ;
var moreButtonColumnStyle = {
2016-08-07 17:27:00 +02:00
height : '120px' ,
display : 'flex' ,
alignItems : 'center' ,
justifyContent : 'center' ,
} ,
moreButtonContainerStyle = {
display : 'block' ,
position : 'relative' ,
} ,
moreButtonStyle = {
fontSize : '1.3em' ,
} ,
progressBarStyle = {
height : '15px' ,
width : '230px' ,
backgroundColor : '#444' ,
border : '2px solid #eee' ,
display : 'inline-block' ,
2016-08-27 08:18:19 +02:00
} ,
2016-08-07 17:27:00 +02:00
artStyle = {
maxHeight : '100px' ,
2016-08-26 12:54:30 +02:00
maxWidth : '100%' ,
2016-08-07 17:27:00 +02:00
display : 'block' ,
marginLeft : 'auto' ,
marginRight : 'auto' ,
} ;
2016-05-10 12:36:54 +02:00
var MyFilesRow = React . createClass ( {
2016-05-14 14:26:54 +02:00
onPauseResumeClicked : function ( ) {
if ( this . props . stopped ) {
lbry . startFile ( this . props . lbryUri ) ;
} else {
lbry . stopFile ( this . props . lbryUri ) ;
}
} ,
2016-05-10 12:36:54 +02:00
render : function ( ) {
2016-05-30 14:54:08 +02:00
//@TODO: Convert progress bar to reusable component
var progressBarWidth = 230 ;
2016-05-20 12:42:32 +02:00
2016-05-14 14:26:54 +02:00
if ( this . props . completed ) {
var pauseLink = null ;
var curProgressBarStyle = { display : 'none' } ;
} else {
var pauseLink = < Link icon = { this . props . stopped ? 'icon-play' : 'icon-pause' }
label = { this . props . stopped ? 'Resume download' : 'Pause download' }
onClick = { ( ) => { this . onPauseResumeClicked ( ) } } / > ;
var curProgressBarStyle = Object . assign ( { } , progressBarStyle ) ;
2016-05-20 12:42:32 +02:00
curProgressBarStyle . width = Math . floor ( this . props . ratioLoaded * progressBarWidth ) + 'px' ;
curProgressBarStyle . borderRightWidth = progressBarWidth - Math . ceil ( this . props . ratioLoaded * progressBarWidth ) + 2 ;
2016-05-14 14:26:54 +02:00
}
2016-05-16 10:19:41 +02:00
if ( this . props . showWatchButton ) {
2016-05-20 12:42:32 +02:00
var watchButton = < WatchLink streamName = { this . props . lbryUri } / >
2016-05-16 10:19:41 +02:00
} else {
2016-05-20 12:39:02 +02:00
var watchButton = null ;
2016-05-16 10:19:41 +02:00
}
2016-05-10 12:36:54 +02:00
return (
2016-08-08 05:31:21 +02:00
< section className = "card" >
< div className = "row-fluid" >
< div className = "span3" >
2016-08-26 14:03:08 +02:00
< img src = { this . props . imgUrl || '/img/default-thumb.svg' } alt = { 'Photo for ' + this . props . title } style = { artStyle } / >
2016-08-08 05:31:21 +02:00
< / d i v >
< div className = "span8" >
< h3 > { this . props . pending ? this . props . title : < a href = { '/?show=' + this . props . lbryUri } > { this . props . title } < / a > } < / h 3 >
{ this . props . pending ? < em > This file is pending confirmation < / e m >
: (
< div >
< div className = { this . props . completed ? 'hidden' : '' } style = { curProgressBarStyle } > < / d i v >
{ ' ' }
{ this . props . completed ? 'Download complete' : ( parseInt ( this . props . ratioLoaded * 100 ) + '%' ) }
< div > { pauseLink } < / d i v >
< div > { watchButton } < / d i v >
2016-09-16 18:56:20 +02:00
{ this . props . available ? null : < p > < em > This file is uploading to Reflector . Reflector is a service that hosts a copy of the file on LBRY 's servers so that it' s available even if no one with the file is online . < / e m > < / p > }
2016-08-08 05:31:21 +02:00
< / d i v >
)
}
< / d i v >
< div className = "span1" style = { moreButtonColumnStyle } >
{ this . props . pending ? null :
< div style = { moreButtonContainerStyle } >
< Link style = { moreButtonStyle } ref = "moreButton" icon = "icon-ellipsis-h" title = "More Options" / >
< MyFilesRowMoreMenu toggleButton = { this . refs . moreButton } title = { this . props . title }
lbryUri = { this . props . lbryUri } fileName = { this . props . fileName }
path = { this . props . path } / >
2016-08-07 17:27:00 +02:00
< / d i v >
2016-08-08 05:31:21 +02:00
}
< / d i v >
2016-05-14 14:26:54 +02:00
< / d i v >
2016-08-08 05:31:21 +02:00
< / s e c t i o n >
2016-05-10 12:36:54 +02:00
) ;
}
} ) ;
var MyFilesPage = React . createClass ( {
2016-09-16 18:46:15 +02:00
_fileTimeout : null ,
_fileInfoCheckNum : 0 ,
2016-05-10 12:36:54 +02:00
getInitialState : function ( ) {
return {
filesInfo : null ,
2016-09-16 18:46:15 +02:00
filesAvailable : { } ,
2016-05-10 12:36:54 +02:00
} ;
} ,
2016-08-08 00:13:17 +02:00
componentDidMount : function ( ) {
document . title = "My Files" ;
} ,
2016-05-10 12:36:54 +02:00
componentWillMount : function ( ) {
2016-05-14 14:26:54 +02:00
this . updateFilesInfo ( ) ;
} ,
2016-08-08 02:57:12 +02:00
componentWillUnmount : function ( ) {
2016-09-16 18:46:15 +02:00
if ( this . _fileTimeout )
2016-08-08 02:57:12 +02:00
{
2016-09-16 18:46:15 +02:00
clearTimeout ( this . _fileTimeout ) ;
2016-08-08 02:57:12 +02:00
}
} ,
2016-05-14 14:26:54 +02:00
updateFilesInfo : function ( ) {
2016-05-10 12:36:54 +02:00
lbry . getFilesInfo ( ( filesInfo ) => {
2016-09-16 18:46:15 +02:00
if ( ! filesInfo ) {
filesInfo = [ ] ;
}
if ( ! ( this . _fileInfoCheckNum % 5 ) ) {
// Time to update file availability status
for ( let fileInfo of filesInfo ) {
let name = fileInfo . lbry _uri ;
lbry . search ( name , ( results ) => {
var result = results [ 0 ] ;
if ( result . name != name ) {
// File not listed in Lighthouse
var available = false ;
} else {
var available = result . available ;
}
if ( typeof this . state . filesAvailable [ name ] === 'undefined' || available != this . state . filesAvailable [ name ] ) {
var newFilesAvailable = Object . assign ( { } , this . state . filesAvailable ) ;
newFilesAvailable [ name ] = available ;
this . setState ( {
filesAvailable : newFilesAvailable ,
} ) ;
}
} ) ;
}
}
this . _fileInfoCheckNum += 1 ;
2016-05-10 12:36:54 +02:00
this . setState ( {
2016-09-16 18:46:15 +02:00
filesInfo : filesInfo ,
2016-05-10 12:36:54 +02:00
} ) ;
2016-09-16 18:46:15 +02:00
this . _fileTimeout = setTimeout ( ( ) => { this . updateFilesInfo ( ) } , 1000 ) ;
2016-05-10 12:36:54 +02:00
} ) ;
} ,
render : function ( ) {
2016-05-14 14:26:54 +02:00
if ( this . state . filesInfo === null ) {
2016-08-20 03:48:08 +02:00
return (
< main className = "page" >
2016-08-21 16:55:32 +02:00
< BusyMessage message = "Loading" / >
2016-08-20 03:48:08 +02:00
< / m a i n >
) ;
2016-05-16 10:19:41 +02:00
}
if ( ! this . state . filesInfo . length ) {
var content = < span > You haven ' t downloaded anything from LBRY yet . Go < Link href = "/" label = "search for your first download" / > ! < / s p a n > ;
2016-05-10 12:36:54 +02:00
} else {
2016-08-07 17:27:00 +02:00
var content = [ ] ,
2016-08-07 17:29:08 +02:00
seenUris = { } ;
2016-05-16 10:19:41 +02:00
for ( let fileInfo of this . state . filesInfo ) {
2016-05-30 14:54:08 +02:00
let { completed , written _bytes , total _bytes , lbry _uri , file _name , download _path ,
2016-08-07 17:27:00 +02:00
stopped , metadata } = fileInfo ;
2016-07-26 15:02:28 +02:00
2016-08-07 17:29:08 +02:00
if ( ! metadata || seenUris [ lbry _uri ] )
2016-07-26 15:02:28 +02:00
{
continue ;
}
2016-08-07 17:29:08 +02:00
seenUris [ lbry _uri ] = true ;
2016-06-27 22:38:08 +02:00
let { title , thumbnail } = metadata ;
2016-05-16 10:19:41 +02:00
2016-08-03 12:43:10 +02:00
if ( ! fileInfo . pending && typeof metadata == 'object' ) {
var { title , thumbnail } = metadata ;
var pending = false ;
} else {
var title = null ;
var thumbnail = null ;
var pending = true ;
}
2016-05-16 10:19:41 +02:00
var ratioLoaded = written _bytes / total _bytes ;
2016-09-02 10:50:44 +02:00
var mediaType = lbry . getMediaType ( metadata . content _type , file _name ) ;
var showWatchButton = ( mediaType == 'video' ) ;
2016-05-16 10:19:41 +02:00
2016-08-07 17:29:08 +02:00
content . push ( < MyFilesRow key = { lbry _uri } lbryUri = { lbry _uri } title = { title || ( 'lbry://' + lbry _uri ) } completed = { completed } stopped = { stopped }
2016-05-30 14:54:08 +02:00
ratioLoaded = { ratioLoaded } imgUrl = { thumbnail } path = { download _path }
2016-09-16 18:46:15 +02:00
showWatchButton = { showWatchButton } pending = { pending }
available = { this . state . filesAvailable [ lbry _uri ] } / > ) ;
2016-05-10 12:36:54 +02:00
}
}
2016-05-16 10:19:41 +02:00
return (
2016-05-23 14:16:14 +02:00
< main className = "page" >
2016-08-08 05:31:21 +02:00
{ content }
2016-05-16 10:19:41 +02:00
< / m a i n >
) ;
2016-05-10 12:36:54 +02:00
}
2016-06-27 22:38:08 +02:00
} ) ;