Sha256: 3a8488164139faa29c7e86414befe59713ce046fa5105b6df451ac005c37183f

Contents?: true

Size: 1.57 KB

Versions: 3

Compression:

Stored size: 1.57 KB

Contents

require_relative "inertia_rails"

module InertiaRails
  class Renderer
    attr_reader :component, :view_data

    def initialize(component, controller, request, response, render_method, props:, view_data:)
      @component = component
      @controller = controller
      @request = request
      @response = response
      @render_method = render_method
      @props = props || {}
      @view_data = view_data || {}
    end

    def render
      if @request.headers['X-Inertia']
        @response.set_header('Vary', 'Accept')
        @response.set_header('X-Inertia', 'true')
        @render_method.call json: page, status: 200
      else
        @render_method.call template: 'inertia', layout: ::InertiaRails.layout, locals: (view_data).merge({page: page})
      end
    end

    private

    def props
      only = (@request.headers['X-Inertia-Partial-Data'] || '').split(',').compact.map(&:to_sym)

      _props = ::InertiaRails.shared_data(@controller).merge(@props)

      _props = (only.any? && @request.headers['X-Inertia-Partial-Component'] == component) ?
        _props.select {|key| key.in? only} :
        _props

      deep_transform_values(_props, lambda {|prop| prop.respond_to?(:call) ? @controller.instance_exec(&prop) : prop })
    end

    def page
      {
        component: component,
        props: props,
        url: @request.original_url,
        version: ::InertiaRails.version,
      }
    end

    def deep_transform_values(hash, proc)
      return proc.call(hash) unless hash.is_a? Hash

      hash.transform_values {|value| deep_transform_values(value, proc)}
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
inertia_rails-1.2.0 lib/inertia_rails/renderer.rb
inertia_rails-1.1.0 lib/inertia_rails/renderer.rb
inertia_rails-1.0.1 lib/inertia_rails/renderer.rb