isomorfeus-react 16.12.11 → 16.12.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/lib/isomorfeus/config.rb +13 -0
  3. data/lib/isomorfeus/props/validator.rb +16 -16
  4. data/lib/isomorfeus/react_view_helper.rb +21 -11
  5. data/lib/isomorfeus/top_level.rb +1 -1
  6. data/lib/isomorfeus-react.rb +0 -1
  7. data/lib/isomorfeus_react/lucid_app/mixin.rb +0 -1
  8. data/lib/isomorfeus_react/lucid_app/native_lucid_component_constructor.rb +0 -4
  9. data/lib/isomorfeus_react/lucid_component/mixin.rb +0 -1
  10. data/lib/isomorfeus_react/lucid_component/native_lucid_component_constructor.rb +0 -4
  11. data/lib/isomorfeus_react/lucid_func/initializer.rb +0 -8
  12. data/lib/isomorfeus_react/lucid_func/mixin.rb +0 -1
  13. data/lib/isomorfeus_react/react/function_component/api.rb +11 -1
  14. data/lib/isomorfeus_react/react/function_component/initializer.rb +0 -8
  15. data/lib/isomorfeus_react/react/function_component/mixin.rb +0 -1
  16. data/lib/isomorfeus_react/react/memo_component/mixin.rb +0 -1
  17. data/lib/isomorfeus_react_material/lucid_material/app/mixin.rb +0 -1
  18. data/lib/isomorfeus_react_material/lucid_material/component/mixin.rb +0 -1
  19. data/lib/isomorfeus_react_material/lucid_material/func/mixin.rb +0 -1
  20. data/lib/lucid_prop_declaration/mixin.rb +1 -1
  21. data/lib/react/component/api.rb +2 -1
  22. data/lib/react/component/mixin.rb +0 -1
  23. data/lib/react/component/native_component_constructor.rb +0 -4
  24. data/lib/react/native_constant_wrapper.rb +1 -1
  25. data/lib/react/version.rb +1 -1
  26. data/lib/react.rb +48 -3
  27. metadata +9 -5
  28. data/lib/isomorfeus_react/react/function_component/event_handler.rb +0 -21
  29. data/lib/react/component/event_handler.rb +0 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5bd800a1904a42600ff9e2fc9f13fefecb7cff632c5804c035270dbf08190153
4
- data.tar.gz: a89ec7399fd872fd0f22c8125ad6cd0bf181292207fb48dc3256fc09481bee39
3
+ metadata.gz: 331181f0913df3ce50e11f4e6d4aa062bd6d329a8d4442d0c0d00c7ff9041a1d
4
+ data.tar.gz: 9f0c73b00b5a5476b47a62bf6212df26ee69144445af822ee167a5e018495c32
5
5
  SHA512:
6
- metadata.gz: 33548792159ab94a1fe617d5b643171791238c7e845b8faa033ae1874bc04b36106a1745d687591521a09ccdf55a7277b9c144473a7705e3111014847ceb42c0
7
- data.tar.gz: 85e4cb089330099e2cee4c93801bf13a7a0930a6b5ac52c785f4e35357c002f8392b981fc93d838759249676e9f6f4e361afcdbf87ba5d8a6535d6efaa49f911
6
+ metadata.gz: f5f8afde93bbd151bc29b8e28fc38951c75380de3bea39fc85b6df2ddaf5da8cab28bd5e387610298c8cb56bbc2f15ba7db1ec56f6b91cd336f25bdfd160a1d2
7
+ data.tar.gz: 0763e89fb0c282cb7294e02caa355d92ba39acc95c13e8fc7fb4ff39f30652425a0489b11d64a8f8137e611ccf3fb602e15c82b15e644c2d0c30929dcc75d12d
@@ -147,4 +147,17 @@ module Isomorfeus
147
147
  end
148
148
  end
149
149
  end
150
+
151
+ class << self
152
+ def raise_error(error_class: nil, message: nil, stack: nil)
153
+ error_class = RuntimeError unless error_class
154
+ execution_environment = if on_browser? then 'on Browser'
155
+ elsif on_ssr? then 'in Server Side Rendering'
156
+ elsif on_server? then 'on Server'
157
+ end
158
+ error = error_class.new("Isomorfeus in #{env} #{execution_environment}:\n#{message}")
159
+ error.set_backtrace(stack) if stack
160
+ raise error
161
+ end
162
+ end
150
163
  end
@@ -34,7 +34,7 @@ module Isomorfeus
34
34
  end
