Class: ReactOnRails::ReactComponent::RenderOptions

Inherits:
Object
  • Object
show all
Includes:
Utils::Required
Defined in:
lib/react_on_rails/react_component/render_options.rb

Overview

rubocop:disable Metrics/ClassLength

Constant Summary collapse

PRERENDER_OVERRIDE_ENV_KEY =
"REACT_ON_RAILS_PRERENDER_OVERRIDE"
PRERENDER_OVERRIDE_VALUES =
{ "true" => true, "false" => false }.freeze
PRERENDER_OVERRIDE_CACHE_MUTEX =
Mutex.new
NO_PROPS =
{}.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Utils::Required

#required

Constructor Details

#initialize(react_component_name: required("react_component_name"), options: required("options")) ⇒ RenderOptions

TODO: remove the required for named params



55
56
57
58
# File 'lib/react_on_rails/react_component/render_options.rb', line 55

def initialize(react_component_name: required("react_component_name"), options: required("options"))
  @react_component_name = react_component_name.camelize
  @options = options
end

Instance Attribute Details

#react_component_nameObject (readonly)

Returns the value of attribute react_component_name.



60
61
62
# File 'lib/react_on_rails/react_component/render_options.rb', line 60

def react_component_name
  @react_component_name
end

#request_digestObject

Returns the value of attribute request_digest.



11
12
13
# File 'lib/react_on_rails/react_component/render_options.rb', line 11

def request_digest
  @request_digest
end

Class Method Details

.generate_request_idObject



189
190
191
# File 'lib/react_on_rails/react_component/render_options.rb', line 189

def self.generate_request_id
  SecureRandom.uuid
end

.prerender_env_overrideObject



17
18
19
20
21
22
23
24
25
26
27
# File 'lib/react_on_rails/react_component/render_options.rb', line 17

def prerender_env_override
  PRERENDER_OVERRIDE_CACHE_MUTEX.synchronize do
    raw_value = ENV.fetch(PRERENDER_OVERRIDE_ENV_KEY, nil)
    cached_override = @prerender_env_override_cache
    return cached_override[:value] if cached_override && cached_override[:raw_value] == raw_value

    parsed_value = parse_prerender_env_override(raw_value)
    @prerender_env_override_cache = { raw_value: raw_value, value: parsed_value }
    parsed_value
  end
end

.reset_prerender_env_override_cache!Object



29
30
31
32
33
# File 'lib/react_on_rails/react_component/render_options.rb', line 29

def reset_prerender_env_override_cache!
  PRERENDER_OVERRIDE_CACHE_MUTEX.synchronize do
    @prerender_env_override_cache = nil
  end
end

Instance Method Details

#auto_load_bundleObject



117
118
119
# File 'lib/react_on_rails/react_component/render_options.rb', line 117

def auto_load_bundle
  retrieve_configuration_value_for(:auto_load_bundle)
end

#client_propsObject



70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/react_on_rails/react_component/render_options.rb', line 70

def client_props
  props_extension = ReactOnRails.configuration.rendering_props_extension
  if props_extension.present?
    if props_extension.respond_to?(:adjust_props_for_client_side_hydration)
      return props_extension.adjust_props_for_client_side_hydration(react_component_name,
                                                                    props.clone)
    end

    raise ReactOnRails::Error, "ReactOnRails: your rendering_props_extension module is missing the " \
                               "required adjust_props_for_client_side_hydration method & can not be used"
  end
  props
end

#dom_idObject



88
89
90
91
92
93
94
95
96
# File 'lib/react_on_rails/react_component/render_options.rb', line 88

def dom_id
  @dom_id ||= options.fetch(:id) do
    if random_dom_id
      generate_unique_dom_id
    else
      base_dom_id
    end
  end
end

#html_optionsObject



106
107
108
# File 'lib/react_on_rails/react_component/render_options.rb', line 106

def html_options
  options[:html_options].to_h
end

#html_streaming?Boolean

Returns:

  • (Boolean)


180
181
182
183
# File 'lib/react_on_rails/react_component/render_options.rb', line 180

def html_streaming?
  # Returns true if the component should be rendered incrementally
  render_mode == :html_streaming
end

#immediate_hydrationObject



141
142
143
144
145
146
147
# File 'lib/react_on_rails/react_component/render_options.rb', line 141

