isomorfeus-react 16.9.24 → 16.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. metadata +3 -85
  3. data/README.md +0 -64
  4. data/lib/browser/delegate_native.rb +0 -70
  5. data/lib/browser/element.rb +0 -176
  6. data/lib/browser/element/canvas.rb +0 -17
  7. data/lib/browser/element/media.rb +0 -78
  8. data/lib/browser/event.rb +0 -92
  9. data/lib/browser/event_target.rb +0 -39
  10. data/lib/browser/file_list.rb +0 -125
  11. data/lib/browser/iterable.rb +0 -15
  12. data/lib/isomorfeus-react-material-ui.rb +0 -10
  13. data/lib/isomorfeus-react.rb +0 -145
  14. data/lib/isomorfeus/config.rb +0 -130
  15. data/lib/isomorfeus/props/validate_hash_proxy.rb +0 -178
  16. data/lib/isomorfeus/props/validator.rb +0 -131
  17. data/lib/isomorfeus/react_view_helper.rb +0 -130
  18. data/lib/isomorfeus/top_level.rb +0 -86
  19. data/lib/isomorfeus/top_level_ssr.rb +0 -28
  20. data/lib/lucid_app/api.rb +0 -30
  21. data/lib/lucid_app/base.rb +0 -7
  22. data/lib/lucid_app/context.rb +0 -7
  23. data/lib/lucid_app/mixin.rb +0 -20
  24. data/lib/lucid_app/native_component_constructor.rb +0 -105
  25. data/lib/lucid_component/app_store_defaults.rb +0 -36
  26. data/lib/lucid_component/app_store_proxy.rb +0 -38
  27. data/lib/lucid_component/base.rb +0 -7
  28. data/lib/lucid_component/class_store_proxy.rb +0 -41
  29. data/lib/lucid_component/component_class_store_defaults.rb +0 -38
  30. data/lib/lucid_component/component_instance_store_defaults.rb +0 -35
  31. data/lib/lucid_component/event_handler.rb +0 -17
  32. data/lib/lucid_component/initializer.rb +0 -12
  33. data/lib/lucid_component/instance_store_proxy.rb +0 -45
  34. data/lib/lucid_component/mixin.rb +0 -18
  35. data/lib/lucid_component/native_component_constructor.rb +0 -116
  36. data/lib/lucid_component/reducers.rb +0 -48
  37. data/lib/lucid_component/store_api.rb +0 -38
  38. data/lib/lucid_component/styles_support.rb +0 -37
  39. data/lib/lucid_material/app/base.rb +0 -9
  40. data/lib/lucid_material/app/mixin.rb +0 -22
  41. data/lib/lucid_material/app/native_component_constructor.rb +0 -107
  42. data/lib/lucid_material/component/base.rb +0 -9
  43. data/lib/lucid_material/component/mixin.rb +0 -20
  44. data/lib/lucid_material/component/native_component_constructor.rb +0 -118
  45. data/lib/lucid_prop_declaration/mixin.rb +0 -91
  46. data/lib/react.rb +0 -195
  47. data/lib/react/active_support_support.rb +0 -13
  48. data/lib/react/children.rb +0 -35
  49. data/lib/react/component/api.rb +0 -80
  50. data/lib/react/component/base.rb +0 -9
  51. data/lib/react/component/callbacks.rb +0 -106
  52. data/lib/react/component/elements.rb +0 -60
  53. data/lib/react/component/event_handler.rb +0 -19
  54. data/lib/react/component/features.rb +0 -47
  55. data/lib/react/component/history.rb +0 -36
  56. data/lib/react/component/initializer.rb +0 -11
  57. data/lib/react/component/location.rb +0 -15
  58. data/lib/react/component/match.rb +0 -31
  59. data/lib/react/component/mixin.rb +0 -19
  60. data/lib/react/component/native_component_constructor.rb +0 -93
  61. data/lib/react/component/props.rb +0 -59
  62. data/lib/react/component/resolution.rb +0 -70
  63. data/lib/react/component/should_component_update.rb +0 -14
  64. data/lib/react/component/state.rb +0 -52
  65. data/lib/react/component/styles.rb +0 -27
  66. data/lib/react/component/unsafe_api.rb +0 -33
  67. data/lib/react/context_wrapper.rb +0 -46
  68. data/lib/react/function_component/api.rb +0 -63
  69. data/lib/react/function_component/base.rb +0 -9
  70. data/lib/react/function_component/creator.rb +0 -32
  71. data/lib/react/function_component/event_handler.rb +0 -13
  72. data/lib/react/function_component/mixin.rb +0 -14
  73. data/lib/react/function_component/resolution.rb +0 -62
  74. data/lib/react/memo_component/base.rb +0 -9
  75. data/lib/react/memo_component/creator.rb +0 -32
  76. data/lib/react/memo_component/mixin.rb +0 -14
  77. data/lib/react/native_constant_wrapper.rb +0 -26
  78. data/lib/react/pure_component/base.rb +0 -9
  79. data/lib/react/pure_component/mixin.rb +0 -18
  80. data/lib/react/ref.rb +0 -13
  81. data/lib/react/synthetic_event.rb +0 -53
  82. data/lib/react/version.rb +0 -3
  83. data/lib/react_dom.rb +0 -47
  84. data/lib/react_dom_server.rb +0 -19
