Add boost confirm modal
This commit is contained in:
		
							parent
							
								
									3047a8da74
								
							
						
					
					
						commit
						3f5290bdb2
					
				
					 6 changed files with 109 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -38,11 +38,15 @@ const mapDispatchToProps = (dispatch) => ({
 | 
			
		|||
    dispatch(replyCompose(status, router));
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  onModalReblog (status) {
 | 
			
		||||
    dispatch(reblog(status));
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  onReblog (status) {
 | 
			
		||||
    if (status.get('reblogged')) {
 | 
			
		||||
      dispatch(unreblog(status));
 | 
			
		||||
    } else {
 | 
			
		||||
      dispatch(reblog(status));
 | 
			
		||||
      dispatch(openModal('BOOST', { status, onReblog: this.onModalReblog }));
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -82,11 +82,15 @@ const Status = React.createClass({
 | 
			
		|||
    this.props.dispatch(replyCompose(status, this.context.router));
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  handleModalReblog (status) {
 | 
			
		||||
    this.props.dispatch(reblog(status));
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  handleReblogClick (status) {
 | 
			
		||||
    if (status.get('reblogged')) {
 | 
			
		||||
      this.props.dispatch(unreblog(status));
 | 
			
		||||
    } else {
 | 
			
		||||
      this.props.dispatch(reblog(status));
 | 
			
		||||
      this.props.dispatch(openModal('BOOST', { status, onReblog: this.handleModalReblog }));
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,64 @@
 | 
			
		|||
import PureRenderMixin from 'react-addons-pure-render-mixin';
 | 
			
		||||
import ImmutablePropTypes from 'react-immutable-proptypes';
 | 
			
		||||
import { defineMessages, injectIntl } from 'react-intl';
 | 
			
		||||
import IconButton from '../../../components/icon_button';
 | 
			
		||||
import Button from '../../../components/button';
 | 
			
		||||
import DetailedStatus from '../../status/components/detailed_status';
 | 
			
		||||
 | 
			
		||||
const messages = defineMessages({
 | 
			
		||||
  close: { id: 'lightbox.close', defaultMessage: 'Close' },
 | 
			
		||||
  reblog: { id: 'status.reblog', defaultMessage: 'Boost' }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const closeStyle = {
 | 
			
		||||
  position: 'absolute',
 | 
			
		||||
  top: '4px',
 | 
			
		||||
  right: '4px'
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const buttonContainerStyle = {
 | 
			
		||||
  textAlign: 'right',
 | 
			
		||||
  padding: '10px'
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const BoostModal = React.createClass({
 | 
			
		||||
 | 
			
		||||
  propTypes: {
 | 
			
		||||
    status: ImmutablePropTypes.map.isRequired,
 | 
			
		||||
    onReblog: React.PropTypes.func.isRequired,
 | 
			
		||||
    onClose: React.PropTypes.func.isRequired,
 | 
			
		||||
    intl: React.PropTypes.object.isRequired
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  mixins: [PureRenderMixin],
 | 
			
		||||
 | 
			
		||||
  handleReblog() {
 | 
			
		||||
    this.props.onReblog(this.props.status);
 | 
			
		||||
    this.props.onClose();
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  handleOpenMedia() {
 | 
			
		||||
    // do nothing"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  render () {
 | 
			
		||||
    const { status, intl, onClose } = this.props;
 | 
			
		||||
 | 
			
		||||
    const reblogButton = <span><i className='fa fa-retweet' /> {intl.formatMessage(messages.reblog)}</span>;
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
      <div className='modal-root__modal boost-modal'>
 | 
			
		||||
        <IconButton title={intl.formatMessage(messages.close)} icon='times' onClick={onClose} size={16} style={closeStyle} />
 | 
			
		||||
        <div>
 | 
			
		||||
          <DetailedStatus status={status} onOpenMedia={this.handleOpenMedia} />
 | 
			
		||||
        </div>
 | 
			
		||||
        <div style={buttonContainerStyle}>
 | 
			
		||||
          <Button text={reblogButton} onClick={this.handleReblog} />
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default injectIntl(BoostModal);
 | 
			
		||||
| 
						 | 
				
			
			@ -1,9 +1,11 @@
 | 
			
		|||
import PureRenderMixin from 'react-addons-pure-render-mixin';
 | 
			
		||||
import MediaModal from './media_modal';
 | 
			
		||||
import BoostModal from './boost_modal';
 | 
			
		||||
import { TransitionMotion, spring } from 'react-motion';
 | 
			
		||||
 | 
			
		||||
const MODAL_COMPONENTS = {
 | 
			
		||||
  'MEDIA': MediaModal
 | 
			
		||||
  'MEDIA': MediaModal,
 | 
			
		||||
  'BOOST': BoostModal
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const ModalRoot = React.createClass({
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| 
						 | 
				
			
			@ -1180,7 +1180,7 @@ a.status__content__spoiler-link {
 | 
			
		|||
 | 
			
		||||
@import 'boost';
 | 
			
		||||
 | 
			
		||||
button i.fa-retweet {
 | 
			
		||||
button.icon-button i.fa-retweet {
 | 
			
		||||
  height: 19px;
 | 
			
		||||
  width: 22px;
 | 
			
		||||
  background-position: 0 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -1192,7 +1192,7 @@ button i.fa-retweet {
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
button.active i.fa-retweet {
 | 
			
		||||
button.icon-button.active i.fa-retweet {
 | 
			
		||||
  transition-duration: 0.9s;
 | 
			
		||||
  background-position: 0 100%;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1896,3 +1896,32 @@ button.active i.fa-retweet {
 | 
			
		|||
    max-height: 80vh;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.boost-modal {
 | 
			
		||||
  display: block;
 | 
			
		||||
 | 
			
		||||
  color: white;
 | 
			
		||||
  background: lighten($color1, 13%);
 | 
			
		||||
 | 
			
		||||
  max-width: 90vw;
 | 
			
		||||
  width: 480px;
 | 
			
		||||
 | 
			
		||||
  padding-top: 25px;
 | 
			
		||||
  border-radius: 3px;
 | 
			
		||||
 | 
			
		||||
  position: relative;
 | 
			
		||||
 | 
			
		||||
  & .detailed-status {
 | 
			
		||||
    pointer-events: none;
 | 
			
		||||
    max-height: 60vh;
 | 
			
		||||
    overflow-y: auto;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  & > .icon-button {
 | 
			
		||||
    color: lighten($color1, 40%);
 | 
			
		||||
 | 
			
		||||
    &:hover, &:active {
 | 
			
		||||
      color: lighten($color1, 60%);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue