reactrb/reactrb

View on GitHub
lib/react/top_level.rb

Summary

Maintainability
A
1 hr
Test Coverage
require "native"
require 'active_support/core_ext/object/try'
require 'react/component/tags'
require 'react/component/base'

module React

  ATTRIBUTES = %w(accept acceptCharset accessKey action allowFullScreen allowTransparency alt
                async autoComplete autoPlay cellPadding cellSpacing charSet checked classID
                className cols colSpan content contentEditable contextMenu controls coords
                crossOrigin data dateTime defer dir disabled download draggable encType form
                formAction formEncType formMethod formNoValidate formTarget frameBorder height
                hidden href hrefLang htmlFor httpEquiv icon id label lang list loop manifest
                marginHeight marginWidth max maxLength media mediaGroup method min multiple
                muted name noValidate open pattern placeholder poster preload radioGroup
                readOnly rel required role rows rowSpan sandbox scope scrolling seamless
                selected shape size sizes span spellCheck src srcDoc srcSet start step style
                tabIndex target title type useMap value width wmode dangerouslySetInnerHTML) +
                #SVG ATTRIBUTES
                %w(clipPath cx cy d dx dy fill fillOpacity fontFamily
                fontSize fx fy gradientTransform gradientUnits markerEnd
                markerMid markerStart offset opacity patternContentUnits
                patternUnits points preserveAspectRatio r rx ry spreadMethod
                stopColor stopOpacity stroke  strokeDasharray strokeLinecap
                strokeOpacity strokeWidth textAnchor transform version
                viewBox x1 x2 x xlinkActuate xlinkArcrole xlinkHref xlinkRole
                xlinkShow xlinkTitle xlinkType xmlBase xmlLang xmlSpace y1 y2 y)
  HASH_ATTRIBUTES = %w(data aria)
  HTML_TAGS = React::Component::Tags::HTML_TAGS

  def self.html_tag?(name)
    tags = HTML_TAGS
    %x{
      for(var i = 0; i < tags.length; i++) {
        if(tags[i] === name)
          return true;
      }
      return false;
    }
  end

  def self.html_attr?(name)
    attrs = ATTRIBUTES
    %x{
      for(var i = 0; i < attrs.length; i++) {
        if(attrs[i] === name)
          return true;
      }
      return false;
    }
  end

  def self.create_element(type, properties = {}, &block)
    React::API.create_element(type, properties, &block)
  end

  def self.render(element, container)
    %x{
        console.error(
          "Warning: Using deprecated behavior of `React.render`,",
          "require \"react/top_level_render\" to get the correct behavior."
        );
    }
    container = `container.$$class ? container[0] : container`
    if !(`typeof ReactDOM === 'undefined'`)
      component = Native(`ReactDOM.render(#{element.to_n}, container, function(){#{yield if block_given?}})`) # v0.15+
    elsif !(`typeof React.renderToString === 'undefined'`)
      component = Native(`React.render(#{element.to_n}, container, function(){#{yield if block_given?}})`)
    else
      raise "render is not defined.  In React >= v15 you must import it with ReactDOM"
    end

    component.class.include(React::Component::API)
    component
  end

  def self.is_valid_element(element)
    %x{ console.error("Warning: `is_valid_element` is deprecated in favor of `is_valid_element?`."); }
    element.kind_of?(React::Element) && `React.isValidElement(#{element.to_n})`
  end

  def self.is_valid_element?(element)
    element.kind_of?(React::Element) && `React.isValidElement(#{element.to_n})`
  end

  def self.render_to_string(element)
    %x{ console.error("Warning: `React.render_to_string` is deprecated in favor of `React::Server.render_to_string`."); }
    if !(`typeof ReactDOMServer === 'undefined'`)
      React::RenderingContext.build { `ReactDOMServer.renderToString(#{element.to_n})` } # v0.15+
    elsif !(`typeof React.renderToString === 'undefined'`)
      React::RenderingContext.build { `React.renderToString(#{element.to_n})` }
    else
      raise "renderToString is not defined.  In React >= v15 you must import it with ReactDOMServer"
    end
  end

  def self.render_to_static_markup(element)
    %x{ console.error("Warning: `React.render_to_static_markup` is deprecated in favor of `React::Server.render_to_static_markup`."); }
    if !(`typeof ReactDOMServer === 'undefined'`)
      React::RenderingContext.build { `ReactDOMServer.renderToStaticMarkup(#{element.to_n})` } # v0.15+
    elsif !(`typeof React.renderToString === 'undefined'`)
      React::RenderingContext.build { `React.renderToStaticMarkup(#{element.to_n})` }
    else
      raise "renderToStaticMarkup is not defined.  In React >= v15 you must import it with ReactDOMServer"
    end
  end

  def self.unmount_component_at_node(node)
    if !(`typeof ReactDOM === 'undefined'`)
      `ReactDOM.unmountComponentAtNode(node.$$class ? node[0] : node)` # v0.15+
    elsif !(`typeof React.renderToString === 'undefined'`)
      `React.unmountComponentAtNode(node.$$class ? node[0] : node)`
    else
      raise "unmountComponentAtNode is not defined.  In React >= v15 you must import it with ReactDOM"
    end
  end

end