35
35
  @v = !!@v if @o[:type] == :boolean
36
36
  rescue
37
- raise "#{@c}: #{@p} cast failed" unless @v.class == @o[:class]
37
+ Isomorfeus.raise_error(message: "#{@c}: #{@p} cast failed") unless @v.class == @o[:class]
38
38
  end
39
39
  end
40
40
  end
@@ -54,13 +54,13 @@ module Isomorfeus
54
54
  def type!
55
55
  return if @o[:allow_nil] && @v.nil?
56
56
  if @o.key?(:class)
57
- raise "#{@c}: #{@p} class not #{@o[:class]}" unless @v.class == @o[:class]
57
+ Isomorfeus.raise_error(message: "#{@c}: #{@p} class not #{@o[:class]}") unless @v.class == @o[:class]
58
58
  elsif @o.key?(:is_a)
59
- raise "#{@c}: #{@p} is not a #{@o[:is_a]}" unless @v.is_a?(@o[:is_a])
59
+ Isomorfeus.raise_error(message: "#{@c}: #{@p} is not a #{@o[:is_a]}") unless @v.is_a?(@o[:is_a])
60
60
  elsif @o.key?(:type)
61
61
  case @o[:type]
62
62
  when :boolean
63
- raise "#{@c}: #{@p} is not a boolean" unless @v.class == TrueClass || @v.class == FalseClass
63
+ Isomorfeus.raise_error(message: "#{@c}: #{@p} is not a boolean") unless @v.class == TrueClass || @v.class == FalseClass
64
64
  end
65
65
  end
66
66
  end
@@ -77,48 +77,48 @@ module Isomorfeus
77
77
 
78
78
  # specific validations
79
79
  def c_gt(v)
80
- raise "#{@c}: #{@p} not greater than #{v}!" unless @v > v
80
+ Isomorfeus.raise_error(message: "#{@c}: #{@p} not greater than #{v}!") unless @v > v
81
81
  end
82
82
 
83
83
  def c_lt(v)
84
- raise "#{@c}: #{@p} not less than #{v}!" unless @v < v
84
+ Isomorfeus.raise_error(message: "#{@c}: #{@p} not less than #{v}!") unless @v < v
85
85
  end
86
86
 
87
87
  def c_keys(v)
88
- raise "#{@c}: #{@p} keys dont fit!" unless @v.keys.sort == v.sort
88
+ Isomorfeus.raise_error(message: "#{@c}: #{@p} keys dont fit!") unless @v.keys.sort == v.sort
89
89
  end
90
90
 
91
91
  def c_size(v)
92
- raise "#{@c}: #{@p} length/size is not #{v}" unless @v.size == v
92
+ Isomorfeus.raise_error(message: "#{@c}: #{@p} length/size is not #{v}") unless @v.size == v
93
93
  end
94
94
 
95
95
  def c_matches(v)
96
- raise "#{@c}: #{@p} does not match #{v}" unless v.match?(@v)
96
+ Isomorfeus.raise_error(message: "#{@c}: #{@p} does not match #{v}") unless v.match?(@v)
97
97
  end
98
98
 
99
99
  def c_max(v)
100
- raise "#{@c}: #{@p} is larger than #{v}" unless @v <= v
100
+ Isomorfeus.raise_error(message: "#{@c}: #{@p} is larger than #{v}") unless @v <= v
101
101
  end
102
102
 
103
103
  def c_min(v)
104
- raise "#{@c}: #{@p} is smaller than #{v}" unless @v >= v
104
+ Isomorfeus.raise_error(message: "#{@c}: #{@p} is smaller than #{v}") unless @v >= v
105
105
  end
106
106
 
107
107
  def c_max_size(v)
108
- raise "#{@c}: #{@p} is larger than #{v}" unless @v.size <= v
108
+ Isomorfeus.raise_error(message: "#{@c}: #{@p} is larger than #{v}") unless @v.size <= v
109
109
  end
110
110
 
111
111
  def c_min_size(v)
112
- raise "#{@c}: #{@p} is smaller than #{v}" unless @v.size >= v
112
+ Isomorfeus.raise_error(message: "#{@c}: #{@p} is smaller than #{v}") unless @v.size >= v
113
113
  end
114
114
 
115
115
  def c_direction(v)
