11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
# File 'lib/react/api.rb', line 11
def self.create_native_react_class(type)
raise "Provided class should define `render` method" if !(type.method_defined? :render)
render_fn = (type.method_defined? :_render_wrapper) ? :_render_wrapper : :render
@@component_classes[type] ||= %x{
React.createClass({
displayName: #{type.name},
propTypes: #{type.respond_to?(:prop_types) ? type.prop_types.to_n : `{}`},
getDefaultProps: function(){
return #{type.respond_to?(:default_props) ? type.default_props.to_n : `{}`};
},
mixins: #{type.respond_to?(:native_mixins) ? type.native_mixins : `[]`},
statics: #{type.respond_to?(:static_call_backs) ? type.static_call_backs.to_n : `{}`},
componentWillMount: function() {
var instance = this._getOpalInstance.apply(this);
return #{`instance`.component_will_mount if type.method_defined? :component_will_mount};
},
componentDidMount: function() {
var instance = this._getOpalInstance.apply(this);
return #{`instance`.component_did_mount if type.method_defined? :component_did_mount};
},
componentWillReceiveProps: function(next_props) {
var instance = this._getOpalInstance.apply(this);
return #{`instance`.component_will_receive_props(`next_props`) if type.method_defined? :component_will_receive_props};
},
shouldComponentUpdate: function(next_props, next_state) {
var instance = this._getOpalInstance.apply(this);
return #{`instance`.should_component_update?(`next_props`, `next_state`) if type.method_defined? :should_component_update?};
},
componentWillUpdate: function(next_props, next_state) {
var instance = this._getOpalInstance.apply(this);
return #{`instance`.component_will_update(`next_props`, `next_state`) if type.method_defined? :component_will_update};
},
componentDidUpdate: function(prev_props, prev_state) {
var instance = this._getOpalInstance.apply(this);
return #{`instance`.component_did_update(`prev_props`, `prev_state`) if type.method_defined? :component_did_update};
},
componentWillUnmount: function() {
var instance = this._getOpalInstance.apply(this);
return #{`instance`.component_will_unmount if type.method_defined? :component_will_unmount};
},
_getOpalInstance: function() {
if (this.__opalInstance == undefined) {
var instance = #{type.new(`this`)};
} else {
var instance = this.__opalInstance;
}
this.__opalInstance = instance;
return instance;
},
render: function() {
var instance = this._getOpalInstance.apply(this);
return #{`instance`.send(render_fn).to_n};
}
})
}
end
|