module React::Component::ClassMethods

Public Instance Methods

add_item_to_tree(current_tree, new_item) click to toggle source
# File lib/react/component/class_methods.rb, line 180
def add_item_to_tree(current_tree, new_item)
  if Native(current_tree).class != Native::Object || new_item.length == 1
    new_item.inject { |memo, sub_name| { sub_name => memo } }
  else
    Native(current_tree)[new_item.last] = add_item_to_tree(Native(current_tree)[new_item.last], new_item[0..-2])
    current_tree
  end
end
backtrace(*args) click to toggle source
# File lib/react/component/class_methods.rb, line 4
def backtrace(*args)
  @backtrace_off = (args[0] == :off)
end
collect_other_params_as(name) click to toggle source
# File lib/react/component/class_methods.rb, line 96
def collect_other_params_as(name)
  validator.allow_undefined_props = true
  define_method(name) do
    @_all_others ||= self.class.validator.undefined_props(props)
  end

  validator_in_lexial_scope = validator
  props_wrapper.define_method(name) do
    @_all_others ||= validator_in_lexial_scope.undefined_props(props)
  end
end
default_props() click to toggle source
# File lib/react/component/class_methods.rb, line 50
def default_props
  validator.default_props
end
define_param(name, param_type) click to toggle source
# File lib/react/component/class_methods.rb, line 62
def define_param(name, param_type)
  props_wrapper.define_param(name, param_type, self)
end
define_state(*states) { |: nil| ... } click to toggle source
# File lib/react/component/class_methods.rb, line 108
def define_state(*states, &block)
  default_initial_value = (block && block.arity == 0) ? yield : nil
  states_hash = (states.last.is_a?(Hash)) ? states.pop : {}
  states.each { |name| states_hash[name] = default_initial_value }
  (self.initial_state ||= {}).merge! states_hash
  states_hash.each do |name, initial_value|
    define_state_methods(self, name, &block)
  end
end
define_state_methods(this, name, from = nil) { |name, get_state(from || self, name), new_state| ... } click to toggle source
# File lib/react/component/class_methods.rb, line 129
def define_state_methods(this, name, from = nil, &block)
  this.define_method("#{name}") do
    self.class.deprecation_warning "Direct access to state `#{name}`.  Use `state.#{name}` instead." if from.nil? || from == this
    State.get_state(from || self, name)
  end
  this.define_method("#{name}=") do |new_state|
    self.class.deprecation_warning "Direct assignment to state `#{name}`.  Use `#{(from && from != this) ? from : 'state'}.#{name}!` instead."
    yield name, State.get_state(from || self, name), new_state if block && block.arity > 0
    State.set_state(from || self, name, new_state)
  end
  this.define_method("#{name}!") do |*args|
    self.class.deprecation_warning "Direct access to state `#{name}`.  Use `state.#{name}` instead."  if from.nil? or from == this
    if args.count > 0
      yield name, State.get_state(from || self, name), args[0] if block && block.arity > 0
      current_value = State.get_state(from || self, name)
      State.set_state(from || self, name, args[0])
      current_value
    else
      current_state = State.get_state(from || self, name)
      yield name, State.get_state(from || self, name), current_state if block && block.arity > 0
      State.set_state(from || self, name, current_state)
      Observable.new(current_state) do |update|
        yield name, State.get_state(from || self, name), update if block && block.arity > 0
        State.set_state(from || self, name, update)
      end
    end
  end
end
deprecation_warning(message) click to toggle source
# File lib/react/component/class_methods.rb, line 21
def deprecation_warning(message)
  @deprecation_messages ||= []
  message = "Warning: Deprecated feature used in #{self.name}. #{message}"
  unless @deprecation_messages.include? message
    @deprecation_messages << message
    IsomorphicHelpers.log message, :warning
  end