116
- raise "#{@c}: #{@p} is positive" if v == :negative && @v >= 0
117
- raise "#{@c}: #{@p} is negative" if v == :positive && @v < 0
116
+ Isomorfeus.raise_error(message: "#{@c}: #{@p} is positive") if v == :negative && @v >= 0
117
+ Isomorfeus.raise_error(message: "#{@c}: #{@p} is negative") if v == :positive && @v < 0
118
118
  end
119
119
 
120
120
  def c_test
121
- raise "#{@c}: #{@p} test condition check failed" unless @o[:test].call(@v)
121
+ Isomorfeus.raise_error(message: "#{@c}: #{@p} test condition check failed") unless @o[:test].call(@v)
122
122
  end
123
123
 
124
124
  def c_sub_type(v)
@@ -35,12 +35,15 @@ module Isomorfeus
35
35
  begin
36
36
  asset = Net::HTTP.get(URI(asset_path))
37
37
  rescue Exception => e
38
- raise "SSR: Failed loading asset #{asset_path} from webpack dev server. Error: #{e.message}"
38
+ Isomorfeus.raise_error(message: "Server Side Rendering: Failed loading asset #{asset_path} from webpack dev server. Error: #{e.message}")
39
+ end
40
+ if asset.strip.start_with?('<')
41
+ Isomorfeus.raise_error(message: "Server Side Rendering: Failed loading asset #{asset_path} from webpack dev server, asset is not javascript. Did the webpack build succeed?")
39
42
  end
40
43
  begin
41
44
  Isomorfeus.ssr_contexts[thread_id_asset] = ExecJS.permissive_compile(asset)
42
45
  rescue Exception => e
43
- raise "SSR: Failed creating context for #{asset_path}. Error: #{e.message}"
46
+ Isomorfeus.raise_error(message: "Server Side Rendering: Failed creating context for #{asset_path}. Error: #{e.message}")
44
47
  end
45
48
  else
46
49
  # initialize speednode context
@@ -58,6 +61,7 @@ module Isomorfeus
58
61
  global.Opal.React.active_components = [];
59
62
  global.Opal.React.active_redux_components = [];
60
63
  global.FirstPassFinished = false;
64
+ global.Exception = false;
61
65
  global.Opal.Isomorfeus['$env=']('#{Isomorfeus.env}');
62
66
  if (typeof global.Opal.Isomorfeus.$negotiated_locale === 'function') {
63
67
  global.Opal.Isomorfeus["$negotiated_locale="]('#{props[:locale]}');
@@ -74,14 +78,18 @@ module Isomorfeus
74
78
  api_ws_path = Isomorfeus.respond_to?(:api_websocket_path) ? Isomorfeus.api_websocket_path : ''
75
79
  transport_ws_url = ws_scheme + location_host + api_ws_path
76
80
  javascript << <<~JAVASCRIPT
77
- var api_ws_path = '#{api_ws_path}';
81
+ let api_ws_path = '#{api_ws_path}';
82
+ let exception;
78
83
  if (typeof global.Opal.Isomorfeus.Transport !== 'undefined' && api_ws_path !== '') {
79
84
  global.Opal.Isomorfeus.TopLevel["$transport_ws_url="]("#{transport_ws_url}");
80
85
  global.Opal.send(global.Opal.Isomorfeus.Transport.$promise_connect(), 'then', [], ($$1 = function(){
81
86
  try {
82
87
  global.Opal.Isomorfeus.TopLevel.$render_component_to_string('#{component_name}', #{Oj.dump(props, mode: :strict)});
83
88
  global.FirstPassFinished = 'transport';
84
- } catch (e) { global.FirstPassFinished = 'transport'; }
89
+ } catch (e) {
90
+ global.Exception = e;
91
+ global.FirstPassFinished = 'transport';
92
+ }
85
93
  }, $$1.$$s = this, $$1.$$arity = 0, $$1))
86
94
  } else { return global.FirstPassFinished = true; };
87
95
  JAVASCRIPT
@@ -91,7 +99,8 @@ module Isomorfeus
91
99
 
92
100
  # wait for first pass to finish
93
101
  unless first_pass_skipped
94
- first_pass_finished = Isomorfeus.ssr_contexts[thread_id_asset].exec('return global.FirstPassFinished')
102
+ first_pass_finished, exception = Isomorfeus.ssr_contexts[thread_id_asset].exec('return [global.FirstPassFinished, global.Exception ? { message: global.Exception.message, stack: global.Exception.stack } : false ]')
103
+ Isomorfeus.raise_error(message: "Server Side Rendering: #{exception['message']}", stack: exception['stack']) if exception
95
104
  unless first_pass_finished
96
105
  start_time = Time.now
97
106
  while !first_pass_finished
@@ -121,6 +130,7 @@ module Isomorfeus
121
130
  global.Opal.React.render_buffer = [];
122
131
  global.Opal.React.active_components = [];
123
132
  global.Opal.React.active_redux_components = [];
133
+ global.Exception = false;
124
134
  let rendered_tree;
125
135
  let ssr_styles;
126
136
  let component;
@@ -135,7 +145,7 @@ module Isomorfeus
135
145
  rendered_tree = global.Opal.global.ReactDOMServer.renderToString(sheets.collect(app));
136
146
  ssr_styles = sheets.toString();
137
147
  } catch (e) {
138
- rendered_tree = e.message + "\\n" + e.stack;
148
+ global.Exception = e;
139
149
  }
