isomorfeus-react 16.12.3 → 16.12.4

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: 16b27da18f07ffa5532831f4eb7223e2811186de76a311b6b6c5382daa31e07b
4
- data.tar.gz: 94216067a6cd36e0eda714fbe5c5d807432b478da1cdb0ae193312659f879a21
3
+ metadata.gz: 69771dea65edc7607119f666d42f3b94e9127086ad3e030c471856102309257e
4
+ data.tar.gz: 7c2c7490ada522852b4afb23031a82fa819f772d46e68f39829d5b35de22164b
5
5
  SHA512:
6
- metadata.gz: 4b8414d7467dc8b04f3838db146e497556ac68d7a4016f38b4c1b445c5a035a3c157c6f9bc53d8937444677660596e6049da71865bb0681d77c5400b3c22bf75
7
- data.tar.gz: cbf406f15a160204347a20cdb8f38293b431a0517537c80eaf742191849386fadb4bda6c56810b8b00b08c28712630a3b070915f0e50d6113f9970ed4a0c3df7
6
+ metadata.gz: 49e1c4ed99f44f8bb592da6cf0b0e9b20b24ccc435533b32dfff6239418528161387395056870fad6114f22ea9a36a3f88b9380b6900d477c59cd1289ec14153
7
+ data.tar.gz: 7b6b021c7a543befab9c9999e13938b4e02d401f357b556d1d4d40494b90c2fef26c7e8b58da9ea0300e6733070d8b8e2646ca1c146f94fb75f6a67af5ccf95d
@@ -28,6 +28,10 @@ module Isomorfeus
28
28
  client_init_class_names << init_class_name
29
29
  end
30
30
 
31
+ def add_client_init_after_store_class_name(init_class_name)
32
+ client_init_after_store_class_names << init_class_name
33
+ end
34
+
31
35
  def add_client_option(key, value = nil)
32
36
  self.class.attr_accessor(key)
33
37
  self.send("#{key}=", value)
@@ -50,6 +54,12 @@ module Isomorfeus
50
54
  end
51
55
  end
52
56
 
57
+ def execute_init_after_store_classes
58
+ client_init_after_store_class_names.each do |constant|
59
+ constant.constantize.send(:init)
60
+ end
61
+ end
62
+
53
63
  def env=(env_string)
54
64
  @env = env_string ? env_string : 'development'
55
65
  @development = (@env == 'development') ? true : false
@@ -97,6 +107,7 @@ module Isomorfeus
97
107
  end
98
108
 
99
109
  self.add_client_option(:client_init_class_names, [])
110
+ self.add_client_option(:client_init_after_store_class_names, [])
100
111
  else
101
112
  class << self
102
113
  attr_accessor :server_side_rendering
@@ -1,5 +1,18 @@
1
1
  module Isomorfeus
2
2
  module ReactViewHelper
3
+ def cached_mount_component(component_name, props = {}, asset = 'application_ssr.js')
4
+ key = "#{component_name}#{props}#{asset}"
5
+ if Isomorfeus.production? && component_cache.key?(key)
6
+ render_result = component_cache[key][:render_result]
7
+ @ssr_response_status = component_cache[key][:ssr_response_status]
8
+ @sst_styles = component_cache[key][:ssr_styles]
9
+ else
10
+ render_result = mount_component(component_name, props, asset)
11
+ component_cache[key] = { render_result: render_result, ssr_response_status: ssr_response_status, ssr_styles: ssr_styles }
12
+ end
13
+ render_result
14
+ end
15
+
3
16
  def mount_component(component_name, props = {}, asset = 'application_ssr.js')
4
17
  @ssr_response_status = nil
5
18
  @ssr_styles = nil
@@ -51,7 +64,8 @@ module Isomorfeus
51
64
  global.Opal.Isomorfeus.TopLevel['$ssr_route_path=']('#{props[:location]}');
52
65
  JAVASCRIPT
53
66
 
54
- # if location_host and scheme are given and if Transport is loaded, connect and then render, otherwise do not render
67
+ # if location_host and scheme are given and if Transport is loaded, connect and then render,
68
+ # otherwise do not render because only one pass is required
55
69
  ws_scheme = props[:location_scheme] == 'https:' ? 'wss:' : 'ws:'
56
70
  location_host = props[:location_host] ? props[:location_host] : 'localhost'
57
71
  api_ws_path = Isomorfeus.respond_to?(:api_websocket_path) ? Isomorfeus.api_websocket_path : ''
@@ -152,12 +166,16 @@ module Isomorfeus
152
166
 
153
167
  # build result
