class Frails::Component::ReactRenderer

Public Instance Methods

render(context, options, &block) click to toggle source
# File lib/frails/component/react_renderer.rb, line 8
def render(context, options, &block)
  @view = context
  @component = options.delete(:component)

  klass = presenter_class
  @presenter = klass.new(@view, @component, options)

  @children = @view.capture(&block) if block_given?

  render_with_callbacks || nil
end

Private Instance Methods

camelize_keys(data) click to toggle source
# File lib/frails/component/react_renderer.rb, line 60
def camelize_keys(data)
  data.deep_transform_keys do |key|
    Frails::Utils.camelize key.to_s, :lower, convert_slashes: false
  end
end
content_tag(&block) click to toggle source
# File lib/frails/component/react_renderer.rb, line 55
def content_tag(&block)
  class_names = "js__reactComponent #{@presenter.class_name}"
  @view.content_tag @presenter.tag, class: class_names, data: data_for_content_tag, &block
end
data_for_content_tag() click to toggle source
# File lib/frails/component/react_renderer.rb, line 45
def data_for_content_tag
  {
    componentPath: @component,
    componentName: @component.to_s.tr('/', '_').camelize,
    props: @props,
    contentLoader: @content_loader,
    renderMethod: @prerender ? 'hydrate' : 'render'
  }.to_json
end
loader() click to toggle source
# File lib/frails/component/react_renderer.rb, line 66
def loader
  return unless @content_loader

  @view.render @content_loader, class_name: 'js__reactComponent', data: data_for_content_tag
end
move_console_replay_script(rendered_tag) click to toggle source

Grab the server-rendered console replay script and move it outside the container div.

rubocop:disable Style/RegexpLiteral

# File lib/frails/component/react_renderer.rb, line 75
def move_console_replay_script(rendered_tag)
  regex = /\n(<script class="js__reactServerConsoleReplay">.*<\/script>)<\/(\w+)>$/m
  rendered_tag.sub(regex, '</\2>\1').html_safe
end
presenter_class() click to toggle source
# File lib/frails/component/react_renderer.rb, line 41
def presenter_class
  super || Frails::Component::React
end
render_with_callbacks() click to toggle source
# File lib/frails/component/react_renderer.rb, line 22
def render_with_callbacks
  @presenter.run_callbacks :render do
    @prerender = @presenter.prerender
    @content_loader = @presenter.content_loader
    @props = camelize_keys(@presenter.props)
    @props[:children] = @children if instance_variable_defined?(:@children)

    @prerender && render_inline_styles

    rendered_tag = if @prerender
                     content_tag { React::Renderer.new.render(@component, @props).html_safe }
                   else
                     loader || content_tag { nil }
                   end

    @prerender ? move_console_replay_script(rendered_tag) : rendered_tag
  end
end
stylesheet_entry_file() click to toggle source

rubocop:enable Style/RegexpLiteral

# File lib/frails/component/react_renderer.rb, line 81
def stylesheet_entry_file
  "#{@component.tr('/', '-')}-index-entry-jsx"
end