140
150
  } else if (typeof global.Opal.global.ReactJSS !== 'undefined' && typeof global.Opal.global.ReactJSS.SheetsRegistry !== 'undefined') {
141
151
  component = '#{component_name}'.split(".").reduce(function(o, x) {
@@ -150,26 +160,26 @@ module Isomorfeus
150
160
  rendered_tree = global.Opal.global.ReactDOMServer.renderToString(element);
151
161
  ssr_styles = sheets.toString();
152
162
  } catch (e) {
153
- rendered_tree = e.message + "\\n" + e.stack;
163
+ global.Exception = e;
154
164
  }
155
165
  } else {
156
166
  try {
157
167
  rendered_tree = global.Opal.Isomorfeus.TopLevel.$render_component_to_string('#{component_name}', #{Oj.dump(props, mode: :strict)});
158
168
  } catch (e) {
159
- rendered_tree = e.message + "\\n" + e.stack;
169
+ global.Exception = e;
160
170
  }
161
171
  }
162
172
  let application_state = global.Opal.Isomorfeus.store.native.getState();
163
173
  if (typeof global.Opal.Isomorfeus.Transport !== 'undefined') { global.Opal.Isomorfeus.Transport.$disconnect(); }
164
- return [rendered_tree, application_state, ssr_styles, global.Opal.Isomorfeus['$ssr_response_status']()];
174
+ return [rendered_tree, application_state, ssr_styles, global.Opal.Isomorfeus['$ssr_response_status'](), global.Exception ? { message: global.Exception.message, stack: global.Exception.stack } : false];
165
175
  JAVASCRIPT
166
176
 
167
177
  # execute second render pass
168
- rendered_tree, application_state, @ssr_styles, @ssr_response_status = Isomorfeus.ssr_contexts[thread_id_asset].exec(javascript)
178
+ rendered_tree, application_state, @ssr_styles, @ssr_response_status, exception = Isomorfeus.ssr_contexts[thread_id_asset].exec(javascript)
179
+ Isomorfeus.raise_error(message: "Server Side Rendering: #{exception['message']}", stack: exception['stack']) if exception
169
180
 
170
181
  # build result
171
182
  render_result << " data-iso-hydrated='true'" if rendered_tree
172
- # render_result << " data-iso-nloc='#{props[:locale]}' data-iso-state='#{Oj.dump(application_state, mode: :strict)}'>"
173
183
  render_result << " data-iso-nloc='#{props[:locale]}'>"
174
184
  render_result << (rendered_tree ? rendered_tree : "SSR didn't work")
175
185
  else
@@ -5,7 +5,7 @@ module Isomorfeus
5
5
  Isomorfeus.init
6
6
  Isomorfeus::TopLevel.on_ready do
7
7
  root_element = `document.querySelector('div[data-iso-root]')`
8
- raise "Isomorfeus root element not found!" unless root_element
8
+ Isomorfeus.raise_error(message: "Isomorfeus root element not found!") unless root_element
9
9
  component_name = root_element.JS.getAttribute('data-iso-root')
10
10
  Isomorfeus.env = root_element.JS.getAttribute('data-iso-env')
11
11
  component = nil
@@ -71,7 +71,6 @@ if RUBY_ENGINE == 'opal'
71
71
  require 'react/component/location'
72
72
  require 'react/component/history'
73
73
  require 'react/component/resolution'
74
- require 'react/component/event_handler'
75
74
  require 'react/component/styles'
76
75
  require 'react/component/mixin'
77
76
  require 'react/component/base'
@@ -5,7 +5,6 @@ module LucidApp
5
5
  base.extend(::LucidApp::NativeLucidComponentConstructor)
6
6
  base.extend(::LucidApp::NativeComponentConstructor)
7
7
  base.extend(::LucidPropDeclaration::Mixin)
8
- base.extend(::React::Component::EventHandler)
9
8
  base.extend(::LucidComponent::EnvironmentSupport)
10
9
  base.include(::LucidComponent::EnvironmentSupport)
11
10
  base.include(::React::Component::Elements)
@@ -32,10 +32,6 @@ module LucidApp
32
32
  this.state.component_state = {};
33
33
  this.state.component_state[this.__object_id] = {};
34
34
  };
35
- var event_handlers = #{base.event_handlers};
36
- for (var i = 0; i < event_handlers.length; i++) {
37
- this[event_handlers[i]] = this[event_handlers[i]].bind(this);
38
- }
39
35
  var defined_refs = #{base.defined_refs};
40
36
  for (var ref in defined_refs) {
41
37
  if (defined_refs[ref] != null) {
@@ -5,7 +5,6 @@ module LucidComponent
5
5
  base.extend(::LucidComponent::NativeLucidComponentConstructor)
6
6
  base.extend(::LucidComponent::NativeComponentConstructor)
7
7
  base.extend(::LucidPropDeclaration::Mixin)
8
- base.extend(::React::Component::EventHandler)
9
8
  base.extend(::LucidComponent::EnvironmentSupport)
10
9
  base.include(::LucidComponent::EnvironmentSupport)
11
10
  base.include(::React::Component::Elements)
@@ -22,10 +22,6 @@ module LucidComponent
22
22
  this.state.component_state = {};
23
23
  this.state.component_state[this.__object_id] = {};
24
24
  };
25
- var event_handlers = #{base.event_handlers};
26
- for (var i = 0; i < event_handlers.length; i++) {
27
- this[event_handlers[i]] = this[event_handlers[i]].bind(this);
28
- }
29
25
  var defined_refs = #{base.defined_refs};
30
26
  for (var ref in defined_refs) {
31
27
  if (defined_refs[ref] != null) {
@@ -6,14 +6,6 @@ module LucidFunc
6
6
  @app_store = LucidComponent::AppStoreProxy.new(self)
7
7
  @class_store = LucidComponent::ClassStoreProxy.new(self)
8
8
  @store = LucidComponent::InstanceStoreProxy.new(self)
9
- event_handlers = self.class.event_handlers
10
- event_handler_source = self.class
11
- %x{
12
- for (var i = 0; i < event_handlers.length; i++) {
13
- self[event_handlers[i]] = event_handler_source[event_handlers[i]];
14
- self[event_handlers[i]] = self[event_handlers[i]].bind(self);
15
- }
16
- }
17
9
  end
18
10
  end
19
11
  end
@@ -5,7 +5,6 @@ module LucidFunc
5
5
  base.include(::React::Component::Features)
6
6
  base.include(::LucidFunc::Initializer)
7
7
  base.include(::React::FunctionComponent::Api)
8
- base.extend(::React::FunctionComponent::EventHandler)
9
8
  base.extend(::LucidComponent::EnvironmentSupport)
10
9
  base.include(::LucidComponent::EnvironmentSupport)
11
10
  base.extend(::LucidFunc::NativeComponentConstructor)
@@ -66,7 +66,7 @@ module React
66
66
  block.$call();
67
67
  // console.log("get_react_element popping", Opal.React.render_buffer, Opal.React.render_buffer.toString())
68
68
  let new_element = Opal.React.render_buffer[Opal.React.render_buffer.length - 1].pop();
69
- if (last_buffer_element === new_element) { #{raise "Block did not create any React element!"} }
69
+ if (last_buffer_element === new_element) { #{Isomorfeus.raise_error(message: "Block did not create any React element!")} }
70
70
  return new_element;
71
71
  }
72
72
  else
@@ -86,6 +86,16 @@ module React
86
86
  end
87
87
  alias rre render_react_element
88
88
 
89
+ def method_ref(method_symbol)
90
+ %x{
91
+ if (#{self}.method_refs && #{self}.method_refs[#{method_symbol}]) { return #{self}.method_refs[#{method_symbol}]; }
92
+ if (!#{self}.method_refs) { #{self}.method_refs = {}; }
93
+ #{self}.method_refs[#{method_symbol}] = #{method(method_symbol)};
94
+ return #{self}.method_refs[#{method_symbol}];
95
+ }
96
+ end
97
+ alias m_ref method_ref
98
+
89
99
  def to_n
90
100
  self
91
101
  end
@@ -4,14 +4,6 @@ module React
4
4
  def initialize
5
5
  self.JS[:native_props] = `{ props: null }`
6
6
  @native_props = ::React::Component::Props.new(self)
7
- event_handlers = self.class.event_handlers
8
- event_handler_source = self.class
9
- %x{
10
- for (var i = 0; i < event_handlers.length; i++) {
11
- self[event_handlers[i]] = event_handler_source[event_handlers[i]];
12
- self[event_handlers[i]] = self[event_handlers[i]].bind(self);
13
- }
14
- }
15
7
  end
16
8
  end
17
9
  end
@@ -6,7 +6,6 @@ module React
6
6
  base.include(::React::Component::Features)
7
7
  base.include(::React::FunctionComponent::Initializer)
8
8
  base.include(::React::FunctionComponent::Api)
9
- base.extend(::React::FunctionComponent::EventHandler)
10
9
  base.extend(::React::FunctionComponent::NativeComponentConstructor)
11
10
  end
12
11
  end
@@ -6,7 +6,6 @@ module React
6
6
  base.include(::React::Component::Features)
7
7
  base.include(::React::FunctionComponent::Initializer)
8
8
  base.include(::React::FunctionComponent::Api)
9
- base.extend(::React::FunctionComponent::EventHandler)
10
9
  base.extend(::React::MemoComponent::NativeComponentConstructor)
11
10
  end
12
11
  end
@@ -6,7 +6,6 @@ module LucidMaterial
6
6
  base.extend(::LucidApp::NativeLucidComponentConstructor)
7
7
  base.extend(::LucidMaterial::App::NativeComponentConstructor)
8
8
  base.extend(::LucidPropDeclaration::Mixin)
9
- base.extend(::React::Component::EventHandler)
10
9
  base.extend(::LucidComponent::EnvironmentSupport)
11
10
  base.include(::LucidComponent::EnvironmentSupport)
12
11
  base.include(::React::Component::Elements)
@@ -6,7 +6,6 @@ module LucidMaterial
6
6
  base.extend(::LucidComponent::NativeLucidComponentConstructor)
7
7
  base.extend(::LucidMaterial::Component::NativeComponentConstructor)
8
8
  base.extend(::LucidPropDeclaration::Mixin)
9
- base.extend(::React::Component::EventHandler)
10
9
  base.extend(::LucidComponent::EnvironmentSupport)
11
10
  base.include(::LucidComponent::EnvironmentSupport)
12
11
  base.include(::React::Component::Elements)
@@ -6,7 +6,6 @@ module LucidMaterial
6
6
  base.include(::React::Component::Features)
7
7
  base.include(::LucidFunc::Initializer)
8
8
  base.include(::React::FunctionComponent::Api)
9
- base.extend(::React::FunctionComponent::EventHandler)
10
9
  base.extend(::LucidComponent::EnvironmentSupport)
11
10
  base.include(::LucidComponent::EnvironmentSupport)
12
11
  base.extend(::LucidMaterial::Func::NativeComponentConstructor)
@@ -78,7 +78,7 @@ module LucidPropDeclaration
78
78
  props = {} unless props
79
79
  declared_props.each_key do |prop|
80
80
  if declared_props[prop].key?(:required) && declared_props[prop][:required] && !props.key?(prop)
81
- raise "Required prop #{prop} not given!"
81
+ Isomorfeus.raise_error(message: "Required prop #{prop} not given!")
82
82
  end
83
83
  end
84
84
  result = true
@@ -86,7 +86,7 @@ module React
86
86
  block.$call();
87
87
  // console.log("get_react_element popping", Opal.React.render_buffer, Opal.React.render_buffer.toString())
88
88
  let new_element = Opal.React.render_buffer[Opal.React.render_buffer.length - 1].pop();
89
- if (last_buffer_element === new_element) { #{raise "Block did not create any React element!"} }
89
+ if (last_buffer_element === new_element) { #{Isomorfeus.raise_error(message: "Block did not create any React element!")} }
90
90
  return new_element;
91
91
  }
92
92
  else
@@ -106,6 +106,7 @@ module React
106
106
  return #@native.method_refs[#{method_symbol}];
107
107
  }
108
108
  end
109
+ alias m_ref method_ref
109
110
 
110
111
  def render_react_element(el)
111
112
  # push el to buffer
@@ -5,7 +5,6 @@ module React
5
5
  base.include(::Native::Wrapper)
6
6
  base.extend(::React::Component::NativeComponentConstructor)
7
7
  base.extend(::LucidPropDeclaration::Mixin)
8
- base.extend(::React::Component::EventHandler)
9
8
  base.include(::React::Component::Elements)
10
9
  base.include(::React::Component::Api)
11
10
  base.include(::React::Component::Callbacks)
@@ -17,10 +17,6 @@ module React
17
17
  this.state = {};
18
18
  };
19
19
  this.__ruby_instance = base.$new(this);
20
- var event_handlers = #{base.event_handlers};
21
- for (var i = 0; i < event_handlers.length; i++) {
22
- this[event_handlers[i]] = this[event_handlers[i]].bind(this);
23
- }
24
20
  var defined_refs = #{base.defined_refs};
25
21
  for (var ref in defined_refs) {
26
22
  if (defined_refs[ref] != null) {
@@ -22,7 +22,7 @@ module React
22
22
  if (component) {
23
23
  return Opal.React.internal_prepare_args_and_render(component, args, block);
24
24
  } else {
25
- #{raise NameError, "No such native Component #@const_name.#{name}"};
25
+ #{Isomorfeus.raise_error(error_class: NameError, message: "No such native Component #@const_name.#{name}")};
26
26
  }
27
27
  }
28
28
  end
data/lib/react/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module React
2
- VERSION = '16.12.11'
2
+ VERSION = '16.12.12'
3
3
  end
data/lib/react.rb CHANGED
@@ -37,17 +37,62 @@ module React
37
37
  key = keys[i];
38
38
  if (key[0] === 'o' && key[1] === 'n' && key[2] === '_') {
39
39
  let handler = ruby_style_props['$[]'](key);
40
- if (typeof handler === "function") {
40
+ let type = typeof handler;
41
+ if (type === "function") {
41
42
  let active_c = self.active_component();
42
43
  result[Opal.React.lower_camelize(key)] = function(event, info) {
43
44
  let ruby_event;
44
45
  if (typeof event === "object") { #{ruby_event = ::React::SyntheticEvent.new(`event`)}; }
45
- else { #{ruby_event = `event`}; }
46
+ else { ruby_event = event; }
46
47
  #{`active_c.__ruby_instance`.instance_exec(ruby_event, `info`, &`handler`)};
47
48
  }
49
+ } else if (type === "object" && typeof handler.$call === "function" ) {
50
+ if (!handler.react_event_handler_function) {
51
+ handler.react_event_handler_function = function(event, info) {
52
+ let ruby_event;
53
+ if (typeof event === "object") { #{ruby_event = ::React::SyntheticEvent.new(`event`)}; }
54
+ else { ruby_event = event; }
55
+ handler.$call(ruby_event, `info`)
56
+ };
57
+ }
58
+ result[Opal.React.lower_camelize(key)] = handler.react_event_handler_function;
59
+ } else if (type === "string" ) {
60
+ let active_component = Opal.React.active_component();
61
+ let method_ref;
62
+ let method_name = '$' + handler;
63
+ if (typeof active_component[method_name] === "function") {
64
+ // got a ruby instance
65
+ if (active_component.native && active_component.native.method_refs && active_component.native.method_refs[handler]) { method_ref = active_component.native.method_refs[handler]; } // ruby instance with native
66
+ else if (active_component.method_refs && active_component.method_refs[handler]) { method_ref = active_component.method_refs[handler]; } // ruby function component
67
+ else { method_ref = active_component.$method_ref(handler); } // create the ref
68
+ } else if (typeof active_component.__ruby_instance[method_name] === "function") {
69
+ // got a native instance
70
+ if (active_component.method_refs && active_component.method_refs[handler]) { method_ref = active_component.method_refs[handler]; }
71
+ else { method_ref = active_component.__ruby_instance.$method_ref(handler); } // create ref for native
72
+ }
73
+ if (method_ref) {
74
+ if (!method_ref.react_event_handler_function) {
75
+ method_ref.react_event_handler_function = function(event, info) {
76
+ let ruby_event;
77
+ if (typeof event === "object") { #{ruby_event = ::React::SyntheticEvent.new(`event`)}; }
78
+ else { ruby_event = event; }
79
+ method_ref.$call(ruby_event, `info`)
80
+ };
81
+ }
82
+ result[Opal.React.lower_camelize(key)] = method_ref.react_event_handler_function;
83
+ } else {
84
+ let component_name;
85
+ if (active_component.__ruby_instance) { component_name = active_component.__ruby_instance.$to_s(); }
86
+ else { component_name = active_component.$to_s(); }
87
+ #{Isomorfeus.raise_error(message: "Is #{`handler`} a valid method of #{`component_name`}? If so then please use: #{`key`}: method_ref(:#{`handler`}) within component: #{`component_name`}")}
88
+ }
48
89
  } else {
49
90
  let active_component = Opal.React.active_component();
50
- result[Opal.React.lower_camelize(key)] = active_component[handler];
91
+ let component_name;
92
+ if (active_component.__ruby_instance) { component_name = active_component.__ruby_instance.$to_s(); }
93
+ else { component_name = active_component.$to_s(); }
94
+ #{Isomorfeus.raise_error(message: "Received invalid value for #{`key`} with #{`handler`} within component: #{`component_name`}")}
95
+ console.error( + key + " event handler:", handler, " within component:", self.active_component());
51
96
  }
52
97
  } else if (key[0] === 'a' && key.startsWith("aria_")) {
53
98
  result[key.replace("_", "-")] = ruby_style_props['$[]'](key);
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isomorfeus-react
3
3
  version: !ruby/object:Gem::Version
4
- version: 16.12.11
4
+ version: 16.12.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Biedermann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-20 00:00:00.000000000 Z
11
+ date: 2020-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -228,7 +228,6 @@ files:
228
228
  - lib/isomorfeus_react/lucid_func/native_component_constructor.rb
229
229
  - lib/isomorfeus_react/react/function_component/api.rb
230
230
  - lib/isomorfeus_react/react/function_component/base.rb
231
- - lib/isomorfeus_react/react/function_component/event_handler.rb
232
231
  - lib/isomorfeus_react/react/function_component/initializer.rb
233
232
  - lib/isomorfeus_react/react/function_component/mixin.rb
234
233
  - lib/isomorfeus_react/react/function_component/native_component_constructor.rb
@@ -253,7 +252,6 @@ files:
253
252
  - lib/react/component/base.rb
254
253
  - lib/react/component/callbacks.rb
255
254
  - lib/react/component/elements.rb
256
- - lib/react/component/event_handler.rb
257
255
  - lib/react/component/features.rb
258
256
  - lib/react/component/history.rb
259
257
  - lib/react/component/initializer.rb
@@ -277,7 +275,13 @@ licenses:
277
275
  - MIT
278
276
  metadata:
279
277
  github_repo: ssh://github.com/isomorfeus/gems
280
- post_install_message:
278
+ post_install_message: |2+
279
+
280
+ isomorfeus-react 16.12.12:
281
+ Breaking change:
282
+ The event_handler DSL is gone. Instead use normal methods and method_ref, see:
283
+ https://github.com/isomorfeus/isomorfeus-react/blob/master/ruby/docs/events.md
284
+
281
285
  rdoc_options: []
282
286
  require_paths:
283
287
  - lib
@@ -1,21 +0,0 @@
1
- module React
2
- module FunctionComponent
3
- module EventHandler
4
- def event_handlers
5
- @event_handlers ||= []
6
- end
7
-
8
- def event_handler(name, &block)
9
- event_handlers << name
10
- %x{
11
- var fun = function(event, info) {
12
- if (typeof event === "object") { #{ruby_event = ::React::SyntheticEvent.new(`event`)}; }
13
- else { #{ruby_event = `event`}; }
14
- #{`this`.instance_exec(ruby_event, `info`, &block)};
15
- }
16
- self[name] = fun;
17
- }
18
- end
19
- end
20
- end
21
- end
@@ -1,23 +0,0 @@
1
- module React
2
- module Component
3
- module EventHandler
4
- def event_handlers
5
- @event_handlers ||= []
6
- end
7
-
8
- def event_handler(name, &block)
9
- event_handlers << name
10
- %x{
11
- var fun = function(event, info) {
12
- let ruby_event;
13
- if (typeof event === "object") { #{ruby_event = ::React::SyntheticEvent.new(`event`)}; }
14
- else { #{ruby_event = `event`}; }
15
- #{`this.__ruby_instance`.instance_exec(ruby_event, `info`, &block)};
16
- }
17
- if (self.lucid_react_component) { self.lucid_react_component.prototype[name] = fun; }
18
- else { self.react_component.prototype[name] = fun; }
19
- }
20
- end
21
- end
22
- end
23
- end