isomorfeus-react 16.10.11 → 16.10.12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b582b0caa6641807ee00e77f9436a833bd0c2953352e600074d1c93e13acd87c
4
- data.tar.gz: 7b8a12ecb6b899f1322f77fb57174a730fd3ddbc102dc2c19bf031ac346e250e
3
+ metadata.gz: 212995320dc44b1d0044e78018b806842eac6f3a9e9de729276cfdece8678547
4
+ data.tar.gz: c1b472d9c8e77c452d2f6ebdd479afe798e1a4a6b51e3e7d544066331369be4f
5
5
  SHA512:
6
- metadata.gz: 1a0a4782ac893e043a5d5011960bd7c6187fa03aabf5a881ca2df185aafaafe763799b6ce918b56d2db6339aaa97683e3c7804b29de1811e5ecf6dbf4a43ad97
7
- data.tar.gz: 71c749cd488daff5527daed9c54c7db114dde2b9568b032a0db9e07be56c91f8cd0f937c720bf314ee6800102318f132fa0c0d597be50e2bb671e0ef1e4905df
6
+ metadata.gz: '00188bcb28282e7ad13198b3b0e3bf2d1faa28895df3a4488e51cb068adbcc27a033fa41c20243f6278b74cd31bdb885b31c793d022c5db841945031d14cd36d'
7
+ data.tar.gz: 56313a58b6a58c0c76e01f0e9844555842ce22c28db06f778615ee6d7c38b0326bfa2c57d71171f2a4d0c43447b64971b93e20fc738bc0df15c47fe92fec7318
@@ -85,6 +85,7 @@ if RUBY_ENGINE == 'opal'
85
85
  LucidApp::Context.create_application_context
86
86
 
87
87
  # LucidComponent
88
+ require 'lucid_component/environment_support'
88
89
  require 'lucid_component/styles_support'
89
90
  require 'lucid_component/store_api'
90
91
  require 'lucid_component/app_store_defaults'
@@ -95,7 +96,7 @@ if RUBY_ENGINE == 'opal'
95
96
  require 'lucid_component/instance_store_proxy'
96
97
  require 'lucid_component/initializer'
97
98
  require 'lucid_component/native_component_constructor'
98
- require 'lucid_component/event_handler'
99
+ require 'lucid_component/preloading_support'
99
100
  require 'lucid_component/mixin'
100
101
  require 'lucid_component/base'
101
102
 
@@ -123,11 +124,9 @@ else
123
124
 
124
125
  Isomorfeus.env = ENV['RACK_ENV']
125
126
 
126
- if Isomorfeus.production? || Isomorfeus.test?
127
- Isomorfeus.server_side_rendering = true
128
- else
129
- Isomorfeus.server_side_rendering = false
130
- end
127
+ require 'net/http' if Isomorfeus.development?
128
+
129
+ Isomorfeus.server_side_rendering = true
131
130
 
132
131
  require 'isomorfeus/react_view_helper'
133
132
 
@@ -7,15 +7,32 @@ module Isomorfeus
7
7
  render_result = "<div data-iso-env=\"#{Isomorfeus.env}\" data-iso-root=\"#{component_name}\" data-iso-props='#{Oj.dump(props, mode: :strict)}'"
8
8
  if Isomorfeus.server_side_rendering
9
9
 
