2017-01-13 03:03:34 +01:00
|
|
|
import React from 'react';
|
2017-04-29 11:50:29 +02:00
|
|
|
import lbry from 'lbry';
|
|
|
|
import lbryuri from 'lbryuri';
|
2017-04-29 19:02:25 +02:00
|
|
|
import {Icon,} from 'component/common';
|
|
|
|
import FilePrice from 'component/filePrice'
|
2017-04-29 11:50:29 +02:00
|
|
|
import {Modal} from 'component/modal';
|
|
|
|
import {FormField} from 'component/form';
|
2017-04-07 07:15:22 +02:00
|
|
|
import Link from 'component/link';
|
2017-04-29 11:50:29 +02:00
|
|
|
import {ToolTip} from 'component/tooltip';
|
|
|
|
import {DropDownMenu, DropDownMenuItem} from 'component/menu';
|
2017-01-13 03:03:34 +01:00
|
|
|
|
2017-04-29 19:02:25 +02:00
|
|
|
class FileActionsRow extends React.Component {
|
|
|
|
constructor(props) {
|
|
|
|
super(props)
|
|
|
|
this.state = {
|
2017-01-13 03:03:34 +01:00
|
|
|
deleteChecked: false,
|
|
|
|
}
|
2017-04-29 19:02:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
handleDeleteCheckboxClicked(event) {
|
2017-01-13 03:03:34 +01:00
|
|
|
this.setState({
|
|
|
|
deleteChecked: event.target.checked,
|
2017-04-29 19:02:25 +02:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2017-05-01 06:51:19 +02:00
|
|
|
onAffirmPurchase() {
|
|
|
|
this.props.closeModal()
|
|
|
|
this.props.loadVideo()
|
|
|
|
}
|
|
|
|
|
2017-04-29 19:02:25 +02:00
|
|
|
render() {
|
|
|
|
const {
|
|
|
|
fileInfo,
|
|
|
|
platform,
|
|
|
|
downloading,
|
|
|
|
loading,
|
|
|
|
uri,
|
|
|
|
deleteFile,
|
|
|
|
openInFolder,
|
|
|
|
openInShell,
|
|
|
|
modal,
|
|
|
|
openModal,
|
|
|
|
affirmPurchase,
|
|
|
|
closeModal,
|
|
|
|
downloadClick,
|
|
|
|
} = this.props
|
|
|
|
|
|
|
|
const {
|
|
|
|
deleteChecked,
|
|
|
|
} = this.state
|
|
|
|
|
|
|
|
const metadata = fileInfo ? fileInfo.metadata : null
|
|
|
|
|
|
|
|
if (!fileInfo)
|
2017-01-13 03:03:34 +01:00
|
|
|
{
|
2017-01-21 22:31:41 +01:00
|
|
|
return null;
|
2017-01-21 07:52:32 +01:00
|
|
|
}
|
|
|
|
|
2017-04-29 19:02:25 +02:00
|
|
|
const openInFolderMessage = platform.startsWith('Mac') ? 'Open in Finder' : 'Open in Folder',
|
|
|
|
showMenu = Object.keys(fileInfo).length != 0;
|
2017-01-13 23:18:37 +01:00
|
|
|
|
2017-01-13 03:03:34 +01:00
|
|
|
let linkBlock;
|
2017-04-29 19:02:25 +02:00
|
|
|
if (Object.keys(fileInfo).length == 0 && !downloading && !loading) {
|
|
|
|
linkBlock = <Link button="text" label="Download" icon="icon-download" onClick={downloadClick} />;
|
|
|
|
} else if (downloading || loading) {
|
2017-01-13 03:03:34 +01:00
|
|
|
const
|
2017-04-29 19:02:25 +02:00
|
|
|
progress = (fileInfo && fileInfo.written_bytes) ? fileInfo.written_bytes / fileInfo.total_bytes * 100 : 0,
|
|
|
|
label = fileInfo ? progress.toFixed(0) + '% complete' : 'Connecting...',
|
2017-01-24 05:06:29 +01:00
|
|
|
labelWithIcon = <span className="button__content"><Icon icon="icon-download" /><span>{label}</span></span>;
|
2017-01-13 03:03:34 +01:00
|
|
|
|
2017-01-21 07:52:32 +01:00
|
|
|
linkBlock = (
|
2017-02-21 07:26:59 +01:00
|
|
|
<div className="faux-button-block file-actions__download-status-bar button-set-item">
|
2017-01-13 03:03:34 +01:00
|
|
|
<div className="faux-button-block file-actions__download-status-bar-overlay" style={{ width: progress + '%' }}>{labelWithIcon}</div>
|
|
|
|
{labelWithIcon}
|
2017-01-21 07:52:32 +01:00
|
|
|
</div>
|
|
|
|
);
|
2017-01-13 03:03:34 +01:00
|
|
|
} else {
|
2017-04-29 19:02:25 +02:00
|
|
|
linkBlock = <Link label="Open" button="text" icon="icon-folder-open" onClick={() => openInShell(fileInfo)} />;
|
2017-01-13 03:03:34 +01:00
|
|
|
}
|
|
|
|
|
2017-04-29 19:02:25 +02:00
|
|
|
const title = metadata ? metadata.title : uri;
|
2017-01-13 03:03:34 +01:00
|
|
|
return (
|
2017-01-21 22:31:41 +01:00
|
|
|
<div>
|
2017-04-29 19:02:25 +02:00
|
|
|
{fileInfo !== null || fileInfo.isMine
|
2017-02-21 07:26:59 +01:00
|
|
|
? linkBlock
|
2017-01-13 03:03:34 +01:00
|
|
|
: null}
|
|
|
|
{ showMenu ?
|
|
|
|
<DropDownMenu>
|
2017-04-29 19:02:25 +02:00
|
|
|
<DropDownMenuItem key={0} onClick={() => openInFolder(fileInfo)} label={openInFolderMessage} />
|
|
|
|
<DropDownMenuItem key={1} onClick={() => openModal('confirmRemove')} label="Remove..." />
|
2017-01-13 03:03:34 +01:00
|
|
|
</DropDownMenu> : '' }
|
2017-04-29 19:02:25 +02:00
|
|
|
<Modal type="confirm" isOpen={modal == 'affirmPurchase'}
|
2017-05-01 06:51:19 +02:00
|
|
|
contentLabel="Confirm Purchase" onConfirmed={this.onAffirmPurchase.bind(this)} onAborted={closeModal}>
|
2017-04-29 19:02:25 +02:00
|
|
|
Are you sure you'd like to buy <strong>{title}</strong> for <strong><FilePrice uri={uri} look="plain" /></strong> credits?
|
2017-04-13 20:52:26 +02:00
|
|
|
</Modal>
|
2017-04-29 19:02:25 +02:00
|
|
|
<Modal isOpen={modal == 'notEnoughCredits'} contentLabel="Not enough credits"
|
|
|
|
onConfirmed={closeModal}>
|
2017-01-13 03:03:34 +01:00
|
|
|
You don't have enough LBRY credits to pay for this stream.
|
|
|
|
</Modal>
|
2017-04-29 19:02:25 +02:00
|
|
|
<Modal isOpen={modal == 'timedOut'} contentLabel="Download failed"
|
|
|
|
onConfirmed={closeModal}>
|
2017-04-18 21:14:42 +02:00
|
|
|
LBRY was unable to download the stream <strong>{uri}</strong>.
|
2017-01-13 03:03:34 +01:00
|
|
|
</Modal>
|
2017-04-29 19:02:25 +02:00
|
|
|
<Modal isOpen={modal == 'confirmRemove'}
|
|
|
|
contentLabel="Not enough credits"
|
|
|
|
type="confirm"
|
|
|
|
confirmButtonLabel="Remove"
|
|
|
|
onConfirmed={() => deleteFile(uri, fileInfo, deleteChecked)}
|
|
|
|
onAborted={closeModal}>
|
2017-04-17 11:18:41 +02:00
|
|
|
<p>Are you sure you'd like to remove <cite>{title}</cite> from LBRY?</p>
|
2017-01-13 03:03:34 +01:00
|
|
|
|
2017-04-29 19:02:25 +02:00
|
|
|
<label><FormField type="checkbox" checked={deleteChecked} onClick={this.handleDeleteCheckboxClicked.bind(this)} /> Delete this file from my computer</label>
|
2017-01-13 03:03:34 +01:00
|
|
|
</Modal>
|
2017-01-21 22:31:41 +01:00
|
|
|
</div>
|
2017-01-13 03:03:34 +01:00
|
|
|
);
|
|
|
|
}
|
2017-04-29 19:02:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
class FileActions extends React.Component {
|
|
|
|
constructor(props) {
|
|
|
|
super(props)
|
|
|
|
this._isMounted = false
|
|
|
|
this._fileInfoSubscribeId = null
|
|
|
|
this.state = {
|
2017-01-21 22:31:41 +01:00
|
|
|
available: true,
|
|
|
|
forceShowActions: false,
|
2017-01-30 09:21:43 +01:00
|
|
|
fileInfo: null,
|
2017-01-21 22:31:41 +01:00
|
|
|
}
|
2017-04-29 19:02:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
onShowFileActionsRowClicked() {
|
2017-01-21 22:31:41 +01:00
|
|
|
this.setState({
|
|
|
|
forceShowActions: true,
|
|
|
|
});
|
2017-04-29 19:02:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
render() {
|
|
|
|
const {
|
|
|
|
fileInfo,
|
|
|
|
availability,
|
|
|
|
} = this.props
|
2017-04-13 20:52:26 +02:00
|
|
|
|
2017-01-30 09:21:43 +01:00
|
|
|
if (fileInfo === null) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2017-01-21 22:31:41 +01:00
|
|
|
return (<section className="file-actions">
|
|
|
|
{
|
2017-01-30 09:21:43 +01:00
|
|
|
fileInfo || this.state.available || this.state.forceShowActions
|
2017-04-29 19:02:25 +02:00
|
|
|
? <FileActionsRow {...this.props} />
|
2017-01-30 09:21:43 +01:00
|
|
|
: <div>
|
2017-04-10 20:12:07 +02:00
|
|
|
<div className="button-set-item empty">Content unavailable.</div>
|
2017-02-21 07:26:59 +01:00
|
|
|
<ToolTip label="Why?"
|
|
|
|
body="The content on LBRY is hosted by its users. It appears there are no users connected that have this file at the moment."
|
|
|
|
className="button-set-item" />
|
2017-04-29 19:02:25 +02:00
|
|
|
<Link label="Try Anyway" onClick={this.onShowFileActionsRowClicked.bind(this)} className="button-text button-set-item" />
|
2017-01-30 09:21:43 +01:00
|
|
|
</div>
|
2017-01-21 22:31:41 +01:00
|
|
|
}
|
|
|
|
</section>);
|
|
|
|
}
|
2017-04-29 19:02:25 +02:00
|
|
|
}
|
2017-04-29 11:50:29 +02:00
|
|
|
|
|
|
|
export default FileActions
|