154
168
  render_result << " data-iso-hydrated='true'" if rendered_tree
155
- render_result << " data-iso-nloc='#{props[:locale]}' data-iso-state='#{Oj.dump(application_state, mode: :strict)}'>"
169
+ # render_result << " data-iso-nloc='#{props[:locale]}' data-iso-state='#{Oj.dump(application_state, mode: :strict)}'>"
170
+ render_result << " data-iso-nloc='#{props[:locale]}'>"
156
171
  render_result << (rendered_tree ? rendered_tree : "SSR didn't work")
157
172
  else
158
173
  render_result << " data-iso-nloc='#{props[:locale]}'>"
159
174
  end
160
175
  render_result << '</div>'
176
+ if Isomorfeus.server_side_rendering
177
+ render_result = "<script type='application/javascript'>\nServerSideRenderingStateJSON = #{Oj.dump(application_state, mode: :strict)}\n</script>\n" << render_result
178
+ end
161
179
  render_result
162
180
  end
163
181
 
@@ -168,5 +186,11 @@ module Isomorfeus
168
186
  def ssr_styles
169
187
  @ssr_styles || ''
170
188
  end
189
+
190
+ private
191
+
192
+ def component_cache
193
+ Thread.current[:component_cache] ||= {}
194
+ end
171
195
  end
172
196
  end
@@ -25,18 +25,21 @@ module Isomorfeus
25
25
  props = `Opal.Hash.$new(JSON.parse(props_json))`
26
26
  raw_hydrated = root_element.JS.getAttribute('data-iso-hydrated')
27
27
  hydrated = (raw_hydrated && raw_hydrated == "true")
28
- state_json = root_element.JS.getAttribute('data-iso-state')
29
- if state_json
28
+ #state_json = root_element.JS.getAttribute('data-iso-state')
29
+ #if state_json
30
30
  %x{
31
- var state = JSON.parse(state_json);
32
- var keys = Object.keys(state);
33
- for(var i=0; i < keys.length; i++) {
34
- if (Object.keys(state[keys[i]]).length > 0) {
35
- global.Opal.Isomorfeus.store.native.dispatch({ type: keys[i].toUpperCase(), set_state: state[keys[i]] });
31
+ if (global.ServerSideRenderingStateJSON) {
32
+ var state = global.ServerSideRenderingStateJSON;
33
+ var keys = Object.keys(state);
34
+ for(var i=0; i < keys.length; i++) {
35
+ if (Object.keys(state[keys[i]]).length > 0) {
36
+ global.Opal.Isomorfeus.store.native.dispatch({ type: keys[i].toUpperCase(), set_state: state[keys[i]] });
37
+ }
36
38
  }
37
39
  }
38
40
  }
39
- end
41
+ #end
42
+ Isomorfeus.execute_init_after_store_classes
40
43
  begin
41
44
  result = Isomorfeus::TopLevel.mount_component(component, props, root_element, hydrated)
42
45
  @tried_another_time = false
@@ -47,6 +47,7 @@ module LucidApp
47
47
  this[ref] = Opal.global.React.createRef();
48
48
  }
49
49
  }
50
+ if (base.preload_block) { this.state.preloaded = this.__ruby_instance.$execute_preload_block(); }
50
51
  this.listener = this.listener.bind(this);
51
52
  this.unsubscriber = Opal.Isomorfeus.store.native.subscribe(this.listener);
52
53
  }
@@ -65,7 +66,7 @@ module LucidApp
65
66
  oper.active_components.push(this);
66
67
  oper.active_redux_components.push(this);
67
68
  let block_result;
68
- if (base.preload_block && base.while_loading_block && !this.state.preloaded) { block_result = #{`this.__ruby_instance`.instance_exec(&`base.while_loading_block`)}; }
69
+ if (base.while_loading_block && !this.state.preloaded) { block_result = #{`this.__ruby_instance`.instance_exec(&`base.while_loading_block`)}; }
69
70
  else { block_result = #{`this.__ruby_instance`.instance_exec(&`base.render_block`)}; }
70
71
  if (block_result && (block_result.constructor === String || block_result.constructor === Number)) { oper.render_buffer[oper.render_buffer.length - 1].push(block_result); }
71
72
  oper.active_redux_components.pop();
@@ -37,6 +37,7 @@ module LucidComponent
37
37
  this[ref] = Opal.global.React.createRef();
38
38
  }
39
39
  }
40
+ if (base.preload_block) { this.state.preloaded = this.__ruby_instance.$execute_preload_block(); }
40
41
  }
41
42
  static get displayName() {
42
43
  return #{component_name};
@@ -52,16 +53,12 @@ module LucidComponent
52
53
  oper.active_components.push(this);
53
54
  oper.active_redux_components.push(this);
54
55
  let block_result;
55
- if (base.preload_block && base.while_loading_block && !this.state.preloaded) { block_result = #{`this.__ruby_instance`.instance_exec(&`base.while_loading_block`)}; }
56
+ if (base.while_loading_block && !this.state.preloaded) { block_result = #{`this.__ruby_instance`.instance_exec(&`base.while_loading_block`)}; }
56
57
  else { block_result = #{`this.__ruby_instance`.instance_exec(&`base.render_block`)}; }
57
58
  if (block_result && (block_result.constructor === String || block_result.constructor === Number)) { oper.render_buffer[oper.render_buffer.length - 1].push(block_result); }
58
59
  oper.active_redux_components.pop();
59
60
  oper.active_components.pop();
60
61
  // console.log("lucid component popping", oper.render_buffer, oper.render_buffer.toString());
61
- if (base.except_ssr) {
62
- if (typeof block_result === "object" && block_result.danger) { return Opal.global.React.createElement('div', {'data-ssrhelper': this.__ruby_instance.$class().$to_s(), dangerouslySetInnerHTML: { __html: block_result.html}});}
63
- else { return Opal.global.React.createElement('div', {'data-ssrhelper': this.__ruby_instance.$class().$to_s()}, oper.render_buffer.pop()); }
64
- }
65
62
  return oper.render_buffer.pop();
66
63
  }
67
64
  data_access() {
@@ -5,34 +5,27 @@ module LucidComponent
5
5
  def preload(&block)
6
6
  `base.preload_block = block`
7
7
  component_did_mount do
8
- instance_exec(&self.class.JS[:preload_block]).then do
9
- self.state.preloaded = true
10
- end
8
+ @_preload_promise.then { self.state.preloaded = true } unless self.state.preloaded
11
9
  end
12
10
  end
13
11
 
14
12
  def while_loading(option = nil, &block)
15
- if option == :except_ssr
16
- `base.except_ssr = true;`
17
- block = if on_ssr?
18
- proc { instance_exec(&`base.render_block`) }
19
- else
20
- given_block = block
21
- proc do
22
- %x{
23
- let query = "[data-ssrhelper='" + #{self.class.to_s} + "']";
24
- let el = document.querySelector(query);
25
- if (el) { return { danger: true, html: el.innerHTML }; }
26
- else { return #{instance_exec(&given_block)};
27
- }
28
- }
29
- end
30
- end
13
+ wl_block = proc do
14
+ if @_preload_promise.resolved?
15
+ instance_exec(&`base.render_block`)
16
+ else
17
+ instance_exec(&block)
18
+ end
31
19
  end
32
- `base.while_loading_block = block`
20
+ `base.while_loading_block = wl_block`
33
21
  end
34
22
  end
35
23
 
24
+ def execute_preload_block
25
+ @_preload_promise = instance_exec(&self.class.JS[:preload_block])
26
+ @_preload_promise.resolved?
27
+ end
28
+
36
29
  def preloaded?
37
30
  !!state.preloaded
38
31
  end
@@ -7,11 +7,11 @@ module LucidMaterial
7
7
  base.store_updates = true;
8
8
  base.equality_checker = null;
9
9
  base.instance_init = function(initial) {
10
- let ruby_state = { instance: #{base.new(`{}`)} };
11
- ruby_state.instance.__ruby_instance = ruby_state.instance;
12
- ruby_state.instance.data_access = function() { return this.props.store; }
13
- ruby_state.instance.data_access.bind(ruby_state.instance);
14
- return ruby_state;
10
+ let ruby_state = { instance: #{base.new(`{}`)} };
11
+ ruby_state.instance.__ruby_instance = ruby_state.instance;
12
+ ruby_state.instance.data_access = function() { return this.props.store; }
13
+ ruby_state.instance.data_access.bind(ruby_state.instance);
14
+ return ruby_state;
15
15
  }
16
16
  base.instance_reducer = function(state, action) { return state; }
17
17
  base.react_component = Opal.global.React.memo(function(props) {
data/lib/react/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module React
2
- VERSION = '16.12.3'
2
+ VERSION = '16.12.4'
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.12.3
4
+ version: 16.12.4
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-12-18 00:00:00.000000000 Z
11
+ date: 2019-12-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 0.0.2
75
+ version: 0.0.4
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 0.0.2
82
+ version: 0.0.4
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: opal-webpack-loader
85
85
  requirement: !ruby/object:Gem::Requirement