import React from 'react'; import lbry from '../lbry.js'; import FormField from './form.js'; import Modal from './modal.js'; import {Menu, MenuItem} from './menu.js'; import {Icon, ToolTip} from './common.js'; export let Link = React.createClass({ propTypes: { label: React.PropTypes.string, icon: React.PropTypes.string, button: React.PropTypes.string, badge: React.PropTypes.string, hidden: React.PropTypes.bool, }, getDefaultProps: function() { return { hidden: false, disabled: false, }; }, handleClick: function() { if (this.props.onClick) { this.props.onClick(); } }, render: function() { if (this.props.hidden) { return null; } const className = (this.props.className || '') + (this.props.button ? ' button-block button-' + this.props.button : '') + (!this.props.className && !this.props.button ? 'button-text' : '') + (this.props.disabled ? ' disabled' : ''); let content; if (this.props.children) { // Custom content content = this.props.children; } else { content = ( {'icon' in this.props ? : null} {this.props.label} {'badge' in this.props ? {this.props.badge} : null} ); } return ( {content} ); } }); var linkContainerStyle = { position: 'relative', }; export let ToolTipLink = React.createClass({ getInitialState: function() { return { showTooltip: false, }; }, handleClick: function() { if (this.props.tooltip) { this.setState({ showTooltip: !this.state.showTooltip, }); } if (this.props.onClick) { this.props.onClick(); } }, handleTooltipMouseOut: function() { this.setState({ showTooltip: false, }); }, render: function() { var href = this.props.href ? this.props.href : 'javascript:;', icon = this.props.icon ? : '', className = this.props.className + (this.props.button ? ' button-block button-' + this.props.button : '') + (this.props.hidden ? ' hidden' : '') + (this.props.disabled ? ' disabled' : ''); return ( {this.props.icon ? icon : '' } {this.props.label} {(!this.props.tooltip ? null : {this.props.tooltip} )} ); } }); export let DropDown = React.createClass({ propTypes: { onCaretClick: React.PropTypes.func, }, handleCaretClicked: function(event) { /** * The menu handles caret clicks via a window event listener, so we just need to prevent clicks * on the caret from bubbling up to the link */ this.setState({ menuOpen: !this.state.menuOpen, }); event.stopPropagation(); return false; }, closeMenu: function(event) { this.setState({ menuOpen: false, }); }, getInitialState: function() { return { menuOpen: false, }; }, render: function() { const {onCaretClick, ...other} = this.props; return (
{this.props.label} {this.state.menuOpen ? {this.props.children} : null}
); } }); export let DownloadLink = React.createClass({ propTypes: { type: React.PropTypes.string, streamName: React.PropTypes.string, sdHash: React.PropTypes.string, metadata: React.PropTypes.object, label: React.PropTypes.string, button: React.PropTypes.string, state: React.PropTypes.oneOf(['not-started', 'downloading', 'done']), progress: React.PropTypes.number, path: React.PropTypes.string, hidden: React.PropTypes.bool, deleteChecked: React.PropTypes.bool, }, tryDownload: function() { this.setState({ attemptingDownload: true, }); 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, }); } else { this.setState({ filePath: streamInfo.path, attemptingDownload: false, }); } }); } }); }); }, openMenu: function() { this.setState({ menuOpen: !this.state.menuOpen, }); }, handleDeleteCheckboxClicked: function(event) { this.setState({ deleteChecked: event.target.checked, }); }, handleRevealClicked: function() { lbry.revealFile(this.props.path); }, handleRemoveClicked: function() { this.setState({ modal: 'confirmRemove', }); }, handleRemoveConfirmed: function() { lbry.deleteFile(this.props.sdHash || this.props.streamName, this.state.deleteChecked); this.setState({ modal: null, }); }, getDefaultProps: function() { return { state: 'not-started', } }, getInitialState: function() { return { filePath: null, modal: null, menuOpen: false, deleteChecked: false, attemptingDownload: false, } }, closeModal: function() { this.setState({ modal: null, }) }, handleClick: function() { if (this.props.state == 'not-started') { this.tryDownload(); } else if (this.props.state == 'done') { lbry.revealFile(this.props.path); } }, render: function() { const openInFolderMessage = window.navigator.platform.startsWith('Mac') ? 'Open in Finder' : 'Open in Folder'; const dropDownItems = [ , , ]; let linkBlock; if (this.state.attemptingDownload || this.props.state == 'downloading') { const progress = this.state.attemptingDownload ? 0 : this.props.progress; const label = `${parseInt(progress * 100)}% complete`; linkBlock = ( {dropDownItems} {dropDownItems} ); } else if (this.props.state == 'not-started') { linkBlock = ( ); } else if (this.props.state == 'done') { linkBlock = ( {dropDownItems} ); } else { throw new Error(`Unknown download state ${this.props.state} passed to DownloadLink`); } return ( 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 WatchLink = React.createClass({ propTypes: { type: React.PropTypes.string, streamName: React.PropTypes.string, label: React.PropTypes.string, button: React.PropTypes.string, hidden: React.PropTypes.bool, }, handleClick: function() { this.setState({ loading: true, }) lbry.getCostInfoForName(this.props.streamName, ({cost}) => { lbry.getBalance((balance) => { if (cost > balance) { this.setState({ modal: 'notEnoughCredits', loading: false, }); } else { window.location = '?watch=' + this.props.streamName; } }); }); }, getInitialState: function() { return { modal: null, loading: false, }; }, closeModal: function() { this.setState({ modal: null, }); }, getDefaultProps: function() { return { icon: 'icon-play', label: 'Watch', } }, render: function() { return (
You don't have enough LBRY credits to pay for this stream.
); } });