@@ -1,86 +0,0 @@
1
- module Isomorfeus
2
- class TopLevel
3
- class << self
4
- def mount!
5
- Isomorfeus.init
6
- Isomorfeus::TopLevel.on_ready do
7
- root_element = `document.querySelector('div[data-iso-root]')`
8
- component_name = root_element.JS.getAttribute('data-iso-root')
9
- Isomorfeus.env = root_element.JS.getAttribute('data-iso-env')
10
- component = nil
11
- begin
12
- component = component_name.constantize
13
- rescue Exception
14
- @timeout_start = Time.now unless @timeout_start
15
- if (Time.now - @timeout_start) < 10
16
- `setTimeout(Opal.Isomorfeus.TopLevel['$mount!'], 100)`
17
- else
18
- `console.error("Unable to mount '" + #{component_name} + "'!")`
19
- end
20
- end
21
- if component
22
- props_json = root_element.JS.getAttribute('data-iso-props')
23
- props = `Opal.Hash.$new(JSON.parse(props_json))`
24
- hydrated = root_element.JS.getAttribute('data-iso-hydrated')
25
- state_json = root_element.JS.getAttribute('data-iso-state')
26
- if state_json
27
- %x{
28
- var state = JSON.parse(state_json);
29
- var keys = Object.keys(state);
30
- for(var i=0; i < keys.length; i++) {
31
- global.Opal.Isomorfeus.store.native.dispatch({ type: keys[i].toUpperCase(), set_state: state[keys[i]] });
32
- }
33
- }
34
- end
35
- begin
36
- Isomorfeus::TopLevel.mount_component(component, props, root_element, hydrated)
37
- rescue Exception
38
- @timeout_start = Time.now unless @timeout_start
39
- if (Time.now - @timeout_start) < 10
40
- `setTimeout(Opal.Isomorfeus.TopLevel['$mount!'], 100)`
41
- else
42
- `console.error("Unable to mount '" + #{component_name} + "'!")`
43
- end
44
- end
45
- end
46
- end
47
- end
48
-
49
- def on_ready(&block)
50
- # this looks a bit odd but works across _all_ browsers, and no event handler mess
51
- %x{
52
- function run() { block.$call() };
53
- function ready_fun() {
54
- /in/.test(document.readyState) ? setTimeout(ready_fun,5) : run();
55
- }
56
- ready_fun();
57
- }
58
- end
59
-
60
- def on_ready_mount(component, props = nil, element_query = nil)
61
- # init in case it hasn't been run yet
62
- Isomorfeus.init
63
- on_ready do
64
- Isomorfeus::TopLevel.mount_component(component, props, element_query)
65
- end
66
- end
67
-
68
- def mount_component(component, props, element_or_query, hydrated = false)
69
- if `(typeof element_or_query === 'string')` || (`(typeof element_or_query.$class === 'function')` && element_or_query.class == String)
70
- element = `document.body.querySelector(element_or_query)`
71
- elsif `(typeof element_or_query.$is_a === 'function')` && element_or_query.is_a?(Browser::Element)
72
- element = element_or_query.to_n
73
- else
74
- element = element_or_query
75
- end
76
-
77
- top = if hydrated
78
- ReactDOM.hydrate(React.create_element(component, props), element)
79
- else
80
- ReactDOM.render(React.create_element(component, props), element)
81
- end
82
- Isomorfeus.top_component = top if top
83
- end
84
- end
85
- end
86
- end
@@ -1,28 +0,0 @@
1
- module Isomorfeus
2
- class TopLevel
3
- class << self
4
- attr_accessor :ssr_route_path
5
- attr_accessor :transport_ws_url
6
-
7
- def mount!
8
- # nothing, but keep it for compatibility with browser
9
- end
10
-
11
- def render_component_to_string(component_name, props)
12
- component = nil
13
- %x{
14
- if (typeof component_name === 'string' || component_name instanceof String) {
15
- component = component_name.split(".").reduce(function(o, x) {
16
- return (o !== null && typeof o[x] !== "undefined" && o[x] !== null) ? o[x] : null;
17
- }, Opal.global)
18
- } else {
19
- component = component_name;
20
- }
21
- }
22
- component = Isomorfeus.cached_component_class(component_name) unless component
23
-
24
- ReactDOMServer.render_to_string(React.create_element(component, `Opal.Hash.$new(props)`))
25
- end
26
- end
27
- end
28
- end
@@ -1,30 +0,0 @@
1
- module LucidApp
2
- module API
3
- def self.included(base)
4
- base.instance_exec do
5
- def theme(theme_hash = nil, &block)
6
- if block_given?
7
- %x{
8
- let result = block.$call(Opal.Hash.$new(base.jss_theme));
9
- if (typeof result.$to_n === 'function') { base.jss_theme = result.$to_n(); }
10
- else { base.jss_theme = result; }
11
- return result;
12
- }
13
- elsif theme_hash
14
- `base.jss_theme = #{theme_hash.to_n}` if theme_hash
15
- theme_hash
16
- elsif `typeof base.jss_theme === 'object'`
17
- `Opal.Hash.$new(base.jss_theme)`
18
- else
19
- nil
20
- end
21
- end
22
- alias_method :theme=, :theme
23
- end
24
-
25
- def context
26
- @native.JS[:context]
27
- end
28
- end
29
- end
30
- end
@@ -1,7 +0,0 @@
1
- module LucidApp
2
- class Base
3
- def self.inherited(base)
4
- base.include(::LucidApp::Mixin)
5
- end
6
- end
7
- end
@@ -1,7 +0,0 @@
1
- module LucidApp
2
- module Context
3
- def self.create_application_context
4
- React.create_context('LucidApplicationContext', Isomorfeus.store)
5
- end
6
- end
7
- end
@@ -1,20 +0,0 @@
1
- module LucidApp
2
- module Mixin
3
- def self.included(base)
4
- base.include(::Native::Wrapper)
5
- base.extend(::LucidApp::NativeComponentConstructor)
6
- base.extend(::LucidPropDeclaration::Mixin)
7
- base.extend(::React::Component::ShouldComponentUpdate)
8
- base.extend(::LucidComponent::EventHandler)
9
- base.include(::React::Component::Elements)
10
- base.include(::React::Component::API)
11
- base.include(::React::Component::Callbacks)
12
- base.include(::LucidComponent::StoreAPI)
13
- base.include(::LucidComponent::StylesSupport)
14
- base.include(::LucidApp::API)
15
- base.include(::LucidComponent::Initializer)
16
- base.include(::React::Component::Features)
17
- base.include(::React::Component::Resolution)
18
- end
19
- end
20
- end
@@ -1,105 +0,0 @@
1
- module LucidApp
2
- module NativeComponentConstructor
3
- # for should_component_update we apply ruby semantics for comparing props
4
- # to do so, we convert the props to ruby hashes and then compare
5
- # this makes sure, that for example rubys Nil object gets handled properly
6
- def self.extended(base)
7
- component_name = base.to_s
8
- # language=JS
9
- %x{
10
- base.lucid_react_component = class extends Opal.global.React.Component {
11
- constructor(props) {
12
- super(props);
13
- if (base.$default_state_defined()) {
14
- this.state = base.$state().$to_n();
15
- } else {
16
- this.state = {};
17
- };
18
- this.state.isomorfeus_store_state = Opal.Isomorfeus.store.native.getState();
19
- var current_store_state = this.state.isomorfeus_store_state;
20
- if (typeof current_store_state.component_class_state[#{component_name}] !== "undefined") {
21
- this.state.component_class_state = {};
22
- this.state.component_class_state[#{component_name}] = current_store_state.component_class_state[#{component_name}];
23
- } else {
24
- this.state.component_class_state = {};
25
- this.state.component_class_state[#{component_name}] = {};
26
- };
27
- this.__ruby_instance = base.$new(this);
28
- this.__object_id = this.__ruby_instance.$object_id().$to_s();
29
- if (Opal.Isomorfeus.$top_component() == nil) { Opal.Isomorfeus['$top_component='](this); }
30
- if (!this.state.component_state) {
31
- this.state.component_state = {};
32
- this.state.component_state[this.__object_id] = {};
33
- };
34
- var event_handlers = #{base.event_handlers};
35
- for (var i = 0; i < event_handlers.length; i++) {
36
- this[event_handlers[i]] = this[event_handlers[i]].bind(this);
37
- }
38
- var defined_refs = #{base.defined_refs};
39
- for (var ref in defined_refs) {
40
- if (defined_refs[ref] != null) {
41
- this[ref] = function(element) {
42
- element = Opal.React.native_element_or_component_to_ruby(element);
43
- #{`this.__ruby_instance`.instance_exec(`element`, &`defined_refs[ref]`)}
44
- }
45
- this[ref] = this[ref].bind(this);
46
- } else {
47
- this[ref] = Opal.global.React.createRef();
48
- }
49
- }
50
- this.listener = this.listener.bind(this);
51
- this.unsubscriber = Opal.Isomorfeus.store.native.subscribe(this.listener);
52
- }
53
- static get displayName() {
54
- return #{component_name};
55
- }
56
- render() {
57
- Opal.React.render_buffer.push([]);
58
- Opal.React.active_components.push(this);
59
- Opal.React.active_redux_components.push(this.__ruby_instance);
60
- #{`this.__ruby_instance`.instance_exec(&`base.render_block`)};
61
- Opal.React.active_redux_components.pop();
62
- Opal.React.active_components.pop();
63
- let children = Opal.React.render_buffer.pop();
64
- return Opal.global.React.createElement(Opal.global.LucidApplicationContext.Provider, { value: this.state.isomorfeus_store_state }, children);
65
- }
66
- listener() {
67
- let next_state = Opal.Isomorfeus.store.native.getState();
68
- this.setState({ isomorfeus_store_state: next_state });
69
- }
70
- componentWillUnmount() {
71
- if (typeof this.unsubscriber === "function") { this.unsubscriber(); };
72
- }
73
- validateProp(props, propName, componentName) {
74
- try { base.$validate_prop(propName, props[propName]) }
75
- catch (e) { return new Error(componentName + ": Error: prop validation failed: " + e.message); }
76
- return null;
77
- }
78
- }
79
- base.jss_styles = null;
80
- base.jss_styles_used = null;
81
- base.jss_theme = {};
82
- base.use_styles = null;
83
- base.themed_react_component = function(props) {
84
- let classes = null;
85
- let theme = Opal.global.ReactJSS.useTheme();
86
- if (base.jss_styles) {
87
- if (!base.use_styles || (Opal.Isomorfeus["$development?"]() && !Object.is(base.jss_styles, base.jss_styles_used))) {
88
- base.jss_styles_used = base.jss_styles;
89
- let styles = base.jss_styles
90
- if (typeof styles === 'function') { styles = styles(theme); }
91
- base.use_styles = Opal.global.ReactJSS.createUseStyles(styles);
92
- }
93
- classes = base.use_styles();
94
- }
95
- let themed_classes_props = Object.assign({}, props, { classes: classes, theme: theme });
96
- return Opal.global.React.createElement(base.lucid_react_component, themed_classes_props);
97
- }
98
- base.react_component = function(props) {
99
- let themed_component = Opal.global.React.createElement(base.themed_react_component, props);
100
- return Opal.global.React.createElement(Opal.global.ReactJSS.ThemeProvider, { theme: base.jss_theme }, themed_component);
101
- }
102
- }
103
- end
104
- end
105
- end
@@ -1,36 +0,0 @@
1
- module LucidComponent
2
- class AppStoreDefaults
3
- def initialize(state, component_name)
4
- @state = state
5
- if @state.isomorfeus_store
6
- @state.isomorfeus_store.merge!(application_state: {})
7
- else
8
- @state.isomorfeus_store = { application_state: {}}
9
- end
10
- end
11
-
12
- def method_missing(key, *args, &block)
13
- if `args.length > 0`
14
- # set initial class state
15
- key = key.chop if `key.endsWith('=')`
16
- @state.isomorfeus_store[:application_state][key] = args[0]
17
- current_state = Isomorfeus.store.get_state
18
- if !(current_state[:application_state].key?(key))
19
- Isomorfeus.store.dispatch(type: 'APPLICATION_STATE', name: key, value: args[0])
20
- end
21
- else
22
- # get class state
23
-
24
- # check if we have a component local state value
25
- if @state.isomorfeus_store[:application_state].key?(key)
26
- return @state.isomorfeus_store[:application_state][key]
27
- end
28
- end
29
- nil
30
- end
31
-
32
- def to_h
33
- @state.isomorfeus_store[:application_state]
34
- end
35
- end
36
- end
@@ -1,38 +0,0 @@
1
- module LucidComponent
2
- class AppStoreProxy
3
- def initialize(component_instance)
4
- @native_component_instance = component_instance.to_n
5
- @component_instance = component_instance
6
- end
7
-
8
- def method_missing(key, *args, &block)
9
- if `args.length > 0`
10
- # set class state, simply a dispatch
11
- action = { type: 'APPLICATION_STATE', name: (`key.endsWith('=')` ? key.chop : key), value: args[0] }
12
- Isomorfeus.store.dispatch(action)
13
- else
14
- # check if we have a component local state value
15
- if `this.native_component_instance.context.application_state.hasOwnProperty(key)`
16
- return @native_component_instance.JS['context'].JS[:application_state].JS[key]
17
- elsif @component_instance.class.default_app_store_defined && @component_instance.class.app_store.to_h.key?(key)
18
- # check if a default value was given
19
- return @component_instance.class.app_store.to_h[key]
20
- end
21
- # otherwise return nil
22
- return nil
23
- end
24
- end
25
-
26
- def dispatch(action)
27
- Isomorfeus.store.dispatch(action)
28
- end
29
-
30
- def subscribe(&block)
31
- Isomorfeus.store.subscribe(&block)
32
- end
33
-
34
- def unsubscribe(unsubscriber)
35
- `unsubscriber()`
36
- end
37
- end
38
- end
@@ -1,7 +0,0 @@
1
- module LucidComponent
2
- class Base
3
- def self.inherited(base)
4
- base.include(::LucidComponent::Mixin)
5
- end
6
- end
7
- end
@@ -1,41 +0,0 @@
1
- module LucidComponent
2
- class ClassStoreProxy
3
- def initialize(component_instance)
4
- @native_component_instance = component_instance.to_n
5
- @component_instance = component_instance
6
- @component_name = component_instance.class.to_s
7
- end
8
-
9
- def method_missing(key, *args, &block)
10
- if `args.length > 0`
11
- # set class state, simply a dispatch
12
- action = { type: 'COMPONENT_CLASS_STATE', class: @component_name, name: (`key.endsWith('=')` ? key.chop : key), value: args[0] }
13
- Isomorfeus.store.dispatch(action)
14
- else
15
- # get class state
16
- # check if we have a component local state value
17
- if @native_component_instance.JS['context'].JS[:component_class_state].JS[@component_name] &&
18
- @native_component_instance.JS['context'].JS[:component_class_state].JS[@component_name].JS.hasOwnProperty(key)
19
- return @native_component_instance.JS['context'].JS[:component_class_state].JS[@component_name].JS[key]
20
- elsif @component_instance.class.default_class_store_defined && @component_instance.class.class_store.to_h.key?(key)
21
- # check if a default value was given
22
- return @component_instance.class.class_store.to_h[key]
23
- end
24
- # otherwise return nil
25
- return nil
26
- end
27
- end
28
-
29
- def dispatch(action)
30
- Isomorfeus.store.dispatch(action)
31
- end
32
-
33
- def subscribe(&block)
34
- Isomorfeus.store.subscribe(&block)
35
- end
36
-
37
- def unsubscribe(unsubscriber)
38
- `unsubscriber()`
39
- end
40
- end
41
- end
@@ -1,38 +0,0 @@
1
- module LucidComponent
2
- class ComponentClassStoreDefaults
3
- def initialize(state, component_name)
4
- @state = state
5
- @component_name = component_name
6
- if @state.isomorfeus_store
7
- @state.isomorfeus_store.merge!(component_class_state: { @component_name => {} })
8
- else
9
- @state.isomorfeus_store = { component_class_state: { @component_name => {} } }
10
- end
11
- end
12
-
13
- def method_missing(key, *args, &block)
14
- if `args.length > 0`
15
- # set initial class state
16
- key = key.chop if `key.endsWith('=')`
17
- @state.isomorfeus_store[:component_class_state][@component_name][key] = args[0]
18
- current_state = Isomorfeus.store.get_state
19
- if !(current_state[:component_class_state].key?(@component_name) && current_state[:component_class_state][@component_name].key?(key))
20
- Isomorfeus.store.dispatch(type: 'COMPONENT_CLASS_STATE', class: @component_name, name: key, value: args[0])
21
- end
22
- else
23
- # get class state
24
-
25
- # check if we have a component local state value
26
-
27
- if @state.isomorfeus_store[:component_class_state][@component_name].key?(key)
28
- return @state.isomorfeus_store[:component_class_state][@component_name][key]
29
- end
30
- end
31
- nil
32
- end
33
-
34
- def to_h
35
- @state.isomorfeus_store[:component_class_state][@component_name]
36
- end
37
- end
38
- end