def immediate_hydration
  ReactOnRails::Utils.normalize_immediate_hydration(
    options[:immediate_hydration],
    react_component_name,
    "Component"
  )
end

#internal_option(key) ⇒ Object



153
154
155
# File 'lib/react_on_rails/react_component/render_options.rb', line 153

def internal_option(key)
  options[key]
end

#logging_on_serverObject



137
138
139
# File 'lib/react_on_rails/react_component/render_options.rb', line 137

def logging_on_server
  retrieve_configuration_value_for(:logging_on_server)
end

#prerenderObject



110
111
112
113
114
115
# File 'lib/react_on_rails/react_component/render_options.rb', line 110

def prerender
  env_override = prerender_env_override
  return env_override unless env_override.nil?

  retrieve_configuration_value_for(:prerender)
end

#propsObject



66
67
68
# File 'lib/react_on_rails/react_component/render_options.rb', line 66

def props
  options.fetch(:props) { NO_PROPS }
end

#raise_non_shell_server_rendering_errorsObject



133
134
135
# File 'lib/react_on_rails/react_component/render_options.rb', line 133

def raise_non_shell_server_rendering_errors
  retrieve_react_on_rails_pro_config_value_for(:raise_non_shell_server_rendering_errors)
end

#raise_on_prerender_errorObject



129
130
131
# File 'lib/react_on_rails/react_component/render_options.rb', line 129

def raise_on_prerender_error
  retrieve_configuration_value_for(:raise_on_prerender_error)
end

#random_dom_idObject



84
85
86
# File 'lib/react_on_rails/react_component/render_options.rb', line 84

def random_dom_id
  retrieve_configuration_value_for(:random_dom_id)
end

#random_dom_id?Boolean

Returns:

  • (Boolean)


98
99
100
101
102
103
104
# File 'lib/react_on_rails/react_component/render_options.rb', line 98

def random_dom_id?
  return false if options[:id]

  return false unless random_dom_id

  true
end

#render_modeObject



161
162
163
164
165
166
167
168
# File 'lib/react_on_rails/react_component/render_options.rb', line 161

def render_mode
  # Determines the React rendering strategy:
  # - :sync: Synchronous SSR using renderToString (blocking and rendering in one shot)
  # - :html_streaming: Progressive SSR using renderToPipeableStream (non-blocking and rendering incrementally)
  # - :rsc_payload_streaming: Server Components serialized in React flight format
  #   (non-blocking and rendering incrementally).
  options.fetch(:render_mode, :sync)
end

#replay_consoleObject



125
126
127
# File 'lib/react_on_rails/react_component/render_options.rb', line 125

def replay_console
  retrieve_configuration_value_for(:replay_console)
end

#rsc_payload_streaming?Boolean

Returns:

  • (Boolean)


175
176
177
178
# File 'lib/react_on_rails/react_component/render_options.rb', line 175

def rsc_payload_streaming?
  # Returns true if the component should be rendered as a React Server Component
  render_mode == :rsc_payload_streaming
end

#set_option(key, value) ⇒ Object



157
158
159
# File 'lib/react_on_rails/react_component/render_options.rb', line 157

def set_option(key, value)
  options[key] = value
end

#store_dependenciesObject



185
186
187
# File 'lib/react_on_rails/react_component/render_options.rb', line 185

def store_dependencies
  options[:store_dependencies]
end

#streaming?Boolean

Returns:

  • (Boolean)


170
171
172
173
# File 'lib/react_on_rails/react_component/render_options.rb', line 170

def streaming?
  # Returns true if the component should be rendered incrementally
  %i[html_streaming rsc_payload_streaming].include?(render_mode)
end

#throw_js_errorsObject



62
63
64
# File 'lib/react_on_rails/react_component/render_options.rb', line 62

def throw_js_errors
  options.fetch(:throw_js_errors, false)
end

#to_sObject



149
150
151
# File 'lib/react_on_rails/react_component/render_options.rb', line 149

def to_s
  "{ react_component_name = #{react_component_name}, options = #{options}, request_digest = #{request_digest}"
end

#traceObject



121
122
123
# File 'lib/react_on_rails/react_component/render_options.rb', line 121

def trace
  retrieve_configuration_value_for(:trace)
end