end
export_component(opts = {}) click to toggle source
# File lib/react/component/class_methods.rb, line 174
def export_component(opts = {})
  export_name = (opts[:as] || name).split("::")
  first_name = export_name.first
  Native(`window`)[first_name] = add_item_to_tree(Native(`window`)[first_name], [React::API.create_native_react_class(self)] + export_name[1..-1].reverse).to_n
end
export_state(*states) { |: nil| ... } click to toggle source
# File lib/react/component/class_methods.rb, line 118
def export_state(*states, &block)
  default_initial_value = (block && block.arity == 0) ? yield : nil
  states_hash = (states.last.is_a?(Hash)) ? states.pop : {}
  states.each { |name| states_hash[name] = default_initial_value }
  State.initialize_states(self, states_hash)
  states_hash.each do |name, initial_value|
    define_state_methods(self, name, self, &block)
    define_state_methods(singleton_class, name, self, &block)
  end
end
native_mixin(item) click to toggle source
# File lib/react/component/class_methods.rb, line 158
def native_mixin(item)
  native_mixins << item
end
native_mixins() click to toggle source
# File lib/react/component/class_methods.rb, line 162
def native_mixins
  @native_mixins ||= []
end
optional_param(name, options = {}) click to toggle source
# File lib/react/component/class_methods.rb, line 91
def optional_param(name, options = {})
  deprecation_warning "`optional_param` is deprecated, use `param param_name: default_value` instead."
  validator.optional(name, options)
end
param(*args) click to toggle source
# File lib/react/component/class_methods.rb, line 66
def param(*args)
  if args[0].is_a? Hash
    options = args[0]
    name = options.first[0]
    default = options.first[1]
    options.delete(name)
    options.merge!({default: default})
  else
    name = args[0]
    options = args[1] || {}
  end
  if options[:default]
    validator.optional(name, options)
  else
    validator.requires(name, options)
  end
end
params(&block) click to toggle source
# File lib/react/component/class_methods.rb, line 54
def params(&block)
  validator.build(&block)
end
process_exception(e, component, reraise = nil) click to toggle source
# File lib/react/component/class_methods.rb, line 8
def process_exception(e, component, reraise = nil)
  message = ["Exception raised while rendering #{component}"]
  if e.backtrace && e.backtrace.length > 1 && !@backtrace_off  # seems like e.backtrace is empty in safari???
    message << "    #{e.backtrace[0]}"
    message += e.backtrace[1..-1].collect { |line| line }
  else
    message[0] += ": #{e.message}"
  end
  message = message.join("\n")
  `console.error(message)`
  raise e if reraise
end
prop_types() click to toggle source
# File lib/react/component/class_methods.rb, line 34
def prop_types
  if self.validator
    {
      _componentValidator: %x{
        function(props, propName, componentName) {
          var errors = #{validator.validate(Hash.new(`props`))};
          var error = new Error(#{"In component `" + self.name + "`\n" + `errors`.join("\n")});
          return #{`errors`.count > 0 ? `error` : `undefined`};
        }
      }
    }
  else
    {}
  end
end
props_wrapper() click to toggle source
# File lib/react/component/class_methods.rb, line 58
def props_wrapper
  @props_wrapper ||= Class.new(PropsWrapper)
end
require_param(name, options = {})
Alias for: required_param
required_param(name, options = {}) click to toggle source
# File lib/react/component/class_methods.rb, line 84
def required_param(name, options = {})
  deprecation_warning "`required_param` is deprecated, use `param` instead."
  validator.requires(name, options)
end
Also aliased as: require_param
static_call_back(name, &block) click to toggle source
# File lib/react/component/class_methods.rb, line 166
def static_call_back(name, &block)
  static_call_backs[name] = block
end
static_call_backs() click to toggle source
# File lib/react/component/class_methods.rb, line 170
def static_call_backs
  @static_call_backs ||= {}
end
validator() click to toggle source
# File lib/react/component/class_methods.rb, line 30
def validator
  @validator ||= Validator.new(self)
end