isomorfeus-react 16.13.10 → 16.13.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -10
  3. data/lib/isomorfeus-react-native.rb +5 -0
  4. data/lib/isomorfeus-react-paper.rb +4 -0
  5. data/lib/isomorfeus-react.rb +6 -4
  6. data/lib/isomorfeus/props/validator.rb +2 -2
  7. data/lib/isomorfeus/{react_config.rb → react/config.rb} +0 -0
  8. data/lib/isomorfeus/react/memcached_component_cache.rb +19 -0
  9. data/lib/isomorfeus/react/redis_component_cache.rb +19 -0
  10. data/lib/isomorfeus/{thread_local_component_cache.rb → react/thread_local_component_cache.rb} +0 -0
  11. data/lib/isomorfeus_react/lucid_app/mixin.rb +1 -0
  12. data/lib/isomorfeus_react/lucid_app/native_component_constructor.rb +0 -1
  13. data/lib/isomorfeus_react/lucid_component/api.rb +0 -27
  14. data/lib/isomorfeus_react/lucid_component/mixin.rb +1 -0
  15. data/lib/isomorfeus_react/lucid_component/styles_api.rb +34 -0
  16. data/lib/isomorfeus_react/lucid_func/mixin.rb +1 -0
  17. data/lib/isomorfeus_react/react/function_component/api.rb +7 -6
  18. data/lib/isomorfeus_react_material/lucid_material/app/mixin.rb +1 -0
  19. data/lib/isomorfeus_react_material/lucid_material/app/native_component_constructor.rb +0 -1
  20. data/lib/isomorfeus_react_material/lucid_material/component/mixin.rb +1 -0
  21. data/lib/isomorfeus_react_material/lucid_material/func/mixin.rb +1 -0
  22. data/lib/isomorfeus_react_paper/lucid_paper/app/base.rb +9 -0
  23. data/lib/isomorfeus_react_paper/lucid_paper/app/mixin.rb +19 -0
  24. data/lib/isomorfeus_react_paper/lucid_paper/app/native_component_constructor.rb +32 -0
  25. data/lib/isomorfeus_react_paper/lucid_paper/component/base.rb +9 -0
  26. data/lib/isomorfeus_react_paper/lucid_paper/component/mixin.rb +18 -0
  27. data/lib/isomorfeus_react_paper/lucid_paper/component/native_component_constructor.rb +25 -0
  28. data/lib/isomorfeus_react_paper/lucid_paper/func/base.rb +9 -0
  29. data/lib/isomorfeus_react_paper/lucid_paper/func/mixin.rb +14 -0
  30. data/lib/isomorfeus_react_paper/lucid_paper/func/native_component_constructor.rb +71 -0
  31. data/lib/react.rb +6 -5
  32. data/lib/react/component/api.rb +5 -4
  33. data/lib/react/version.rb +1 -1
  34. data/lib/react_native/component/elements.rb +203 -0
  35. data/lib/react_native/lucid_app/react_native_component_constructor.rb +51 -0
  36. data/lib/react_native/lucid_component/react_native_component_constructor.rb +37 -0
  37. data/lib/react_native/lucid_func/react_native_component_constructor.rb +82 -0
  38. data/lib/react_native/react.rb +120 -0
  39. metadata +69 -22
