isomorfeus-react 16.13.11 → 16.13.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.
- checksums.yaml +4 -4
- data/README.md +3 -1
- data/lib/isomorfeus/react/config.rb +189 -189
- data/lib/isomorfeus/react/memcached_component_cache.rb +19 -19
- data/lib/isomorfeus/react/redis_component_cache.rb +19 -19
- data/lib/isomorfeus/react/thread_local_component_cache.rb +15 -15
- data/lib/isomorfeus/react_view_helper.rb +231 -231
- data/lib/isomorfeus/top_level.rb +103 -103
- data/lib/isomorfeus/top_level_ssr.rb +42 -42
- data/lib/isomorfeus-react-material-ui.rb +4 -4
- data/lib/isomorfeus-react-native.rb +5 -5
- data/lib/isomorfeus-react-paper.rb +4 -4
- data/lib/isomorfeus-react.rb +120 -120
- data/lib/isomorfeus_react/lucid_app/api.rb +26 -26
- data/lib/isomorfeus_react/lucid_app/base.rb +7 -7
- data/lib/isomorfeus_react/lucid_app/mixin.rb +23 -23
- data/lib/isomorfeus_react/lucid_app/native_component_constructor.rb +48 -48
- data/lib/isomorfeus_react/lucid_app/native_lucid_component_constructor.rb +94 -95
- data/lib/isomorfeus_react/lucid_component/api.rb +75 -75
- data/lib/isomorfeus_react/lucid_component/app_store_proxy.rb +37 -37
- data/lib/isomorfeus_react/lucid_component/base.rb +7 -7
- data/lib/isomorfeus_react/lucid_component/class_store_proxy.rb +44 -44
- data/lib/isomorfeus_react/lucid_component/initializer.rb +14 -14
- data/lib/isomorfeus_react/lucid_component/instance_store_proxy.rb +44 -44
- data/lib/isomorfeus_react/lucid_component/mixin.rb +22 -22
- data/lib/isomorfeus_react/lucid_component/native_component_constructor.rb +35 -35
- data/lib/isomorfeus_react/lucid_component/native_lucid_component_constructor.rb +82 -83
- data/lib/isomorfeus_react/lucid_component/styles_api.rb +34 -34
- data/lib/isomorfeus_react/lucid_func/base.rb +7 -7
- data/lib/isomorfeus_react/lucid_func/initializer.rb +11 -11
- data/lib/isomorfeus_react/lucid_func/mixin.rb +18 -18
- data/lib/isomorfeus_react/lucid_func/native_component_constructor.rb +81 -81
- data/lib/isomorfeus_react/react/function_component/api.rb +105 -105
- data/lib/isomorfeus_react/react/function_component/base.rb +8 -8
- data/lib/isomorfeus_react/react/function_component/initializer.rb +10 -10
- data/lib/isomorfeus_react/react/function_component/mixin.rb +17 -17
- data/lib/isomorfeus_react/react/function_component/native_component_constructor.rb +48 -48
- data/lib/isomorfeus_react/react/memo_component/base.rb +8 -8
- data/lib/isomorfeus_react/react/memo_component/mixin.rb +17 -17
- data/lib/isomorfeus_react/react/memo_component/native_component_constructor.rb +49 -49
- data/lib/isomorfeus_react_material/lucid_material/app/base.rb +8 -8
- data/lib/isomorfeus_react_material/lucid_material/app/mixin.rb +20 -20
- data/lib/isomorfeus_react_material/lucid_material/app/native_component_constructor.rb +50 -50
- data/lib/isomorfeus_react_material/lucid_material/component/base.rb +9 -9
- data/lib/isomorfeus_react_material/lucid_material/component/mixin.rb +19 -19
- data/lib/isomorfeus_react_material/lucid_material/component/native_component_constructor.rb +36 -36
- data/lib/isomorfeus_react_material/lucid_material/func/base.rb +9 -9
- data/lib/isomorfeus_react_material/lucid_material/func/mixin.rb +15 -15
- data/lib/isomorfeus_react_material/lucid_material/func/native_component_constructor.rb +83 -83
- data/lib/isomorfeus_react_paper/lucid_paper/app/base.rb +9 -9
- data/lib/isomorfeus_react_paper/lucid_paper/app/mixin.rb +19 -19
- data/lib/isomorfeus_react_paper/lucid_paper/app/native_component_constructor.rb +32 -32
- data/lib/isomorfeus_react_paper/lucid_paper/component/base.rb +9 -9
- data/lib/isomorfeus_react_paper/lucid_paper/component/mixin.rb +18 -18
- data/lib/isomorfeus_react_paper/lucid_paper/component/native_component_constructor.rb +25 -25
- data/lib/isomorfeus_react_paper/lucid_paper/func/base.rb +9 -9
- data/lib/isomorfeus_react_paper/lucid_paper/func/mixin.rb +14 -14
- data/lib/isomorfeus_react_paper/lucid_paper/func/native_component_constructor.rb +71 -71
- data/lib/lucid_app/context.rb +7 -7
- data/lib/lucid_prop_declaration/mixin.rb +126 -126
- data/lib/react/children.rb +34 -34
- data/lib/react/component/api.rb +134 -134
- data/lib/react/component/base.rb +8 -8
- data/lib/react/component/callbacks.rb +115 -115
- data/lib/react/component/elements.rb +60 -60
- data/lib/react/component/features.rb +48 -48
- data/lib/react/component/history.rb +69 -65
- data/lib/react/component/initializer.rb +11 -11
- data/lib/react/component/location.rb +19 -15
- data/lib/react/component/match.rb +35 -31
- data/lib/react/component/mixin.rb +20 -20
- data/lib/react/component/native_component_constructor.rb +69 -70
- data/lib/react/component/props.rb +83 -83
- data/lib/react/component/resolution.rb +97 -97
- data/lib/react/component/state.rb +58 -54
- data/lib/react/component/styles.rb +66 -66
- data/lib/react/context_wrapper.rb +48 -44
- data/lib/react/native_constant_wrapper.rb +29 -29
- data/lib/react/ref.rb +16 -12
- data/lib/react/synthetic_event.rb +52 -52
- data/lib/react/version.rb +3 -3
- data/lib/react.rb +296 -296
- data/lib/react_dom.rb +41 -41
- data/lib/react_dom_server.rb +18 -18
- data/lib/react_native/component/elements.rb +203 -203
- data/lib/react_native/lucid_app/react_native_component_constructor.rb +51 -51
- data/lib/react_native/lucid_component/react_native_component_constructor.rb +37 -37
- data/lib/react_native/lucid_func/react_native_component_constructor.rb +82 -82
- data/lib/react_native/react.rb +120 -120
- metadata +23 -17
|
@@ -1,126 +1,126 @@
|
|
|
1
|
-
module LucidPropDeclaration
|
|
2
|
-
module Mixin
|
|
3
|
-
if RUBY_ENGINE == 'opal'
|
|
4
|
-
def self.extended(base)
|
|
5
|
-
def prop(prop_name, validate_hash = { required: true })
|
|
6
|
-
validate_hash = validate_hash.to_h if validate_hash.class == Isomorfeus::Props::ValidateHashProxy
|
|
7
|
-
if validate_hash.key?(:default)
|
|
8
|
-
%x{
|
|
9
|
-
if (base.lucid_react_component) {
|
|
10
|
-
let react_prop_name = Opal.React.lower_camelize(prop_name);
|
|
11
|
-
#{value = validate_hash[:default]}
|
|
12
|
-
if (!base.lucid_react_component.defaultProps) { base.lucid_react_component.defaultProps = {}; }
|
|
13
|
-
base.lucid_react_component.defaultProps[react_prop_name] = value;
|
|
14
|
-
if (!base.lucid_react_component.propTypes) { base.lucid_react_component.propTypes = {}; }
|
|
15
|
-
base.lucid_react_component.propTypes[react_prop_name] = base.lucid_react_component.prototype.validateProp;
|
|
16
|
-
} else if (base.react_component) {
|
|
17
|
-
let react_prop_name = Opal.React.lower_camelize(prop_name);
|
|
18
|
-
#{value = validate_hash[:default]}
|
|
19
|
-
if (!base.react_component.defaultProps) { base.react_component.defaultProps = {}; }
|
|
20
|
-
base.react_component.defaultProps[react_prop_name] = value;
|
|
21
|
-
if (!base.react_component.propTypes) { base.react_component.propTypes = {}; }
|
|
22
|
-
base.react_component.propTypes[react_prop_name] = base.react_component.prototype.validateProp;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
end
|
|
26
|
-
declared_props[prop_name.to_sym] = validate_hash
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def validate_function
|
|
31
|
-
%x{
|
|
32
|
-
if (typeof self.validate_function === 'undefined') {
|
|
33
|
-
self.validate_function = function(props_object) {
|
|
34
|
-
try { self.$validate_props(Opal.Hash.$new(props_object)) }
|
|
35
|
-
catch (e) { return e.message; }
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return self.validate_function;
|
|
39
|
-
}
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def validate_prop_function(prop)
|
|
43
|
-
function_name = "validate_#{prop}_function"
|
|
44
|
-
%x{
|
|
45
|
-
if (typeof self[function_name] === 'undefined') {
|
|
46
|
-
self[function_name] = function(value) {
|
|
47
|
-
try { self.$validate_prop(prop, value); }
|
|
48
|
-
catch (e) { return e.message; }
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return self[function_name];
|
|
52
|
-
}
|
|
53
|
-
end
|
|
54
|
-
else
|
|
55
|
-
def prop(prop_name, validate_hash = { required: true })
|
|
56
|
-
validate_hash = validate_hash.to_h if validate_hash.class == Isomorfeus::Props::ValidateHashProxy
|
|
57
|
-
declared_props[prop_name.to_sym] = validate_hash
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def declared_props
|
|
62
|
-
@declared_props ||= {}
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def valid_prop?(prop, value)
|
|
66
|
-
validate_prop(prop, value)
|
|
67
|
-
rescue
|
|
68
|
-
false
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def valid_props?(props)
|
|
72
|
-
validate_props(props)
|
|
73
|
-
rescue
|
|
74
|
-
false
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
def validate
|
|
78
|
-
Isomorfeus::Props::ValidateHashProxy.new
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
def validate_prop(prop, value)
|
|
82
|
-
return false unless declared_props.key?(prop)
|
|
83
|
-
validator = Isomorfeus::Props::Validator.new(self, prop, value, declared_props[prop])
|
|
84
|
-
validator.validate!
|
|
85
|
-
true
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def validate_props(props)
|
|
89
|
-
props = {} unless props
|
|
90
|
-
declared_props.each_key do |prop|
|
|
91
|
-
if declared_props[prop].key?(:required) && declared_props[prop][:required] && !props.key?(prop)
|
|
92
|
-
Isomorfeus.raise_error(message: "Required prop #{prop} not given!")
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
result = true
|
|
96
|
-
props.each do |p, v|
|
|
97
|
-
r = validate_prop(p, v)
|
|
98
|
-
result = false unless r
|
|
99
|
-
end
|
|
100
|
-
result
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def validated_prop(prop, value)
|
|
104
|
-
Isomorfeus.raise_error(message: "No such prop #{prop} declared!") unless declared_props.key?(prop)
|
|
105
|
-
validator = Isomorfeus::Props::Validator.new(self, prop, value, declared_props[prop])
|
|
106
|
-
validator.validated_value
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
def validated_props(props)
|
|
110
|
-
props = {} unless props
|
|
111
|
-
|
|
112
|
-
declared_props.each_key do |prop|
|
|
113
|
-
if declared_props[prop].key?(:required) && declared_props[prop][:required] && !props.key?(prop)
|
|
114
|
-
Isomorfeus.raise_error(message: "Required prop #{prop} not given!")
|
|
115
|
-
end
|
|
116
|
-
props[prop] = nil unless props.key?(prop) # let validator handle value
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
result = {}
|
|
120
|
-
props.each do |p, v|
|
|
121
|
-
result[p] = validated_prop(p, v)
|
|
122
|
-
end
|
|
123
|
-
result
|
|
124
|
-
end
|
|
125
|
-
end
|
|
126
|
-
end
|
|
1
|
+
module LucidPropDeclaration
|
|
2
|
+
module Mixin
|
|
3
|
+
if RUBY_ENGINE == 'opal'
|
|
4
|
+
def self.extended(base)
|
|
5
|
+
def prop(prop_name, validate_hash = { required: true })
|
|
6
|
+
validate_hash = validate_hash.to_h if validate_hash.class == Isomorfeus::Props::ValidateHashProxy
|
|
7
|
+
if validate_hash.key?(:default)
|
|
8
|
+
%x{
|
|
9
|
+
if (base.lucid_react_component) {
|
|
10
|
+
let react_prop_name = Opal.React.lower_camelize(prop_name);
|
|
11
|
+
#{value = validate_hash[:default]}
|
|
12
|
+
if (!base.lucid_react_component.defaultProps) { base.lucid_react_component.defaultProps = {}; }
|
|
13
|
+
base.lucid_react_component.defaultProps[react_prop_name] = value;
|
|
14
|
+
if (!base.lucid_react_component.propTypes) { base.lucid_react_component.propTypes = {}; }
|
|
15
|
+
base.lucid_react_component.propTypes[react_prop_name] = base.lucid_react_component.prototype.validateProp;
|
|
16
|
+
} else if (base.react_component) {
|
|
17
|
+
let react_prop_name = Opal.React.lower_camelize(prop_name);
|
|
18
|
+
#{value = validate_hash[:default]}
|
|
19
|
+
if (!base.react_component.defaultProps) { base.react_component.defaultProps = {}; }
|
|
20
|
+
base.react_component.defaultProps[react_prop_name] = value;
|
|
21
|
+
if (!base.react_component.propTypes) { base.react_component.propTypes = {}; }
|
|
22
|
+
base.react_component.propTypes[react_prop_name] = base.react_component.prototype.validateProp;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
end
|
|
26
|
+
declared_props[prop_name.to_sym] = validate_hash
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def validate_function
|
|
31
|
+
%x{
|
|
32
|
+
if (typeof self.validate_function === 'undefined') {
|
|
33
|
+
self.validate_function = function(props_object) {
|
|
34
|
+
try { self.$validate_props(Opal.Hash.$new(props_object)) }
|
|
35
|
+
catch (e) { return e.message; }
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return self.validate_function;
|
|
39
|
+
}
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def validate_prop_function(prop)
|
|
43
|
+
function_name = "validate_#{prop}_function"
|
|
44
|
+
%x{
|
|
45
|
+
if (typeof self[function_name] === 'undefined') {
|
|
46
|
+
self[function_name] = function(value) {
|
|
47
|
+
try { self.$validate_prop(prop, value); }
|
|
48
|
+
catch (e) { return e.message; }
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return self[function_name];
|
|
52
|
+
}
|
|
53
|
+
end
|
|
54
|
+
else
|
|
55
|
+
def prop(prop_name, validate_hash = { required: true })
|
|
56
|
+
validate_hash = validate_hash.to_h if validate_hash.class == Isomorfeus::Props::ValidateHashProxy
|
|
57
|
+
declared_props[prop_name.to_sym] = validate_hash
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def declared_props
|
|
62
|
+
@declared_props ||= {}
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def valid_prop?(prop, value)
|
|
66
|
+
validate_prop(prop, value)
|
|
67
|
+
rescue
|
|
68
|
+
false
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def valid_props?(props)
|
|
72
|
+
validate_props(props)
|
|
73
|
+
rescue
|
|
74
|
+
false
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def validate
|
|
78
|
+
Isomorfeus::Props::ValidateHashProxy.new
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def validate_prop(prop, value)
|
|
82
|
+
return false unless declared_props.key?(prop)
|
|
83
|
+
validator = Isomorfeus::Props::Validator.new(self, prop, value, declared_props[prop])
|
|
84
|
+
validator.validate!
|
|
85
|
+
true
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def validate_props(props)
|
|
89
|
+
props = {} unless props
|
|
90
|
+
declared_props.each_key do |prop|
|
|
91
|
+
if declared_props[prop].key?(:required) && declared_props[prop][:required] && !props.key?(prop)
|
|
92
|
+
Isomorfeus.raise_error(message: "Required prop #{prop} not given!")
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
result = true
|
|
96
|
+
props.each do |p, v|
|
|
97
|
+
r = validate_prop(p, v)
|
|
98
|
+
result = false unless r
|
|
99
|
+
end
|
|
100
|
+
result
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def validated_prop(prop, value)
|
|
104
|
+
Isomorfeus.raise_error(message: "No such prop #{prop} declared!") unless declared_props.key?(prop)
|
|
105
|
+
validator = Isomorfeus::Props::Validator.new(self, prop, value, declared_props[prop])
|
|
106
|
+
validator.validated_value
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def validated_props(props)
|
|
110
|
+
props = {} unless props
|
|
111
|
+
|
|
112
|
+
declared_props.each_key do |prop|
|
|
113
|
+
if declared_props[prop].key?(:required) && declared_props[prop][:required] && !props.key?(prop)
|
|
114
|
+
Isomorfeus.raise_error(message: "Required prop #{prop} not given!")
|
|
115
|
+
end
|
|
116
|
+
props[prop] = nil unless props.key?(prop) # let validator handle value
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
result = {}
|
|
120
|
+
props.each do |p, v|
|
|
121
|
+
result[p] = validated_prop(p, v)
|
|
122
|
+
end
|
|
123
|
+
result
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
data/lib/react/children.rb
CHANGED
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
module React
|
|
2
|
-
module Children
|
|
3
|
-
class << self
|
|
4
|
-
def count(children)
|
|
5
|
-
`Opal.global.React.Children.count(children)`
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
def for_each(children, &block)
|
|
9
|
-
%x{
|
|
10
|
-
var fun = function(child) {
|
|
11
|
-
#{block.call(child)};
|
|
12
|
-
}
|
|
13
|
-
Opal.global.React.Children.forEach(children, fun);
|
|
14
|
-
}
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def map(children, &block)
|
|
18
|
-
%x{
|
|
19
|
-
var fun = function(child) {
|
|
20
|
-
return #{block.call(child)};
|
|
21
|
-
}
|
|
22
|
-
return Opal.global.React.Children.map(children, fun);
|
|
23
|
-
}
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def only(children)
|
|
27
|
-
`Opal.global.React.Children.only(children)`
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def to_array(children)
|
|
31
|
-
`Opal.global.React.Children.toArray(children)`
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
1
|
+
module React
|
|
2
|
+
module Children
|
|
3
|
+
class << self
|
|
4
|
+
def count(children)
|
|
5
|
+
`Opal.global.React.Children.count(children)`
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def for_each(children, &block)
|
|
9
|
+
%x{
|
|
10
|
+
var fun = function(child) {
|
|
11
|
+
#{block.call(child)};
|
|
12
|
+
}
|
|
13
|
+
Opal.global.React.Children.forEach(children, fun);
|
|
14
|
+
}
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def map(children, &block)
|
|
18
|
+
%x{
|
|
19
|
+
var fun = function(child) {
|
|
20
|
+
return #{block.call(child)};
|
|
21
|
+
}
|
|
22
|
+
return Opal.global.React.Children.map(children, fun);
|
|
23
|
+
}
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def only(children)
|
|
27
|
+
`Opal.global.React.Children.only(children)`
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def to_array(children)
|
|
31
|
+
`Opal.global.React.Children.toArray(children)`
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
35
|
end
|
data/lib/react/component/api.rb
CHANGED
|
@@ -1,134 +1,134 @@
|
|
|
1
|
-
module React
|
|
2
|
-
module Component
|
|
3
|
-
module Api
|
|
4
|
-
def self.included(base)
|
|
5
|
-
base.instance_exec do
|
|
6
|
-
base_module = base.to_s.deconstantize
|
|
7
|
-
if base_module != ''
|
|
8
|
-
base_module.constantize.define_singleton_method(base.to_s.demodulize) do |*args, &block|
|
|
9
|
-
`Opal.React.internal_prepare_args_and_render(#{base}.react_component, args, block)`
|
|
10
|
-
end
|
|
11
|
-
else
|
|
12
|
-
Object.define_method(base.to_s) do |*args, &block|
|
|
13
|
-
`Opal.React.internal_prepare_args_and_render(#{base}.react_component, args, block)`
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
attr_accessor :props
|
|
18
|
-
attr_accessor :state
|
|
19
|
-
|
|
20
|
-
def ref(ref_name, &block)
|
|
21
|
-
defined_refs.JS[ref_name] = block_given? ? block : `null`
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def defined_refs
|
|
25
|
-
@defined_ref ||= `{}`
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def default_state_defined
|
|
29
|
-
@default_state_defined
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def state
|
|
33
|
-
return @default_state if @default_state
|
|
34
|
-
@default_state_defined = true
|
|
35
|
-
%x{
|
|
36
|
-
var native_state = {state: {}};
|
|
37
|
-
native_state.setState = function(new_state, callback) {
|
|
38
|
-
for (var key in new_state) {
|
|
39
|
-
this.state[key] = new_state[key];
|
|
40
|
-
}
|
|
41
|
-
if (callback) { callback.call(); }
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
@default_state = React::Component::State.new(`native_state`)
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def render(&block)
|
|
48
|
-
`base.render_block = block`
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def should_component_update?(&block)
|
|
52
|
-
`base.should_component_update_block = block`
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def display_name
|
|
58
|
-
@native.JS[:displayName]
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def force_update(&block)
|
|
62
|
-
if block_given?
|
|
63
|
-
# this maybe needs instance_exec too
|
|
64
|
-
@native.JS.forceUpdate(`function() { block.$call(); }`)
|
|
65
|
-
else
|
|
66
|
-
@native.JS.forceUpdate
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def component_fun(class_name, **ruby_props)
|
|
71
|
-
%x{
|
|
72
|
-
return function(props) {
|
|
73
|
-
let outer_props = Opal.React.to_native_react_props(#{ruby_props});
|
|
74
|
-
let new_props = Object.assign({}, props, outer_props);
|
|
75
|
-
return Opal.global.React.createElement(#{class_name.constantize}.react_component, new_props)
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def get_react_element(arg, &block)
|
|
81
|
-
if block_given?
|
|
82
|
-
# execute block, fetch last element from buffer
|
|
83
|
-
%x{
|
|
84
|
-
let last_buffer_length = Opal.React.render_buffer[Opal.React.render_buffer.length - 1].length;
|
|
85
|
-
let last_buffer_element = Opal.React.render_buffer[Opal.React.render_buffer.length - 1][last_buffer_length - 1];
|
|
86
|
-
block.$call();
|
|
87
|
-
// console.log("get_react_element popping", Opal.React.render_buffer, Opal.React.render_buffer.toString())
|
|
88
|
-
let new_element = Opal.React.render_buffer[Opal.React.render_buffer.length - 1].pop();
|
|
89
|
-
if (last_buffer_element === new_element) { #{Isomorfeus.raise_error(message: "Block did not create any React element!")} }
|
|
90
|
-
return new_element;
|
|
91
|
-
}
|
|
92
|
-
else
|
|
93
|
-
# element was rendered before being passed as arg
|
|
94
|
-
# fetch last element from buffer
|
|
95
|
-
# `console.log("get_react_element popping", Opal.React.render_buffer, Opal.React.render_buffer.toString())`
|
|
96
|
-
`Opal.React.render_buffer[Opal.React.render_buffer.length - 1].pop()`
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
alias gre get_react_element
|
|
100
|
-
|
|
101
|
-
def method_ref(method_symbol, *args)
|
|
102
|
-
method_key = "#{method_symbol}#{args}"
|
|
103
|
-
%x{
|
|
104
|
-
if (#@native.method_refs && #@native.method_refs[#{method_key}]) { return #@native.method_refs[#{method_key}]; }
|
|
105
|
-
if (!#@native.method_refs) { #@native.method_refs = {}; }
|
|
106
|
-
#@native.method_refs[#{method_key}] = { m: #{method(method_symbol)}, a: args };
|
|
107
|
-
return #@native.method_refs[#{method_key}];
|
|
108
|
-
}
|
|
109
|
-
end
|
|
110
|
-
alias m_ref method_ref
|
|
111
|
-
|
|
112
|
-
def render_react_element(el)
|
|
113
|
-
# push el to buffer
|
|
114
|
-
`Opal.React.render_buffer[Opal.React.render_buffer.length - 1].push(el)`
|
|
115
|
-
# `console.log("render_react_element pushed", Opal.React.render_buffer, Opal.React.render_buffer.toString())`
|
|
116
|
-
nil
|
|
117
|
-
end
|
|
118
|
-
alias rre render_react_element
|
|
119
|
-
|
|
120
|
-
def ref(name)
|
|
121
|
-
`#@native[name]`
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
def ruby_ref(name)
|
|
125
|
-
return `#@native[name]` if `(typeof #@native[name] === 'function')`
|
|
126
|
-
React::Ref::new(`#@native[name]`)
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
def set_state(updater, &callback)
|
|
130
|
-
@state.set_state(updater, &callback)
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
end
|
|
134
|
-
end
|
|
1
|
+
module React
|
|
2
|
+
module Component
|
|
3
|
+
module Api
|
|
4
|
+
def self.included(base)
|
|
5
|
+
base.instance_exec do
|
|
6
|
+
base_module = base.to_s.deconstantize
|
|
7
|
+
if base_module != ''
|
|
8
|
+
base_module.constantize.define_singleton_method(base.to_s.demodulize) do |*args, &block|
|
|
9
|
+
`Opal.React.internal_prepare_args_and_render(#{base}.react_component, args, block)`
|
|
10
|
+
end
|
|
11
|
+
else
|
|
12
|
+
Object.define_method(base.to_s) do |*args, &block|
|
|
13
|
+
`Opal.React.internal_prepare_args_and_render(#{base}.react_component, args, block)`
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
attr_accessor :props
|
|
18
|
+
attr_accessor :state
|
|
19
|
+
|
|
20
|
+
def ref(ref_name, &block)
|
|
21
|
+
defined_refs.JS[ref_name] = block_given? ? block : `null`
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def defined_refs
|
|
25
|
+
@defined_ref ||= `{}`
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def default_state_defined
|
|
29
|
+
@default_state_defined
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def state
|
|
33
|
+
return @default_state if @default_state
|
|
34
|
+
@default_state_defined = true
|
|
35
|
+
%x{
|
|
36
|
+
var native_state = {state: {}};
|
|
37
|
+
native_state.setState = function(new_state, callback) {
|
|
38
|
+
for (var key in new_state) {
|
|
39
|
+
this.state[key] = new_state[key];
|
|
40
|
+
}
|
|
41
|
+
if (callback) { callback.call(); }
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
@default_state = React::Component::State.new(`native_state`)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def render(&block)
|
|
48
|
+
`base.render_block = #{block}`
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def should_component_update?(&block)
|
|
52
|
+
`base.should_component_update_block = block`
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def display_name
|
|
58
|
+
@native.JS[:displayName]
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def force_update(&block)
|
|
62
|
+
if block_given?
|
|
63
|
+
# this maybe needs instance_exec too
|
|
64
|
+
@native.JS.forceUpdate(`function() { block.$call(); }`)
|
|
65
|
+
else
|
|
66
|
+
@native.JS.forceUpdate
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def component_fun(class_name, **ruby_props)
|
|
71
|
+
%x{
|
|
72
|
+
return function(props) {
|
|
73
|
+
let outer_props = Opal.React.to_native_react_props(#{ruby_props});
|
|
74
|
+
let new_props = Object.assign({}, props, outer_props);
|
|
75
|
+
return Opal.global.React.createElement(#{class_name.constantize}.react_component, new_props)
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def get_react_element(arg, &block)
|
|
81
|
+
if block_given?
|
|
82
|
+
# execute block, fetch last element from buffer
|
|
83
|
+
%x{
|
|
84
|
+
let last_buffer_length = Opal.React.render_buffer[Opal.React.render_buffer.length - 1].length;
|
|
85
|
+
let last_buffer_element = Opal.React.render_buffer[Opal.React.render_buffer.length - 1][last_buffer_length - 1];
|
|
86
|
+
block.$call();
|
|
87
|
+
// console.log("get_react_element popping", Opal.React.render_buffer, Opal.React.render_buffer.toString())
|
|
88
|
+
let new_element = Opal.React.render_buffer[Opal.React.render_buffer.length - 1].pop();
|
|
89
|
+
if (last_buffer_element === new_element) { #{Isomorfeus.raise_error(message: "Block did not create any React element!")} }
|
|
90
|
+
return new_element;
|
|
91
|
+
}
|
|
92
|
+
else
|
|
93
|
+
# element was rendered before being passed as arg
|
|
94
|
+
# fetch last element from buffer
|
|
95
|
+
# `console.log("get_react_element popping", Opal.React.render_buffer, Opal.React.render_buffer.toString())`
|
|
96
|
+
`Opal.React.render_buffer[Opal.React.render_buffer.length - 1].pop()`
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
alias gre get_react_element
|
|
100
|
+
|
|
101
|
+
def method_ref(method_symbol, *args)
|
|
102
|
+
method_key = "#{method_symbol}#{args}"
|
|
103
|
+
%x{
|
|
104
|
+
if (#@native.method_refs && #@native.method_refs[#{method_key}]) { return #@native.method_refs[#{method_key}]; }
|
|
105
|
+
if (!#@native.method_refs) { #@native.method_refs = {}; }
|
|
106
|
+
#@native.method_refs[#{method_key}] = { m: #{method(method_symbol)}, a: args };
|
|
107
|
+
return #@native.method_refs[#{method_key}];
|
|
108
|
+
}
|
|
109
|
+
end
|
|
110
|
+
alias m_ref method_ref
|
|
111
|
+
|
|
112
|
+
def render_react_element(el)
|
|
113
|
+
# push el to buffer
|
|
114
|
+
`Opal.React.render_buffer[Opal.React.render_buffer.length - 1].push(el)`
|
|
115
|
+
# `console.log("render_react_element pushed", Opal.React.render_buffer, Opal.React.render_buffer.toString())`
|
|
116
|
+
nil
|
|
117
|
+
end
|
|
118
|
+
alias rre render_react_element
|
|
119
|
+
|
|
120
|
+
def ref(name)
|
|
121
|
+
`#@native[name]`
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def ruby_ref(name)
|
|
125
|
+
return `#@native[name]` if `(typeof #@native[name] === 'function')`
|
|
126
|
+
React::Ref::new(`#@native[name]`)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def set_state(updater, &callback)
|
|
130
|
+
@state.set_state(updater, &callback)
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
data/lib/react/component/base.rb
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
module React
|
|
2
|
-
module Component
|
|
3
|
-
class Base
|
|
4
|
-
def self.inherited(base)
|
|
5
|
-
base.include(::React::Component::Mixin)
|
|
6
|
-
end
|
|
7
|
-
end
|
|
8
|
-
end
|
|
1
|
+
module React
|
|
2
|
+
module Component
|
|
3
|
+
class Base
|
|
4
|
+
def self.inherited(base)
|
|
5
|
+
base.include(::React::Component::Mixin)
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
9
|
end
|