10
- # initialize speednode context
11
- unless Isomorfeus.ssr_contexts.key?(thread_id_asset)
12
- asset_file_name = OpalWebpackLoader::Manifest.lookup_path_for(asset)
13
- asset_path = File.join('public', asset_file_name)
14
- Isomorfeus.ssr_contexts[thread_id_asset] = ExecJS.permissive_compile(File.read(asset_path))
10
+ if Isomorfeus.development?
11
+ # always create a new context, effectively reloading code
12
+ # delete the existing context first, saves memory
13
+ if Isomorfeus.ssr_contexts.key?(thread_id_asset)
14
+ uuid = Isomorfeus.ssr_contexts[thread_id_asset].instance_variable_get(:@uuid)
15
+ runtime = Isomorfeus.ssr_contexts[thread_id_asset].instance_variable_get(:@runtime)
16
+ runtime.vm.delete_context(uuid)
17
+ end
18
+ asset_path = "#{OpalWebpackLoader.client_asset_path}#{asset}"
19
+ asset = Net::HTTP.get(URI(asset_path))
20
+ Isomorfeus.ssr_contexts[thread_id_asset] = ExecJS.permissive_compile(asset)
21
+ else
22
+ # initialize speednode context
23
+ unless Isomorfeus.ssr_contexts.key?(thread_id_asset)
24
+ asset_file_name = OpalWebpackLoader::Manifest.lookup_path_for(asset)
25
+ asset_path = File.join('public', asset_file_name)
26
+ Isomorfeus.ssr_contexts[thread_id_asset] = ExecJS.permissive_compile(File.read(asset_path))
27
+ end
15
28
  end
16
29
 
17
30
  # build javascript for rendering first pass
31
+ # it will initialize buffers to guard against leaks, maybe caused by previous exceptions
18
32
  javascript = <<~JAVASCRIPT
33
+ global.Opal.React.render_buffer = [];
34
+ global.Opal.React.active_components = [];
35
+ global.Opal.React.active_redux_components = [];
19
36
  global.FirstPassFinished = false;
20
37
  global.Opal.Isomorfeus['$env=']('#{Isomorfeus.env}');
