import React from 'react'; import lbry from '../lbry.js'; import {Link} from '../component/link.js'; import {Icon} from '../component/common.js'; import Modal from './modal.js'; import FormField from './form.js'; import {ToolTip} from '../component/tooltip.js'; import {DropDownMenu, DropDownMenuItem} from './menu.js'; const {shell} = require('electron'); let WatchLink = React.createClass({ propTypes: { streamName: React.PropTypes.string, downloadStarted: React.PropTypes.bool, }, startVideo: function() { window.location = '?watch=' + this.props.streamName; }, handleClick: function() { this.setState({ loading: true, }); if (this.props.downloadStarted) { this.startVideo(); } else { lbry.getCostInfoForName(this.props.streamName, ({cost}) => { lbry.getBalance((balance) => { if (cost > balance) { this.setState({ modal: 'notEnoughCredits', loading: false, }); } else { this.startVideo(); } }); }); } }, getInitialState: function() { return { modal: null, loading: false, }; }, closeModal: function() { this.setState({ modal: null, }); }, render: function() { return (
You don't have enough LBRY credits to pay for this stream.
); } }); let FileActionsRow = React.createClass({ _isMounted: false, _fileInfoSubscribeId: null, propTypes: { streamName: React.PropTypes.string, outpoint: React.PropTypes.string.isRequired, metadata: React.PropTypes.oneOfType([React.PropTypes.object, React.PropTypes.string]), contentType: React.PropTypes.string, }, getInitialState: function() { return { fileInfo: null, modal: null, menuOpen: false, deleteChecked: false, attemptingDownload: false, attemptingRemove: false } }, onFileInfoUpdate: function(fileInfo) { if (this._isMounted) { this.setState({ fileInfo: fileInfo ? fileInfo : false, attemptingDownload: fileInfo ? false : this.state.attemptingDownload }); } }, tryDownload: function() { this.setState({ attemptingDownload: true, attemptingRemove: false }); lbry.getCostInfoForName(this.props.streamName, ({cost}) => { lbry.getBalance((balance) => { if (cost > balance) { this.setState({ modal: 'notEnoughCredits', attemptingDownload: false, }); } else { lbry.getStream(this.props.streamName, (streamInfo) => { if (streamInfo === null || typeof streamInfo !== 'object') { this.setState({ modal: 'timedOut', attemptingDownload: false, }); } }); } }); }); }, closeModal: function() { this.setState({ modal: null, }) }, onDownloadClick: function() { if (!this.state.fileInfo && !this.state.attemptingDownload) { this.tryDownload(); } }, onOpenClick: function() { if (this.state.fileInfo && this.state.fileInfo.download_path) { shell.openItem(this.state.fileInfo.download_path); } }, handleDeleteCheckboxClicked: function(event) { this.setState({ deleteChecked: event.target.checked, }); }, handleRevealClicked: function() { if (this.state.fileInfo && this.state.fileInfo.download_path) { shell.showItemInFolder(this.state.fileInfo.download_path); } }, handleRemoveClicked: function() { this.setState({ modal: 'confirmRemove', }); }, handleRemoveConfirmed: function() { lbry.removeFile(this.props.outpoint, this.state.deleteChecked); this.setState({ modal: null, fileInfo: false, attemptingDownload: false }); }, openMenu: function() { this.setState({ menuOpen: !this.state.menuOpen, }); }, componentDidMount: function() { this._isMounted = true; this._fileInfoSubscribeId = lbry.fileInfoSubscribe(this.props.outpoint, this.onFileInfoUpdate); }, componentWillUnmount: function() { this._isMounted = false; if (this._fileInfoSubscribeId) { lbry.fileInfoUnsubscribe(this.props.outpoint, this._fileInfoSubscribeId); } }, render: function() { if (this.state.fileInfo === null) { return null; } const openInFolderMessage = window.navigator.platform.startsWith('Mac') ? 'Open in Finder' : 'Open in Folder', showMenu = !!this.state.fileInfo; let linkBlock; if (this.state.fileInfo === false && !this.state.attemptingDownload) { linkBlock = ; } else if (this.state.attemptingDownload || (!this.state.fileInfo.completed && !this.state.fileInfo.isMine)) { const progress = this.state.fileInfo ? this.state.fileInfo.written_bytes / this.state.fileInfo.total_bytes * 100 : 0, label = this.state.fileInfo ? progress.toFixed(0) + '% complete' : 'Connecting...', labelWithIcon = {label}; linkBlock = (
{labelWithIcon}
{labelWithIcon}
); } else { linkBlock = ; } return (
{this.props.contentType && this.props.contentType.startsWith('video/') ? : null} {this.state.fileInfo !== null || this.state.fileInfo.isMine ? linkBlock : null} { showMenu ? : '' } You don't have enough LBRY credits to pay for this stream. LBRY was unable to download the stream lbry://{this.props.streamName}.

Are you sure you'd like to remove {this.props.metadata.title} from LBRY?

); } }); export let FileActions = React.createClass({ _isMounted: false, _fileInfoSubscribeId: null, propTypes: { streamName: React.PropTypes.string, outpoint: React.PropTypes.string.isRequired, metadata: React.PropTypes.oneOfType([React.PropTypes.object, React.PropTypes.string]), contentType: React.PropTypes.string, }, getInitialState: function() { return { available: true, forceShowActions: false, fileInfo: null, } }, onShowFileActionsRowClicked: function() { this.setState({ forceShowActions: true, }); }, onFileInfoUpdate: function(fileInfo) { if (this.isMounted) { this.setState({ fileInfo: fileInfo, }); } }, componentDidMount: function() { this._isMounted = true; this._fileInfoSubscribeId = lbry.fileInfoSubscribe(this.props.outpoint, this.onFileInfoUpdate); lbry.getStreamAvailability(this.props.streamName, (availability) => { if (this._isMounted) { this.setState({ available: availability > 0, }); } }, () => { // Take any error to mean the file is unavailable if (this._isMounted) { this.setState({ available: false, }); } }); }, componentWillUnmount: function() { this._isMounted = false; if (this._fileInfoSubscribeId) { lbry.fileInfoUnsubscribe(this.props.outpoint, this._fileInfoSubscribeId); } }, render: function() { const fileInfo = this.state.fileInfo; if (fileInfo === null) { return null; } return (
{ fileInfo || this.state.available || this.state.forceShowActions ? :
This file is not currently available.
}
); } });