@@ -0,0 +1,82 @@
1
+ module LucidFunc
2
+ module ReactNativeComponentConstructor
3
+ def self.extended(base)
4
+ component_name = base.to_s
5
+ %x{
6
+ base.store_updates = true;
7
+ base.equality_checker = null;
8
+ base.instance_init = function(initial) {
9
+ let ruby_state = { instance: #{base.new(`{}`)} };
10
+ ruby_state.instance.__ruby_instance = ruby_state.instance;
11
+ ruby_state.instance.data_access = function() { return this.props.store; }
12
+ ruby_state.instance.data_access.bind(ruby_state.instance);
13
+ return ruby_state;
14
+ }
15
+ base.instance_reducer = function(state, action) { return state; }
16
+ base.react_component = Opal.global.React.memo(function(props) {
17
+ const og = Opal.global;
18
+ const oper = Opal.React;
19
+ oper.render_buffer.push([]);
20
+ // console.log("function pushed", oper.render_buffer, oper.render_buffer.toString());
21
+ // Lucid functionality
22
+ let classes = null;
23
+ let store;
24
+ if (base.store_updates) { store = og.React.useContext(og.LucidApplicationContext); }
25
+ let theme = og.ReactJSS.useTheme();
26
+ if (base.jss_styles) {
27
+ if (!base.use_styles || (Opal.Isomorfeus.development === true)) {
28
+ let styles;
29
+ if (typeof base.jss_styles === 'function') { styles = base.jss_styles(theme); }
30
+ else { styles = base.jss_styles; }
31
+ base.use_styles = og.ReactJSS.createUseStyles(styles);
32
+ }
33
+ classes = base.use_styles();
34
+ }
35
+ // prepare Ruby instance
36
+ const [__ruby_state, __ruby_dispatch] = og.React.useReducer(base.instance_reducer, null, base.instance_init);
37
+ const __ruby_instance = __ruby_state.instance;
38
+ __ruby_instance.props = Object.assign({}, props);
39
+ __ruby_instance.props.store = store;
40
+ __ruby_instance.props.theme = theme;
41
+ __ruby_instance.props.classes = classes;
42
+ oper.active_components.push(__ruby_instance);
43
+ oper.active_redux_components.push(__ruby_instance);
44
+ let block_result = #{`__ruby_instance`.instance_exec(&`base.render_block`)};
45
+ if (block_result && block_result !== nil) { oper.render_block_result(block_result); }
46
+ oper.active_redux_components.pop();
47
+ oper.active_components.pop();
48
+ // console.log("function popping", oper.render_buffer, oper.render_buffer.toString());
49
+ let result = oper.render_buffer.pop();
50
+ if (result.length === 1) { return result[0]; }
51
+ return result;
52
+ }, base.equality_checker);
53
+ base.react_component.displayName = #{component_name};
54
+ }
55
+
56
+ base_module = base.to_s.deconstantize
57
+ if base_module != ''
58
+ base_module.constantize.define_singleton_method(base.to_s.demodulize) do |*args, &block|
59
+ `Opal.React.internal_prepare_args_and_render(#{base}.react_component, args, block)`
60
+ end
61
+ else
62
+ Object.define_method(base.to_s) do |*args, &block|
63
+ `Opal.React.internal_prepare_args_and_render(#{base}.react_component, args, block)`
64
+ end
65
+ end
66
+
67
+ def props_are_equal?(&block)
68
+ %x{
69
+ base.equality_checker = function (prev_props, next_props) {
70
+ var prev_ruby_props = Opal.React.Component.Props.$new({props: prev_props});
71
+ var next_ruby_props = Opal.React.Component.Props.$new({props: next_props});
72
+ return #{block.call(`prev_ruby_props`, `next_ruby_props`)};
73
+ }
74
+ }
75
+ end
76
+
77
+ def render(&block)
78
+ `base.render_block = #{block}`
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,120 @@
1
+ module React
2
+ %x{
3
+ self.prop_dictionary = {
4
+ on_click: 'onPress',
5
+ onClick: 'onPress',
6
+ on_touch: 'onPress',
7
+ onTouch: 'onPress',
8
+ on_change: 'onChangeText',
9
+ onChange: 'onChangeText',
10
+ on_blur: 'onSubmitText',
11
+ onBlur: 'onSubmitText',
12
+ };
13
+
14
+ self.to_native_react_props = function(ruby_style_props) {
15
+ let result = {};
16
+ let keys = ruby_style_props.$$keys;
17
+ let keys_length = keys.length;
18
+ let key = '';
19
+ for (let i = 0; i < keys_length; i++) {
20
+ key = keys[i];
21
+ let value = ruby_style_props.$$smap[key];
22
+ if (key[0] === 'o' && key[1] === 'n' && key[2] === '_') {
23
+ let type = typeof value;
24
+ if (type === "function") {
25
+ let active_c = self.active_component();
26
+ result[self.lower_camelize(key)] = function(event, info) {
27
+ let ruby_event = self.native_to_ruby_event(event);
28
+ #{`active_c.__ruby_instance`.instance_exec(`ruby_event`, `info`, &`value`)};
29
+ }
30
+ } else if (type === "object" && typeof value.$call === "function" ) {
31
+ if (!value.react_event_handler_function) {
32
+ value.react_event_handler_function = function(event, info) {
33
+ let ruby_event = self.native_to_ruby_event(event);
34
+ value.$call(ruby_event, info)
35
+ };
36
+ }
37
+ result[self.lower_camelize(key)] = value.react_event_handler_function;
38
+ } else if (type === "string" ) {
39
+ let active_component = self.active_component();
40
+ let method_ref;
41
+ let method_name = '$' + value;
42
+ if (typeof active_component[method_name] === "function") {
43
+ // got a ruby instance
44
+ if (active_component.native && active_component.native.method_refs && active_component.native.method_refs[value]) { method_ref = active_component.native.method_refs[value]; } // ruby instance with native
45
+ else if (active_component.method_refs && active_component.method_refs[value]) { method_ref = active_component.method_refs[value]; } // ruby function component
46
+ else { method_ref = active_component.$method_ref(value); } // create the ref
47
+ } else if (typeof active_component.__ruby_instance[method_name] === "function") {
48
+ // got a native instance
49
+ if (active_component.method_refs && active_component.method_refs[value]) { method_ref = active_component.method_refs[value]; }
50
+ else { method_ref = active_component.__ruby_instance.$method_ref(value); } // create ref for native
51
+ }
52
+ if (method_ref) {
53
+ if (!method_ref.react_event_handler_function) {
54
+ method_ref.react_event_handler_function = function(event, info) {
55
+ let ruby_event = self.native_to_ruby_event(event);
56
+ method_ref.$call(ruby_event, info)
57
+ };
58
+ }
59
+ result[self.lower_camelize(key)] = method_ref.react_event_handler_function;
60
+ } else {
61
+ let component_name;
62
+ if (active_component.__ruby_instance) { component_name = active_component.__ruby_instance.$to_s(); }
63
+ else { component_name = active_component.$to_s(); }
64
+ #{Isomorfeus.raise_error(message: "Is #{`value`} a valid method of #{`component_name`}? If so then please use: #{`key`}: method_ref(:#{`value`}) within component: #{`component_name`}")}
65
+ }
66
+ } else {
67
+ let active_component = self.active_component();
68
+ let component_name;
69
+ if (active_component.__ruby_instance) { component_name = active_component.__ruby_instance.$to_s(); }
70
+ else { component_name = active_component.$to_s(); }
71
+ #{Isomorfeus.raise_error(message: "Received invalid value for #{`key`} with #{`value`} within component: #{`component_name`}")}
72
+ console.error( + key + " event handler:", value, " within component:", self.active_component());
73
+ }
74
+ } else if (key[0] === 'a' && key.startsWith("aria_")) {
75
+ result[key.replace("_", "-")] = value;
76
+ } else if (key === "style" || key === "theme") {
77
+ if (typeof value.$to_n === "function") { value = value.$to_n() }
78
+ result[key] = value;
79
+ } else {
80
+ result[self.lower_camelize(key)] = value;
81
+ }
82
+ }
83
+ return result;
84
+ };
85
+
86
+ self.render_block_result = function(block_result, component) {
87
+ if (block_result.constructor === String || block_result.constructor === Number) {
88
+ if (component && component === Opal.global.Text) {
89
+ self.render_buffer[self.render_buffer.length - 1].push(block_result);
90
+ } else {
91
+ self.render_buffer[self.render_buffer.length - 1].push(Opal.global.React.createElement(Opal.global.Text, {}, block_result));
92
+ }
93
+ }
94
+ };
95
+
96
+ self.internal_render = function(component, props, string_child, block) {
97
+ const operabu = self.render_buffer;
98
+ let native_props;
99
+ if (props && props !== nil) { native_props = self.to_native_react_props(props); }
100
+ if (string_child) {
101
+ if (component && component === Opal.global.Text) {
102
+ operabu[operabu.length - 1].push(Opal.global.React.createElement(component, native_props, string_child));
103
+ } else {
104
+ let child = [Opal.global.React.createElement(Opal.global.Text, {}, string_child)];
105
+ operabu[operabu.length - 1].push(Opal.global.React.createElement(component, native_props, child));
106
+ }
107
+ } else if (block && block !== nil) {
108
+ operabu.push([]);
109
+ // console.log("internal_render pushed", Opal.React.render_buffer, Opal.React.render_buffer.toString());
110
+ let block_result = block.$call();
111
+ if (block_result && block_result !== nil) { Opal.React.render_block_result(block_result, component); }
112
+ // console.log("internal_render popping", Opal.React.render_buffer, Opal.React.render_buffer.toString());
113
+ let children = operabu.pop();
114
+ operabu[operabu.length - 1].push(Opal.global.React.createElement.apply(this, [component, native_props].concat(children)));
115
+ } else {
116
+ operabu[operabu.length - 1].push(Opal.global.React.createElement(component, native_props));
117
+ }
118
+ };
119
+ }
120
+ 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.13.10
4
+ version: 16.13.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Biedermann
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-16 00:00:00.000000000 Z
11
+ date: 2021-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.1.6
19
+ version: 1.1.8
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.1.6
26
+ version: 1.1.8
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: oj
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 3.10.2
33
+ version: 3.11.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 3.10.2
40
+ version: 3.11.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: opal
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -86,70 +86,98 @@ dependencies:
86
86
  requirements:
87
87
  - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: 0.9.11
89
+ version: 0.10.1
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: 0.9.11
96
+ version: 0.10.1
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: isomorfeus-redux
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 4.0.23
103
+ version: 4.1.1
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 4.0.23
110
+ version: 4.1.1
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: isomorfeus-speednode
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 0.2.12
117
+ version: 0.3.1
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: 0.2.12
124
+ version: 0.3.1
125
+ - !ruby/object:Gem::Dependency
126
+ name: dalli
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: 2.7.0
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: 2.7.0
139
+ - !ruby/object:Gem::Dependency
140
+ name: redis
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 4.2.0
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: 4.2.0
125
153
  - !ruby/object:Gem::Dependency
126
154
  name: zeitwerk
127
155
  requirement: !ruby/object:Gem::Requirement
128
156
  requirements:
129
157
  - - "~>"
130
158
  - !ruby/object:Gem::Version
131
- version: 2.2.2
159
+ version: 2.4.2
132
160
  type: :runtime
133
161
  prerelease: false
134
162
  version_requirements: !ruby/object:Gem::Requirement
135
163
  requirements:
136
164
  - - "~>"
137
165
  - !ruby/object:Gem::Version
138
- version: 2.2.2
166
+ version: 2.4.2
139
167
  - !ruby/object:Gem::Dependency
140
168
  name: isomorfeus-puppetmaster
141
169
  requirement: !ruby/object:Gem::Requirement
142
170
  requirements:
143
171
  - - "~>"
144
172
  - !ruby/object:Gem::Version
145
- version: 0.3.5
173
+ version: 0.4.0
146
174
  type: :development
147
175
  prerelease: false
148
176
  version_requirements: !ruby/object:Gem::Requirement
149
177
  requirements:
150
178
  - - "~>"
151
179
  - !ruby/object:Gem::Version
152
- version: 0.3.5
180
+ version: 0.4.0
153
181
  - !ruby/object:Gem::Dependency
154
182
  name: rake
155
183
  requirement: !ruby/object:Gem::Requirement
@@ -195,12 +223,16 @@ files:
195
223
  - lib/browser/file_list.rb
196
224
  - lib/browser/iterable.rb
197
225
  - lib/isomorfeus-react-material-ui.rb
226
+ - lib/isomorfeus-react-native.rb
227
+ - lib/isomorfeus-react-paper.rb
198
228
  - lib/isomorfeus-react.rb
199
229
  - lib/isomorfeus/props/validate_hash_proxy.rb
200
230
  - lib/isomorfeus/props/validator.rb
201
- - lib/isomorfeus/react_config.rb
231
+ - lib/isomorfeus/react/config.rb
232
+ - lib/isomorfeus/react/memcached_component_cache.rb
233
+ - lib/isomorfeus/react/redis_component_cache.rb
234
+ - lib/isomorfeus/react/thread_local_component_cache.rb
202
235
  - lib/isomorfeus/react_view_helper.rb
203
- - lib/isomorfeus/thread_local_component_cache.rb
204
236
  - lib/isomorfeus/top_level.rb
205
237
  - lib/isomorfeus/top_level_ssr.rb
206
238
  - lib/isomorfeus_react/lucid_app/api.rb
@@ -217,6 +249,7 @@ files:
217
249
  - lib/isomorfeus_react/lucid_component/mixin.rb
218
250
  - lib/isomorfeus_react/lucid_component/native_component_constructor.rb
219
251
  - lib/isomorfeus_react/lucid_component/native_lucid_component_constructor.rb
252
+ - lib/isomorfeus_react/lucid_component/styles_api.rb
220
253
  - lib/isomorfeus_react/lucid_func/base.rb
221
254
  - lib/isomorfeus_react/lucid_func/initializer.rb
222
255
  - lib/isomorfeus_react/lucid_func/mixin.rb
@@ -238,6 +271,15 @@ files:
238
271
  - lib/isomorfeus_react_material/lucid_material/func/base.rb
239
272
  - lib/isomorfeus_react_material/lucid_material/func/mixin.rb
240
273
  - lib/isomorfeus_react_material/lucid_material/func/native_component_constructor.rb
274
+ - lib/isomorfeus_react_paper/lucid_paper/app/base.rb
275
+ - lib/isomorfeus_react_paper/lucid_paper/app/mixin.rb
276
+ - lib/isomorfeus_react_paper/lucid_paper/app/native_component_constructor.rb
277
+ - lib/isomorfeus_react_paper/lucid_paper/component/base.rb
278
+ - lib/isomorfeus_react_paper/lucid_paper/component/mixin.rb
279
+ - lib/isomorfeus_react_paper/lucid_paper/component/native_component_constructor.rb
280
+ - lib/isomorfeus_react_paper/lucid_paper/func/base.rb
281
+ - lib/isomorfeus_react_paper/lucid_paper/func/mixin.rb
282
+ - lib/isomorfeus_react_paper/lucid_paper/func/native_component_constructor.rb
241
283
  - lib/lucid_app/context.rb
242
284
  - lib/lucid_prop_declaration/mixin.rb
243
285
  - lib/react.rb
@@ -264,12 +306,17 @@ files:
264
306
  - lib/react/version.rb
265
307
  - lib/react_dom.rb
266
308
  - lib/react_dom_server.rb
309
+ - lib/react_native/component/elements.rb
310
+ - lib/react_native/lucid_app/react_native_component_constructor.rb
311
+ - lib/react_native/lucid_component/react_native_component_constructor.rb
312
+ - lib/react_native/lucid_func/react_native_component_constructor.rb
313
+ - lib/react_native/react.rb
267
314
  homepage: http://isomorfeus.com
268
315
  licenses:
269
316
  - MIT
270
317
  metadata:
271
318
  github_repo: ssh://github.com/isomorfeus/gems
272
- post_install_message:
319
+ post_install_message:
273
320
  rdoc_options: []
274
321
  require_paths:
275
322
  - lib
@@ -284,8 +331,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
284
331
  - !ruby/object:Gem::Version
285
332
  version: '0'
286
333
  requirements: []
287
- rubygems_version: 3.0.6
288
- signing_key:
334
+ rubygems_version: 3.2.15
335
+ signing_key:
289
336
  specification_version: 4
290
337
  summary: React for Opal Ruby.
291
338
  test_files: []