class RenderReact::Context

Attributes

app[R]
mode[R]

Public Class Methods

new(javascript_source = nil, mode: :client_and_server) click to toggle source
# File lib/render_react/context.rb, line 9
def initialize(javascript_source = nil, mode: :client_and_server)
  if javascript_source == nil
    @app = nil
    @mode = :client_only
  else
    @app = ExecJS.compile(javascript_source)
    @mode = mode
  end
end

Public Instance Methods

call(*args)
Alias for: render_react
on_client(component_name, props_hash = {}) click to toggle source
# File lib/render_react/context.rb, line 33
def on_client(component_name, props_hash = {})
  component_uuid = SecureRandom.uuid
  props_json = JSON.dump(props_hash)
  "<div id=\"RenderReact-#{component_uuid}\"></div><script>#{client_script(component_name, props_json, component_uuid)}</script>"
end
on_client_and_server(component_name, props_hash = {}) click to toggle source
# File lib/render_react/context.rb, line 48
def on_client_and_server(component_name, props_hash = {})
  if mode == :client_only
    raise ArgumentError, "Context mode is :client_only, create a server context to be able to use server-side rendering"
  end

  component_uuid = SecureRandom.uuid
  props_json = JSON.dump(props_hash)
  server_rendered = app.eval(server_script(component_name, props_json))
  "<div id=\"RenderReact-#{component_uuid}\">#{server_rendered}</div><script>#{client_script(component_name, props_json, component_uuid)}</script>"
end
Also aliased as: on_server_and_client
on_server(component_name, props_hash = {}) click to toggle source
# File lib/render_react/context.rb, line 39
def on_server(component_name, props_hash = {})
  if mode == :client_only
    raise ArgumentError, "Context mode is :client_only, create a server context to be able to use server-side rendering"
  end

  props_json = JSON.dump(props_hash)
  app.eval(server_script(component_name, props_json, true))
end
on_server_and_client(component_name, props_hash = {})
render_react(*args) click to toggle source
# File lib/render_react/context.rb, line 19
def render_react(*args)
  case mode
  when :client, :client_only
    on_client(*args)
  when :server
    on_server(*args)
  when :client_and_server, :server_and_client
    on_client_and_server(*args)
  else
    raise ArgumentError, "unknown render mode"
  end
end
Also aliased as: call

Private Instance Methods

client_script(component_name, props_json, uuid) click to toggle source
# File lib/render_react/context.rb, line 62
def client_script(component_name, props_json, uuid)
  "RenderReact.ReactDOM.render(RenderReact.React.createElement(RenderReact.components.#{component_name}, #{props_json}), document.getElementById('RenderReact-#{uuid}'))"
end
server_script(component_name, props_json, static = false) click to toggle source
# File lib/render_react/context.rb, line 66
def server_script(component_name, props_json, static = false)
  render_method = static ? 'renderToStaticMarkup' : 'renderToString'
  "RenderReact.ReactDOMServer.#{render_method}(RenderReact.React.createElement(RenderReact.components.#{component_name}, #{props_json}))"
end