Advertisement
Guest User

Viewer component

a guest
Aug 21st, 2015
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var React = require('react/addons');
  2. var _ = require('lodash');
  3. var ReactPropTypes = React.PropTypes;
  4.  
  5. var ServerAction = require('../actions/ServerAction');
  6.  
  7.  
  8. var ImageViewer = React.createClass({
  9.  
  10.     propTypes: {
  11.         image: ReactPropTypes.object
  12.     },
  13.  
  14.     getInitialState: function() {
  15.         return {
  16.             mounted: false
  17.         };
  18.     },
  19.  
  20.     componentDidMount: function() {
  21.         this._addEvent();
  22.         this._mounting(this.props.image);
  23.         this.setState({ mounted: true });
  24.     },
  25.  
  26.     componentDidUpdate: function(prevProps, prevState) {
  27.         if (this.state.mounted) {
  28.             var box = React.findDOMNode(this.refs.image_wrapper),
  29.                 src = React.findDOMNode(this.refs.image_source);
  30.  
  31.             // Этот блок по видимому нужно тоже анимировать иначе, изображение не будет на своем месте
  32.             $(box).css({
  33.                 position: 'initial',
  34.                 overflow: 'auto',
  35.                 top: 0,
  36.                 left: 0,
  37.                 width: '100%',
  38.                 height: '100%',
  39.             });
  40.  
  41.             // Тут нужно изменить параметры изображения на фулскрин
  42.             $(src).css({
  43.  
  44.             });
  45.         }
  46.     },
  47.  
  48.     componentWillUnMount: function() {
  49.         this._removeEvent();
  50.     },
  51.  
  52.     _mounting: function(props) {
  53.         var box = React.findDOMNode(this.refs.image_wrapper),
  54.             src = React.findDOMNode(this.refs.image_source);
  55.  
  56.         var boxStyle = props.element.getBoundingClientRect(),
  57.             srcStyle = $(props.element).find('img')[0];
  58.  
  59.         $(box).css({
  60.             position: 'absolute',
  61.             overflow: 'hidden',
  62.             top: boxStyle.top,
  63.             left: boxStyle.left,
  64.             width: boxStyle.width,
  65.             height: boxStyle.height,
  66.         });
  67.  
  68.         $(src).css({
  69.              position: 'absolute',
  70.              top: '50%',
  71.              left: '50%',
  72.              margin: 0,
  73.              padding: 0,
  74.              border: 'none',
  75.             'margin-top': srcStyle.style.marginTop,
  76.             'margin-left': srcStyle.style.marginLeft,
  77.              width: srcStyle.style.width,
  78.              height: srcStyle.style.height
  79.         });
  80.     },
  81.  
  82.     _dismiss: function() {
  83.         ServerAction.openImageViewer({ mounted: false });
  84.     },
  85.  
  86.     /**
  87.      * Обработчик клавиатуры
  88.      *
  89.      * esc [27] - закрыть просмотр
  90.      */
  91.     _handleKeyPress: function(event) {
  92.         switch (event.keyCode) {
  93.             case 27:
  94.                 this._dismiss();
  95.                 break;
  96.  
  97.             default:
  98.                 // do nothing
  99.         }
  100.     },
  101.  
  102.     /**
  103.      * Event control
  104.      */
  105.     _addEvent: function() {
  106.         document.addEventListener("keydown", this._handleKeyPress);
  107.     },
  108.  
  109.     _removeEvent: function() {
  110.         document.removeEventListener("keydown", this._handleKeyPress);
  111.     },
  112.  
  113.     render: function() {
  114.         return (
  115.             <div className="image-wrapper" ref="wrapper">
  116.                 <div ref="image_wrapper">
  117.                     <img src={this.props.image.object.internal_link} ref="image_source" />
  118.                 </div>
  119.             </div>
  120.         );
  121.     }
  122.  
  123. });
  124.  
  125. module.exports = ImageViewer;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement