This repository was archived by the owner on Oct 19, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathcomponent.rb
More file actions
142 lines (126 loc) · 4.32 KB
/
component.rb
File metadata and controls
142 lines (126 loc) · 4.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
require 'react/ext/string'
require 'react/ext/hash'
require 'active_support/core_ext/class/attribute'
require 'react/callbacks'
require 'react/rendering_context'
require 'react/observable'
require 'react/state'
require 'react/component/api'
require 'react/component/class_methods'
require 'react/component/props_wrapper'
require 'native'
module React
module Component
def self.included(base)
base.include(API)
base.include(Callbacks)
base.include(Tags)
base.include(DslInstanceMethods)
base.include(ShouldComponentUpdate)
base.class_eval do
class_attribute :initial_state
define_callback :before_mount
define_callback :after_mount
define_callback :before_receive_props
define_callback :before_update
define_callback :after_update
define_callback :before_unmount
end
base.extend(ClassMethods)
end
def self.deprecation_warning(message)
@deprecation_messages ||= []
message = "Warning: Deprecated feature used in #{name}. #{message}"
unless @deprecation_messages.include? message
@deprecation_messages << message
IsomorphicHelpers.log message, :warning
end
end
def initialize(native_element)
@native = native_element
end
def emit(event_name, *args)
params["_on#{event_name.to_s.event_camelize}"].call(*args)
end
def component_will_mount
IsomorphicHelpers.load_context(true) if IsomorphicHelpers.on_opal_client?
set_state! initial_state if initial_state
State.initialize_states(self, initial_state)
State.set_state_context_to(self) { run_callback(:before_mount) }
rescue Exception => e
self.class.process_exception(e, self)
end
def component_did_mount
State.set_state_context_to(self) do
run_callback(:after_mount)
State.update_states_to_observe
end
rescue Exception => e
self.class.process_exception(e, self)
end
def component_will_receive_props(next_props)
# need to rethink how this works in opal-react, or if its actually that useful within the react.rb environment
# for now we are just using it to clear processed_params
State.set_state_context_to(self) { self.run_callback(:before_receive_props, Hash.new(next_props)) }
rescue Exception => e
self.class.process_exception(e, self)
end
def component_will_update(next_props, next_state)
State.set_state_context_to(self) { self.run_callback(:before_update, Hash.new(next_props), Hash.new(next_state)) }
rescue Exception => e
self.class.process_exception(e, self)
end
def component_did_update(prev_props, prev_state)
State.set_state_context_to(self) do
self.run_callback(:after_update, Hash.new(prev_props), Hash.new(prev_state))
State.update_states_to_observe
end
rescue Exception => e
self.class.process_exception(e, self)
end
def component_will_unmount
State.set_state_context_to(self) do
self.run_callback(:before_unmount)
State.remove
end
rescue Exception => e
self.class.process_exception(e, self)
end
attr_reader :waiting_on_resources
def update_react_js_state(object, name, value)
if object
name = "#{object.class}.#{name}" unless object == self
set_state(
'***_state_updated_at-***' => Time.now.to_f,
name => value
)
else
set_state name => value
end
end
def render
raise 'no render defined'
end unless method_defined?(:render)
def _render_wrapper
State.set_state_context_to(self, true) do
element = nil
React::RenderingContext.create_context do
element = React::RenderingContext.render(nil) { render || '' }
@waiting_on_resources =
element.waiting_on_resources if element.respond_to? :waiting_on_resources
end
element
end
# rubocop:disable Lint/RescueException # we want to catch all exceptions regardless
rescue Exception => e
# rubocop:enable Lint/RescueException
self.class.process_exception(e, self)
end
def watch(value, &on_change)
Observable.new(value, on_change)
end
def define_state(*args, &block)
State.initialize_states(self, self.class.define_state(*args, &block))
end
end
end