You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

54 lines
1.9 KiB

  1. import React from 'react';
  2. import ImmutablePropTypes from 'react-immutable-proptypes';
  3. import PropTypes from 'prop-types';
  4. import Audio from 'mastodon/features/audio';
  5. import { connect } from 'react-redux';
  6. import ImmutablePureComponent from 'react-immutable-pure-component';
  7. import Footer from 'mastodon/features/picture_in_picture/components/footer';
  8. const mapStateToProps = (state, { statusId }) => ({
  9. accountStaticAvatar: state.getIn(['accounts', state.getIn(['statuses', statusId, 'account']), 'avatar_static']),
  10. });
  11. export default @connect(mapStateToProps)
  12. class AudioModal extends ImmutablePureComponent {
  13. static propTypes = {
  14. media: ImmutablePropTypes.map.isRequired,
  15. statusId: PropTypes.string.isRequired,
  16. accountStaticAvatar: PropTypes.string.isRequired,
  17. options: PropTypes.shape({
  18. autoPlay: PropTypes.bool,
  19. }),
  20. onClose: PropTypes.func.isRequired,
  21. onChangeBackgroundColor: PropTypes.func.isRequired,
  22. };
  23. render () {
  24. const { media, accountStaticAvatar, statusId, onClose } = this.props;
  25. const options = this.props.options || {};
  26. return (
  27. <div className='modal-root__modal audio-modal'>
  28. <div className='audio-modal__container'>
  29. <Audio
  30. src={media.get('url')}
  31. alt={media.get('description')}
  32. duration={media.getIn(['meta', 'original', 'duration'], 0)}
  33. height={150}
  34. poster={media.get('preview_url') || accountStaticAvatar}
  35. backgroundColor={media.getIn(['meta', 'colors', 'background'])}
  36. foregroundColor={media.getIn(['meta', 'colors', 'foreground'])}
  37. accentColor={media.getIn(['meta', 'colors', 'accent'])}
  38. autoPlay={options.autoPlay}
  39. />
  40. </div>
  41. <div className='media-modal__overlay'>
  42. {statusId && <Footer statusId={statusId} withOpenButton onClose={onClose} />}
  43. </div>
  44. </div>
  45. );
  46. }
  47. }