Youtube music and video downloader

Options.jsx 1.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import React, {Component, PropTypes} from 'react';
  2. import Video from './Video';
  3. import classnames from 'classnames';
  4. export default class Options extends Component {
  5. getProgress(type) {
  6. return !this.props.converted ? 0 :
  7. this.props.converted[type === 'MP3' ? 'audio_progress' : 'video_progress'];
  8. }
  9. isDisabled(type) {
  10. return !this.props.converted ||
  11. !this.props.converted[type === 'MP3' ? 'audio' : 'video'];
  12. }
  13. getClasses(type) {
  14. let option = true;
  15. let unreachable = null;
  16. if (this.props.converted)
  17. unreachable = (type === 'MP3' ? this.props.converted.error_audio : this.props.converted.error_video);
  18. return classnames({ option, unreachable });
  19. }
  20. getErrorMessage(type) {
  21. return (type === 'MP3' ? this.props.converted.error_audio : this.props.converted.error_video) || null;
  22. }
  23. render() {
  24. return (
  25. <div>
  26. { _.map(this.props.handlers, (h) => (
  27. <button key={h.type} className={this.getClasses(h.type)}
  28. onClick={() => h.handler(this.props.video)}
  29. disabled={this.isDisabled(h.type)} title={this.getErrorMessage(h.type)}>
  30. <div className="option-progress" style={{width: this.getProgress(h.type) + '%'}}></div>
  31. <i className="fa fa-download"/> {h.type}
  32. </button>
  33. )) }
  34. </div>
  35. );
  36. }
  37. }
  38. Options.propTypes = {
  39. handlers: PropTypes.arrayOf(PropTypes.shape({
  40. type: PropTypes.string,
  41. handler: PropTypes.func
  42. })),
  43. video: PropTypes.instanceOf(Video),
  44. converted: PropTypes.object
  45. };