reactrb/reactrb

View on GitHub
lib/reactive-ruby/rails/component_mount.rb

Summary

Maintainability
A
0 mins
Test Coverage
module ReactiveRuby
  module Rails
    class ComponentMount < React::Rails::ComponentMount
      attr_accessor :controller

      def setup(controller)
        self.controller = controller
      end

      def react_component(name, props = {}, options = {}, &block)
        options = context_initializer_options(options, name) if options[:prerender]
        props = serialized_props(props, name, controller)
        super(top_level_name, props, options, &block).gsub("\n","")
          .gsub(/(<script>.*<\/script>)<\/div>$/,'</div>\1').html_safe +
          footers
      end

      private

      def context_initializer_options(options, name)
        options[:prerender] = {options[:prerender] => true} unless options[:prerender].is_a? Hash
        existing_context_initializer = options[:prerender][:context_initializer]

        options[:prerender][:context_initializer] = lambda do |ctx|
          React::IsomorphicHelpers.load_context(ctx, controller, name)
          existing_context_initializer.call ctx if existing_context_initializer
        end

        options
      end

      def serialized_props(props, name, controller)
        { render_params: props, component_name: name,
          controller: controller.class.name.gsub(/Controller$/,"") }.react_serializer
      end

      def top_level_name
        'React.TopLevelRailsComponent'
      end

      def footers
        React::IsomorphicHelpers.prerender_footers(controller)
      end
    end
  end
end