21
38
  if (typeof global.Opal.Isomorfeus.$negotiated_locale === 'function') {
@@ -74,7 +91,11 @@ module Isomorfeus
74
91
  end
75
92
 
76
93
  # build javascript for second render pass
94
+ # guard against leaks from first pass, maybe because of a exception
77
95
  javascript = <<~JAVASCRIPT
96
+ global.Opal.React.render_buffer = [];
97
+ global.Opal.React.active_components = [];
98
+ global.Opal.React.active_redux_components = [];
78
99
  let rendered_tree;
79
100
  let ssr_styles;
80
101
  let component;
@@ -4,7 +4,10 @@ module LucidApp
4
4
  base.include(::Native::Wrapper)
5
5
  base.extend(::LucidApp::NativeComponentConstructor)
6
6
  base.extend(::LucidPropDeclaration::Mixin)
7
- base.extend(::LucidComponent::EventHandler)
7
+ base.extend(::React::Component::EventHandler)
8
+ base.extend(::LucidComponent::PreloadingSupport)
9
+ base.extend(::LucidComponent::EnvironmentSupport)
10
+ base.include(::LucidComponent::EnvironmentSupport)
8
11
  base.include(::React::Component::Elements)
9
12
  base.include(::React::Component::API)
10
13
  base.include(::React::Component::Callbacks)
@@ -63,7 +63,9 @@ module LucidApp
63
63
  // console.log("lucid app pushed", Opal.React.render_buffer, Opal.React.render_buffer.toString());
64
64
  Opal.React.active_components.push(this);
65
65
  Opal.React.active_redux_components.push(this.__ruby_instance);
66
- let block_result = #{`this.__ruby_instance`.instance_exec(&`base.render_block`)};
66
+ let block_result;
67
+ if (base.preload_block && !this.state.preloaded && base.while_loading_block) { block_result = #{`this.__ruby_instance`.instance_exec(&`base.while_loading_block`)}; }
68
+ else { block_result = #{`this.__ruby_instance`.instance_exec(&`base.render_block`)}; }
67
69
  if (block_result && (block_result.constructor === String || block_result.constructor === Number)) { Opal.React.render_buffer[Opal.React.render_buffer.length - 1].push(block_result); }
68
70
  Opal.React.active_redux_components.pop();
69
71
  Opal.React.active_components.pop();
@@ -87,18 +89,19 @@ module LucidApp
87
89
  return null;
88
90
  }
89
91
  }
92
+ base.preload_block = null;
93
+ base.while_loading_block = null;
90
94
  base.jss_styles = null;
91
- base.jss_styles_used = null;
92
95
  base.jss_theme = {};
93
96
  base.use_styles = null;
94
97
  base.themed_react_component = function(props) {
95
98
  let classes = null;
96
99
  let theme = Opal.global.ReactJSS.useTheme();
97
100
  if (base.jss_styles) {
98
- if (!base.use_styles || (Opal.Isomorfeus.development && !Object.is(base.jss_styles, base.jss_styles_used))) {
99
- base.jss_styles_used = base.jss_styles;
100
- let styles = base.jss_styles
101
- if (typeof styles === 'function') { styles = styles(theme); }
101
+ if (!base.use_styles || (Opal.Isomorfeus.development && Opal.Isomorfeus.development !== nil)) {
102
+ let styles;
103
+ if (typeof base.jss_styles === 'function') { styles = base.jss_styles(theme); }
104
+ else { styles = base.jss_styles; }
102
105
  base.use_styles = Opal.global.ReactJSS.createUseStyles(styles);
103
106
  }
104
107
  classes = base.use_styles();
@@ -0,0 +1,11 @@
1
+ module LucidComponent
2
+ module EnvironmentSupport
3
+ def on_browser?
4
+ Isomorfeus.on_browser?
5
+ end
6
+
7
+ def on_ssr?
8
+ Isomorfeus.on_ssr?
9
+ end
10
+ end
11
+ end
@@ -4,7 +4,10 @@ module LucidComponent
4
4
  base.include(::Native::Wrapper)
5
5
  base.extend(::LucidComponent::NativeComponentConstructor)
6
6
  base.extend(::LucidPropDeclaration::Mixin)
7
- base.extend(::LucidComponent::EventHandler)
7
+ base.extend(::React::Component::EventHandler)
8
+ base.extend(::LucidComponent::PreloadingSupport)
9
+ base.extend(::LucidComponent::EnvironmentSupport)
10
+ base.include(::LucidComponent::EnvironmentSupport)
8
11
  base.include(::React::Component::Elements)
9
12
  base.include(::React::Component::API)
10
13
  base.include(::React::Component::Callbacks)
@@ -50,7 +50,9 @@ module LucidComponent
50
50
  // console.log("lucid component pushed", Opal.React.render_buffer, Opal.React.render_buffer.toString());
51
51
  Opal.React.active_components.push(this);
52
52
  Opal.React.active_redux_components.push(this);
53
- let block_result = #{`this.__ruby_instance`.instance_exec(&`base.render_block`)};
53
+ let block_result;
54
+ if (base.preload_block && !this.state.preloaded && base.while_loading_block) { block_result = #{`this.__ruby_instance`.instance_exec(&`base.while_loading_block`)}; }
55
+ else { block_result = #{`this.__ruby_instance`.instance_exec(&`base.render_block`)}; }
54
56
  if (block_result && (block_result.constructor === String || block_result.constructor === Number)) { Opal.React.render_buffer[Opal.React.render_buffer.length - 1].push(block_result); }
55
57
  Opal.React.active_redux_components.pop();
56
58
  Opal.React.active_components.pop();
@@ -94,8 +96,9 @@ module LucidComponent
94
96
  return null;
95
97
  }
96
98
  }
99
+ base.preload_block = null;
100
+ base.while_loading_block = null;
97
101
  base.jss_styles = null;
98
- base.jss_styles_used = null;
99
102
  base.use_styles = null;
100
103
  base.store_updates = true;
101
104
  base.react_component = function(props) {
@@ -104,10 +107,10 @@ module LucidComponent
104
107
  if (base.store_updates) { store = Opal.global.React.useContext(Opal.global.LucidApplicationContext); }
105
108
  let theme = Opal.global.ReactJSS.useTheme();
106
109
  if (base.jss_styles) {
107
- if (!base.use_styles || (Opal.Isomorfeus.development && !Object.is(base.jss_styles, base.jss_styles_used))) {
108
- base.jss_styles_used = base.jss_styles;
109
- let styles = base.jss_styles
110
- if (typeof styles === 'function') { styles = base.jss_styles(theme); }
110
+ if (!base.use_styles || (Opal.Isomorfeus.development && Opal.Isomorfeus.development !== nil)) {
111
+ let styles;
112
+ if (typeof base.jss_styles === 'function') { styles = base.jss_styles(theme); }
113
+ else { styles = base.jss_styles; }
111
114
  base.use_styles = Opal.global.ReactJSS.createUseStyles(styles);
112
115
  }
113
116
  classes = base.use_styles();
@@ -0,0 +1,16 @@
1
+ module LucidComponent
2
+ module PreloadingSupport
3
+ def preload(&block)
4
+ `self.preload_block = block`
5
+ component_did_mount do
6
+ instance_exec(&self.class().JS[:preload_block]).then do
7
+ set_state({preloaded: true})
8
+ end
9
+ end
10
+ end
11
+
12
+ def while_loading(&block)
13
+ `self.while_loading_block = block`
14
+ end
15
+ end
16
+ end
@@ -5,7 +5,10 @@ module LucidMaterial
5
5
  base.include(::Native::Wrapper)
6
6
  base.extend(::LucidMaterial::App::NativeComponentConstructor)
7
7
  base.extend(::LucidPropDeclaration::Mixin)
8
- base.extend(::LucidComponent::EventHandler)
8
+ base.extend(::React::Component::EventHandler)
9
+ base.extend(::LucidComponent::PreloadingSupport)
10
+ base.extend(::LucidComponent::EnvironmentSupport)
11
+ base.include(::LucidComponent::EnvironmentSupport)
9
12
  base.include(::React::Component::Elements)
10
13
  base.include(::React::Component::API)
11
14
  base.include(::React::Component::Callbacks)
@@ -64,7 +64,9 @@ module LucidMaterial
64
64
  // console.log("material app pushed", Opal.React.render_buffer, Opal.React.render_buffer.toString());
65
65
  Opal.React.active_components.push(this);
66
66
  Opal.React.active_redux_components.push(this.__ruby_instance);
67
- let block_result = #{`this.__ruby_instance`.instance_exec(&`base.render_block`)};
67
+ let block_result;
68
+ if (base.preload_block && !this.state.preloaded && base.while_loading_block) { block_result = #{`this.__ruby_instance`.instance_exec(&`base.while_loading_block`)}; }
69
+ else { block_result = #{`this.__ruby_instance`.instance_exec(&`base.render_block`)}; }
68
70
  if (block_result && (block_result.constructor === String || block_result.constructor === Number)) { Opal.React.render_buffer[Opal.React.render_buffer.length - 1].push(block_result); }
69
71
  Opal.React.active_redux_components.pop();
70
72
  Opal.React.active_components.pop();
@@ -88,18 +90,19 @@ module LucidMaterial
88
90
  return null;
89
91
  }
90
92
  }
93
+ base.preload_block = null;
94
+ base.while_loading_block = null;
91
95
  base.jss_styles = null;
92
- base.jss_styles_used = null;
93
96
  base.jss_theme = Opal.global.Mui.createMuiTheme();
94
97
  base.use_styles = null;
95
98
  base.themed_react_component = function(props) {
96
99
  let classes = null;
97
100
  let theme = Opal.global.MuiStyles.useTheme();
98
101
  if (base.jss_styles) {
99
- if (!base.use_styles || (Opal.Isomorfeus.development && !Object.is(base.jss_styles, base.jss_styles_used))) {
100
- base.jss_styles_used = base.jss_styles;
101
- let styles = base.jss_styles
102
- if (typeof styles === 'function') { styles = styles(theme); }
102
+ if (!base.use_styles || (Opal.Isomorfeus.development && Opal.Isomorfeus.development !== nil)) {
103
+ let styles;
104
+ if (typeof base.jss_styles === 'function') { styles = base.jss_styles(theme); }
105
+ else { styles = base.jss_styles; }
103
106
  base.use_styles = Opal.global.MuiStyles.makeStyles(styles);
104
107
  }
105
108
  classes = base.use_styles();
@@ -5,7 +5,10 @@ module LucidMaterial
5
5
  base.include(::Native::Wrapper)
6
6
  base.extend(::LucidMaterial::Component::NativeComponentConstructor)
7
7
  base.extend(::LucidPropDeclaration::Mixin)
8
- base.extend(::LucidComponent::EventHandler)
8
+ base.extend(::React::Component::EventHandler)
9
+ base.extend(::LucidComponent::PreloadingSupport)
10
+ base.extend(::LucidComponent::EnvironmentSupport)
11
+ base.include(::LucidComponent::EnvironmentSupport)
9
12
  base.include(::React::Component::Elements)
10
13
  base.include(::React::Component::API)
11
14
  base.include(::React::Component::Callbacks)
@@ -17,4 +20,4 @@ module LucidMaterial
17
20
  end
18
21
  end
19
22
  end
20
- end
23
+ end
@@ -51,7 +51,9 @@ module LucidMaterial
51
51
  // console.log("material component pushed", Opal.React.render_buffer, Opal.React.render_buffer.toString());
52
52
  Opal.React.active_components.push(this);
53
53
  Opal.React.active_redux_components.push(this);
54
- let block_result = #{`this.__ruby_instance`.instance_exec(&`base.render_block`)};
54
+ let block_result;
55
+ if (base.preload_block && !this.state.preloaded && base.while_loading_block) { block_result = #{`this.__ruby_instance`.instance_exec(&`base.while_loading_block`)}; }
56
+ else { block_result = #{`this.__ruby_instance`.instance_exec(&`base.render_block`)}; }
55
57
  if (block_result && (block_result.constructor === String || block_result.constructor === Number)) { Opal.React.render_buffer[Opal.React.render_buffer.length - 1].push(block_result); }
56
58
  Opal.React.active_redux_components.pop();
57
59
  Opal.React.active_components.pop();
@@ -95,8 +97,9 @@ module LucidMaterial
95
97
  return null;
96
98
  }
97
99
  };
100
+ base.preload_block = null;
101
+ base.while_loading_block = null;
98
102
  base.jss_styles = null;
99
- base.jss_styles_used = null;
100
103
  base.use_styles = null;
101
104
  base.store_updates = true;
102
105
  base.react_component = function(props) {
@@ -105,10 +108,10 @@ module LucidMaterial
105
108
  if (base.store_updates) { store = Opal.global.React.useContext(Opal.global.LucidApplicationContext); }
106
109
  let theme = Opal.global.MuiStyles.useTheme();
107
110
  if (base.jss_styles) {
108
- if (!base.use_styles || (Opal.Isomorfeus.development && !Object.is(base.jss_styles, base.jss_styles_used))) {
109
- base.jss_styles_used = base.jss_styles;
110
- let styles = base.jss_styles
111
- if (typeof styles === 'function') { styles = styles(theme); }
111
+ if (!base.use_styles || (Opal.Isomorfeus.development && Opal.Isomorfeus.development !== nil)) {
112
+ let styles;
113
+ if (typeof base.jss_styles === 'function') { styles = base.jss_styles(theme); }
114
+ else { styles = base.jss_styles; }
112
115
  base.use_styles = Opal.global.MuiStyles.makeStyles(styles);
113
116
  }
114
117
  classes = base.use_styles();
@@ -1,6 +1,4 @@
1
1
  module React
2
- # to_native_react_props: the native_component params is used for event handlers, it keeps the event handlers
3
- # it does not need to be compone nt, can be a object with the event handlers
4
2
  # language=JS
5
3
  %x{
6
4
  self.render_buffer = [];
@@ -15,10 +13,10 @@ module React
15
13
  };
16
14
 
17
15
  self.lower_camelize = function(snake_cased_word) {
18
- var parts = snake_cased_word.split('_');
19
- var res = parts[0];
20
- for (var i = 1; i < parts.length; i++) {
21
- res += parts[i][0].toUpperCase() + parts[i].slice(1);
16
+ let parts = snake_cased_word.split('_');
17
+ let res = parts[0];
18
+ for (let i = 1; i < parts.length; i++) {
19
+ res += parts[i][0].toUpperCase() + parts[i].slice(1);
22
20
  }
23
21
  return res;
24
22
  };
@@ -30,36 +28,36 @@ module React
30
28
  };
31
29
 
32
30
  self.to_native_react_props = function(ruby_style_props) {
33
- var result = {};
34
- var keys = ruby_style_props.$keys();
35
- var keys_length = keys.length;
36
- let key;
37
- for (var i = 0; i < keys_length; i++) {
38
- key = keys[i];
39
- if (key[0] === 'o' && key[1] === 'n' && key[2] === '_') {
40
- var handler = ruby_style_props['$[]'](key);
41
- if (typeof handler === "function") {
42
- result[Opal.React.lower_camelize(key)] = handler;
43
- } else {
44
- var active_component = Opal.React.active_component();
45
- result[Opal.React.lower_camelize(key)] = active_component[handler];
46
- }
47
- } else if (key[0] === 'a' && key.startsWith("aria_")) {
48
- result[key.replace("_", "-")] = ruby_style_props['$[]'](key);
49
- } else if (key === "style") {
50
- var val = ruby_style_props['$[]'](key);
51
- if (typeof val.$to_n === "function") { val = val.$to_n() }
52
- result["style"] = val;
31
+ let result = {};
32
+ let keys = ruby_style_props.$keys();
33
+ let keys_length = keys.length;
34
+ let key = '';
35
+ for (let i = 0; i < keys_length; i++) {
36
+ key = keys[i];
37
+ if (key[0] === 'o' && key[1] === 'n' && key[2] === '_') {
38
+ let handler = ruby_style_props['$[]'](key);
39
+ if (typeof handler === "function") {
40
+ result[Opal.React.lower_camelize(key)] = handler;
53
41
  } else {
54
- result[key.indexOf('_') > 0 ? Opal.React.lower_camelize(key) : key] = ruby_style_props['$[]'](key);
42
+ let active_component = Opal.React.active_component();
43
+ result[Opal.React.lower_camelize(key)] = active_component[handler];
55
44
  }
45
+ } else if (key[0] === 'a' && key.startsWith("aria_")) {
46
+ result[key.replace("_", "-")] = ruby_style_props['$[]'](key);
47
+ } else if (key === "style") {
48
+ let val = ruby_style_props['$[]'](key);
49
+ if (typeof val.$to_n === "function") { val = val.$to_n() }
50
+ result["style"] = val;
51
+ } else {
52
+ result[key.indexOf('_') > 0 ? Opal.React.lower_camelize(key) : key] = ruby_style_props['$[]'](key);
56
53
  }
57
- return result;
54
+ }
55
+ return result;
58
56
  };
59
57
 
60
58
  self.internal_prepare_args_and_render = function(component, args, block) {
61
59
  if (args.length > 0) {
62
- var last_arg = args[args.length - 1];
60
+ let last_arg = args[args.length - 1];
63
61
  if (last_arg && last_arg.constructor === String) {
64
62
  if (args.length === 1) { return Opal.React.internal_render(component, null, last_arg, null); }
65
63
  else { Opal.React.internal_render(component, args[0], last_arg, null); }
@@ -94,7 +92,7 @@ module React
94
92
  self.active_components = [];
95
93
 
96
94
  self.active_component = function() {
97
- var length = Opal.React.active_components.length;
95
+ let length = Opal.React.active_components.length;
98
96
  if (length === 0) { return null; };
99
97
  return Opal.React.active_components[length-1];
100
98
  };
@@ -102,7 +100,7 @@ module React
102
100
  self.active_redux_components = [];
103
101
 
104
102
  self.active_redux_component = function() {
105
- var length = Opal.React.active_redux_components.length;
103
+ let length = Opal.React.active_redux_components.length;
106
104
  if (length === 0) { return null; };
107
105
  return Opal.React.active_redux_components[length-1];
108
106
  };
@@ -18,13 +18,22 @@ module React
18
18
 
19
19
  def component_did_mount(&block)
20
20
  %x{
21
- var fun = function() {
21
+ let fun = function() {
22
22
  Opal.React.active_redux_components.push(this.__ruby_instance);
23
23
  #{`this.__ruby_instance`.instance_exec(&block)};
24
24
  Opal.React.active_redux_components.pop();
25
25
  }
26
- if (self.lucid_react_component) { self.lucid_react_component.prototype.componentDidMount = fun; }
27
- else { self.react_component.prototype.componentDidMount = fun; }
26
+ if (self.lucid_react_component) {
27
+ if (self.lucid_react_component.prototype.componentDidMount) {
28
+ let fun_one = self.lucid_react_component.prototype.componentDidMount;
29
+ let fun_two = fun;
30
+ fun = function() {
31
+ fun_one();
32
+ fun_two();
33
+ }
34
+ }
35
+ self.lucid_react_component.prototype.componentDidMount = fun;
36
+ } else { self.react_component.prototype.componentDidMount = fun; }
28
37
  }
29
38
  end
30
39
 
@@ -8,7 +8,7 @@ module React
8
8
  def event_handler(name, &block)
9
9
  event_handlers << name
10
10
  %x{
11
- self.react_component.prototype[name] = function(event, info) {
11
+ var fun = function(event, info) {
12
12
  if (typeof event === "object") {
13
13
  #{ruby_event = ::React::SyntheticEvent.new(`event`)};
14
14
  } else {
@@ -16,6 +16,8 @@ module React
16
16
  }
17
17
  #{`this.__ruby_instance`.instance_exec(ruby_event, `info`, &block)};
18
18
  }
19
+ if (self.lucid_react_component) { self.lucid_react_component.prototype[name] = fun; }
20
+ else { self.react_component.prototype[name] = fun; }
19
21
  }
20
22
  end
21
23
  end
@@ -1,7 +1,9 @@
1
1
  module React
2
2
  module Component
3
3
  class Props
4
- include ::Native::Wrapper
4
+ def initialize(native)
5
+ @native = native
6
+ end
5
7
 
6
8
  def method_missing(prop, *args, &block)
7
9
  %x{
@@ -14,11 +16,11 @@ module React
14
16
  end
15
17
 
16
18
  def classes
17
- @classes ||= `Opal.React.Component.Styles.$new(#@native.props.classes)`
19
+ @classes ||= `Opal.React.Component.Styles.$new(#@native, 'classes')`
18
20
  end
19
21
 
20
22
  def theme
21
- @theme ||= `Opal.React.Component.Styles.$new(#@native.props.theme)`
23
+ @theme ||= `Opal.React.Component.Styles.$new(#@native, 'theme')`
22
24
  end
23
25
 
24
26
  def isomorfeus_store
@@ -1,14 +1,21 @@
1
1
  module React
2
2
  module Component
3
3
  class Styles
4
- def initialize(native)
4
+ def initialize(native, props_prop = false)
5
5
  @native = native
6
+ @props_prop = props_prop
6
7
  end
7
8
 
8
9
  def method_missing(prop, *args, &block)
9
10
  %x{
10
- if (!#@native || typeof #@native[prop] === 'undefined') { return #{nil}; }
11
- let value = #@native[prop];
11
+ let value;
12
+ if (#@props_prop) {
13
+ if (!#@native.props[#@props_prop] || typeof #@native.props[#@props_prop][prop] === 'undefined') { return #{nil}; }
14
+ value = #@native.props[#@props_prop][prop];
15
+ } else {
16
+ if (!#@native || typeof #@native[prop] === 'undefined') { return #{nil}; }
17
+ value = #@native[prop];
18
+ }
12
19
  if (typeof value === 'string' || typeof value === 'number' || Array.isArray(value)) { return value; }
13
20
  if (typeof value === 'function') { return #{Proc.new { `value()` }} }
14
21
  return Opal.React.Component.Styles.$new(value);
@@ -16,12 +23,18 @@ module React
16
23
  end
17
24
 
18
25
  def to_h
19
- `Opal.Hash.$new(#@native)`
26
+ %x{
27
+ if (#@props_prop) { return Opal.Hash.$new(#@native.props[#@props_prop]); }
28
+ else { return Opal.Hash.$new(#@native); }
29
+ }
20
30
  end
21
31
 
22
32
  def to_n
23
- @native
33
+ %x{
34
+ if (#@props_prop) { return #@native.props[#@props_prop]; }
35
+ else { return #@native; }
36
+ }
24
37
  end
25
38
  end
26
39
  end
27
- end
40
+ end
@@ -1,3 +1,3 @@
1
1
  module React
2
- VERSION = '16.10.11'
2
+ VERSION = '16.10.12'
3
3
  end
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.10.11
4
+ version: 16.10.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: 2019-10-13 00:00:00.000000000 Z
11
+ date: 2019-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oj
@@ -185,11 +185,12 @@ files:
185
185
  - lib/lucid_component/class_store_proxy.rb
186
186
  - lib/lucid_component/component_class_store_defaults.rb
187
187
  - lib/lucid_component/component_instance_store_defaults.rb
188
- - lib/lucid_component/event_handler.rb
188
+ - lib/lucid_component/environment_support.rb
189
189
  - lib/lucid_component/initializer.rb
190
190
  - lib/lucid_component/instance_store_proxy.rb
191
191
  - lib/lucid_component/mixin.rb
192
192
  - lib/lucid_component/native_component_constructor.rb
193
+ - lib/lucid_component/preloading_support.rb
193
194
  - lib/lucid_component/reducers.rb
194
195
  - lib/lucid_component/store_api.rb
195
196
  - lib/lucid_component/styles_support.rb
@@ -240,7 +241,14 @@ homepage: http://isomorfeus.com
240
241
  licenses:
241
242
  - MIT
242
243
  metadata: {}
243
- post_install_message:
244
+ post_install_message: |2+
245
+
246
+ isomorfeus-react 16.10.12:
247
+ Breaking changes:
248
+ Server Side Rendering is on by default in the development environment.
249
+ Please enable SSR asset builds in the webpack config of your app or turn SSR off with:
250
+ Isomorfeus.server_side_rendering = false
251
+
244
252
  rdoc_options: []
245
253
  require_paths:
246
254
  - lib
@@ -1,21 +0,0 @@
1
- module LucidComponent
2
- module EventHandler
3
- def event_handlers
4
- @event_handlers ||= []
5
- end
6
-
7
- def event_handler(name, &block)
8
- event_handlers << name
9
- %x{
10
- self.lucid_react_component.prototype[name] = function(event, info) {
11
- if (typeof event === "object") {
12
- #{ruby_event = ::React::SyntheticEvent.new(`event`)};
13
- } else {
14
- #{ruby_event = `event`};
15
- }
16
- #{`this.__ruby_instance`.instance_exec(ruby_event, `info`, &block)};
17
- }
18
- }
19
- end
20
- end
21
- end