You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			72 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			72 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
/* global Backbone: false */
 | 
						|
/* global i18n: false */
 | 
						|
/* global React: false */
 | 
						|
/* global ReactDOM: false */
 | 
						|
 | 
						|
// eslint-disable-next-line func-names
 | 
						|
(function() {
 | 
						|
  'use strict';
 | 
						|
 | 
						|
  window.Whisper = window.Whisper || {};
 | 
						|
 | 
						|
  window.Whisper.ReactWrapperView = Backbone.View.extend({
 | 
						|
    className: 'react-wrapper',
 | 
						|
    initialize(options) {
 | 
						|
      const {
 | 
						|
        Component,
 | 
						|
        JSX,
 | 
						|
        props,
 | 
						|
        onClose,
 | 
						|
        tagName,
 | 
						|
        className,
 | 
						|
        onInitialRender,
 | 
						|
        elCallback,
 | 
						|
      } = options;
 | 
						|
      this.render();
 | 
						|
      if (elCallback) {
 | 
						|
        elCallback(this.el);
 | 
						|
      }
 | 
						|
 | 
						|
      this.tagName = tagName;
 | 
						|
      this.className = className;
 | 
						|
      this.JSX = JSX;
 | 
						|
      this.Component = Component;
 | 
						|
      this.onClose = onClose;
 | 
						|
      this.onInitialRender = onInitialRender;
 | 
						|
 | 
						|
      this.update(props);
 | 
						|
 | 
						|
      this.hasRendered = false;
 | 
						|
    },
 | 
						|
    update(props) {
 | 
						|
      const updatedProps = this.augmentProps(props);
 | 
						|
      const reactElement = this.JSX ? this.JSX : React.createElement(this.Component, updatedProps);
 | 
						|
      ReactDOM.render(reactElement, this.el, () => {
 | 
						|
        if (this.hasRendered) {
 | 
						|
          return;
 | 
						|
        }
 | 
						|
 | 
						|
        this.hasRendered = true;
 | 
						|
        if (this.onInitialRender) {
 | 
						|
          this.onInitialRender();
 | 
						|
        }
 | 
						|
      });
 | 
						|
    },
 | 
						|
    augmentProps(props) {
 | 
						|
      return Object.assign({}, props, {
 | 
						|
        close: () => {
 | 
						|
          this.remove();
 | 
						|
        },
 | 
						|
        i18n,
 | 
						|
      });
 | 
						|
    },
 | 
						|
    remove() {
 | 
						|
      if (this.onClose) {
 | 
						|
        this.onClose();
 | 
						|
      }
 | 
						|
      ReactDOM.unmountComponentAtNode(this.el);
 | 
						|
      Backbone.View.prototype.remove.call(this);
 | 
						|
    },
 | 
						|
  });
 | 
						|
})();
 |