isomorfeus-react 16.8.9 → 16.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -1
  3. data/lib/browser/delegate_native.rb +70 -0
  4. data/lib/browser/element.rb +176 -0
  5. data/lib/browser/element/canvas.rb +17 -0
  6. data/lib/browser/element/media.rb +78 -0
  7. data/lib/browser/event.rb +92 -0
  8. data/lib/browser/event_target.rb +39 -0
  9. data/lib/browser/file_list.rb +125 -0
  10. data/lib/browser/iterable.rb +15 -0
  11. data/lib/isomorfeus-react-material-ui.rb +1 -31
  12. data/lib/isomorfeus-react.rb +112 -5
  13. data/lib/isomorfeus/execution_environment.rb +8 -2
  14. data/lib/isomorfeus/top_level_browser.rb +1 -1
  15. data/lib/lucid_app/mixin.rb +1 -1
  16. data/lib/lucid_component/app_store_defaults.rb +36 -0
  17. data/lib/lucid_component/app_store_proxy.rb +40 -0
  18. data/lib/lucid_component/class_store_proxy.rb +43 -0
  19. data/lib/lucid_component/component_class_store_defaults.rb +38 -0
  20. data/lib/lucid_component/component_instance_store_defaults.rb +35 -0
  21. data/lib/lucid_component/initializer.rb +3 -3
  22. data/lib/lucid_component/instance_store_proxy.rb +47 -0
  23. data/lib/lucid_component/mixin.rb +1 -1
  24. data/lib/lucid_component/reducers.rb +46 -0
  25. data/lib/lucid_component/store_api.rb +38 -0
  26. data/lib/lucid_material/app/mixin.rb +1 -1
  27. data/lib/lucid_material/component/mixin.rb +1 -1
  28. data/lib/react.rb +1 -2
  29. data/lib/react/component/api.rb +4 -0
  30. data/lib/react/component/features.rb +5 -1
  31. data/lib/react/component/mixin.rb +1 -1
  32. data/lib/react/component/props.rb +1 -1
  33. data/lib/react/function_component/api.rb +5 -25
  34. data/lib/react/pure_component/mixin.rb +1 -1
  35. data/lib/react/synthetic_event.rb +3 -3
  36. data/lib/react/version.rb +1 -1
  37. data/lib/react_dom.rb +1 -1
  38. metadata +22 -36
  39. data/lib/isomorfeus-react-base.rb +0 -57
  40. data/lib/isomorfeus-react-component.rb +0 -20
  41. data/lib/isomorfeus-react-lucid.rb +0 -39
  42. data/lib/isomorfeus-react-redux-component.rb +0 -25
  43. data/lib/react/redux_component/api.rb +0 -40
  44. data/lib/react/redux_component/app_store_defaults.rb +0 -38
  45. data/lib/react/redux_component/app_store_proxy.rb +0 -43
  46. data/lib/react/redux_component/base.rb +0 -9
  47. data/lib/react/redux_component/class_store_proxy.rb +0 -46
  48. data/lib/react/redux_component/component_class_store_defaults.rb +0 -40
  49. data/lib/react/redux_component/component_instance_store_defaults.rb +0 -37
  50. data/lib/react/redux_component/initializer.rb +0 -14
  51. data/lib/react/redux_component/instance_store_proxy.rb +0 -50
  52. data/lib/react/redux_component/mixin.rb +0 -19
  53. data/lib/react/redux_component/native_component_constructor.rb +0 -144
  54. data/lib/react/redux_component/reducers.rb +0 -48
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d87683e6af7a40a9c820e65e73bdca513e770fb22dc298ac1eb5fc643694c8fc
4
- data.tar.gz: ed99bccaffec6a4e3e40f2974b77320f467977f18d04fb3671d3fc8fa7c2db8a
3
+ metadata.gz: a7055c4d0f51f9fe1035227468603837022020c562bab7b75c75dbfce892ccf3
4
+ data.tar.gz: a0fe000bd455105057f9b5136c446a705036240ef5ab322f86b4f5ae9529b1b8
5
5
  SHA512:
6
- metadata.gz: 3d7fa25dd6ba783c514f64a91f8a01e70f39d6a208580c977e92501e6617a6447c5b0d04c0c387abedc6a7f59b2505ab1aeaabf080a9f9168f5af9be2391d3ba
7
- data.tar.gz: 0ce87684545abfcee53fb6e2a3f307e1262c92a3cc1d55fcf9aebbdbe994a07f99c0fa2ce2ff4b3e7628710f692f02a26238b46f619643402ff089985b455133
6
+ metadata.gz: 9f3c731f47da42dfcc9d072b9c7c7d9f676ce1ba33331c6b905d2ac9a66c0905058e693eb7b5426fbee13204786f10a94e6c8a5dba3a3a0a3abb8cbd99ff5e25
7
+ data.tar.gz: eed0e49409eb5bd1f3ce5a29cc2efbbebed244edbf2b978c7284b478e118c3fa5ae70fca87d02cc9d9aefae21cf52431044b542c1b13e3398c5d444a07d814e2
data/README.md CHANGED
@@ -21,7 +21,6 @@ Component Types:
21
21
  - [Class Component](https://github.com/isomorfeus/isomorfeus-react/blob/master/ruby/docs/class_component.md)
22
22
  - [Pure Component](https://github.com/isomorfeus/isomorfeus-react/blob/master/ruby/docs/pure_component.md)
23
23
  - [Function and Memo Component](https://github.com/isomorfeus/isomorfeus-react/blob/master/ruby/docs/function_component.md)
24
- - [Redux Component](https://github.com/isomorfeus/isomorfeus-react/blob/master/ruby/docs/redux_component.md)
25
24
  - [Lucid App, Lucid Component](https://github.com/isomorfeus/isomorfeus-react/blob/master/ruby/docs/lucid_component.md)
26
25
  - [LucidMaterial App, LucidMaterial Component](https://github.com/isomorfeus/isomorfeus-react/blob/master/ruby/docs/lucid_material_component.md) - support for [MaterialUI](https://material-ui.com)
27
26
  - [React Javascript Component](https://github.com/isomorfeus/isomorfeus-react/blob/master/ruby/docs/javascript_component.md)
@@ -0,0 +1,70 @@
1
+ module Browser
2
+ module DelegateNative
3
+ # Provides a default initializer. This should be overridden in all but the
4
+ # simplest cases.
5
+ def initialize native
6
+ @native = native
7
+ end
8
+
9
+ # Fall back to native properties. If the message sent to this element is not
10
+ # recognized, it checks to see if it is a property of the native element. It
11
+ # also checks for variations of the message name, such as:
12
+ #
13
+ # :supported? => [:supported, :isSupported]
14
+ #
15
+ # If a property with the specified message name is found and it is a
16
+ # function, that function is invoked with `args`. Otherwise, the property
17
+ # is returned as is.
18
+ def method_missing message, *args, &block
19
+ property_name = property_for_message(message)
20
+ property = `#@native[#{property_name}]`
21
+
22
+ # translate setting a property
23
+ if message.end_with? '='
24
+ return `#@native[#{property_name}] = args[0]`
25
+ end
26
+
27
+ # If the native element doesn't have this property, bubble it up
28
+ super unless `#{property_name} in #@native`
29
+
30
+ if `property === false`
31
+ return false
32
+ elsif `typeof(property) === 'number' && isNaN(property)`
33
+ return nil
34
+ else
35
+ property = `property == null ? nil : property`
36
+ end
37
+
38
+ # If it's a method, call it. Otherwise, return it.
39
+ if `typeof(property) === 'function'`
40
+ `property.apply(#@native, args)`
41
+ else
42
+ property
43
+ end
44
+ end
45
+
46
+ def respond_to_missing? message, include_all
47
+ return true if message.end_with? '='
48
+ return true if property_for_message(message)
49
+
50
+ false
51
+ end
52
+
53
+ def property_for_message message
54
+ camel_cased_message = message
55
+ .gsub(/_\w/) { |match| `match[1]`.upcase }
56
+ .sub(/=$/, '')
57
+
58
+ # translate `supported?` to `supported` or `isSupported`
59
+ if message.end_with? '?'
60
+ camel_cased_message = camel_cased_message.chop
61
+ property_type = `typeof(#@native[camel_cased_message])`
62
+ if property_type == 'undefined'
63
+ camel_cased_message = "is#{camel_cased_message[0].upcase}#{camel_cased_message[1..-1]}"
64
+ end
65
+ end
66
+
67
+ camel_cased_message
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,176 @@
1
+ module Browser
2
+ autoload :FileList, 'browser/file_list'
3
+ autoload :Iterable, 'browser/iterable'
4
+
5
+ # Wrap a native DOM element
6
+ class Element
7
+ include EventTarget
8
+ include DelegateNative
9
+
10
+ @tags = Hash.new(self)
11
+
12
+ def self.element *tags, &block
13
+ tags.each do |tag|
14
+ @tags
15
+ .fetch(tag) { @tags[tag] = const_set(tag.capitalize, Class.new(self)) }
16
+ .class_exec(&block)
17
+ end
18
+ end
19
+
20
+ def self.new(native)
21
+ element = @tags[`(#{native}.tagName || '')`.downcase].allocate
22
+ element.initialize native
23
+ element
24
+ end
25
+
26
+ # @param native [JS] The native DOM element to wrap
27
+ def initialize native
28
+ @native = native
29
+ end
30
+
31
+ # Replace all child elements with the given element
32
+ #
33
+ # @param element [Browser::Element] The Browser element with which to replace
34
+ # this element's contents
35
+ def inner_dom= element
36
+ clear
37
+ append element
38
+ end
39
+
40
+ # The contents of this element as an HTML string
41
+ #
42
+ # @return [String] the HTML representation of this element's contents
43
+ def inner_html
44
+ `#@native.innerHTML`
45
+ end
46
+
47
+ # Use the supplied HTML string to replace this element's contents
48
+ #
49
+ # @param html [String] the HTML with which to replace this elements contents
50
+ def inner_html= html
51
+ `#@native.innerHTML = html`
52
+ end
53
+
54
+ # This element's direct child elements
55
+ #
56
+ # @return [Array<Browser::Element>] list of this element's children
57
+ def children
58
+ elements = []
59
+
60
+ %x{
61
+ var children = #@native.children;
62
+ for(var i = 0; i < children.length; i++) {
63
+ elements[i] = #{Element.new(`children[i]`)};
64
+ }
65
+ }
66
+
67
+ elements
68
+ end
69
+
70
+ # Determine whether this element has any contents
71
+ #
72
+ # @return [Boolean] true if the element has no children, false otherwise
73
+ def empty?
74
+ `#@native.children.length === 0`
75
+ end
76
+
77
+ # Remove all contents from this element. After this call, `empty?` will
78
+ # return `true`.
79
+ #
80
+ # @return [Browser::Element] self
81
+ def clear
82
+ if %w(input textarea).include? type
83
+ `#@native.value = null`
84
+ else
85
+ children.each do |child|
86
+ remove_child child
87
+ end
88
+ end
89
+
90
+ self
91
+ end
92
+
93
+ # Remove the specified child element
94
+ #
95
+ # @param child [Browser::Element] the child element to remove
96
+ def remove_child child
97
+ `#@native.removeChild(child['native'] ? child['native'] : child)`
98
+ end
99
+
100
+ # This element's type. For example: "div", "span", "p"
101
+ #
102
+ # @return [String] the HTML tag name for this element
103
+ def type
104
+ `#@native.nodeName`.downcase
105
+ end
106
+
107
+ # Append the specified element as a child element
108
+ #
109
+ # @param element [Browser::Element, JS] the element to insert
110
+ def append node
111
+ `#@native.appendChild(node['native'] ? node['native'] : node)`
112
+ self
113
+ end
114
+
115
+ # Methods for <input /> elements
116
+
117
+ # A checkbox's checked status
118
+ #
119
+ # @return [Boolean] true if the checkbox is checked, false otherwise
120
+ def checked?
121
+ `!!#@native.checked`
122
+ end
123
+
124
+ # Get the currently selected file for this input. This is only useful for
125
+ # file inputs without the `multiple` property set.
126
+ #
127
+ # @return [Browser::File] the file selected by the user
128
+ def file
129
+ files.first
130
+ end
131
+
132
+ # Get the currently selected files for this input. This is only useful for
133
+ # file inputs with the `multiple` property set.
134
+ #
135
+ # @return [Browser::FileList] the currently selected files for this input
136
+ def files
137
+ FileList.new(`#@native.files`)
138
+ end
139
+
140
+ # Determine whether this is the same element
141
+ #
142
+ # @return [boolean] true if the element is the same, false otherwise
143
+ def ==(other)
144
+ `#@native === #{other.to_n}`
145
+ end
146
+
147
+ # Set the specified attribute to the specified value
148
+ def []= attribute, value
149
+ `#@native.setAttribute(#{attribute}, #{value})`
150
+ end
151
+
152
+ # Return the specified attribute
153
+ #
154
+ # @return [String] the value for the specified attribute
155
+ def [] attribute
156
+ `#@native.getAttribute(#{attribute})`
157
+ end
158
+
159
+ def query_selector selector
160
+ result = super
161
+
162
+ Element.new(result) if result
163
+ end
164
+
165
+ def query_selector_all selector
166
+ Iterable.new(super).map { |element| Element.new(element) }
167
+ end
168
+
169
+ # The native representation of this element.
170
+ #
171
+ # @return [JS] the native element wrapped by this object.
172
+ def to_n
173
+ @native
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,17 @@
1
+ module Browser
2
+ class Element
3
+ element :canvas do
4
+ def context(type='2d')
5
+ Context.new(`#@native.getContext(#{type})`)
6
+ end
7
+
8
+ class Context
9
+ include DelegateNative
10
+
11
+ def initialize native
12
+ @native = native
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,78 @@
1
+ module Browser
2
+ class Element
3
+ element :video, :audio do
4
+ def buffered
5
+ TimeRanges.new(`#@native.buffered`)
6
+ end
7
+
8
+ def played
9
+ TimeRanges.new(`#@native.played`)
10
+ end
11
+
12
+ def seekable
13
+ TimeRanges.new(`#@native.seekable`)
14
+ end
15
+
16
+ def network_state
17
+ case `#@native.networkState`
18
+ when `HTMLMediaElement.NETWORK_EMPTY` then :no_data
19
+ when `HTMLMediaElement.NETWORK_IDLE` then :idle
20
+ when `HTMLMediaElement.NETWORK_LOADING` then :loading
21
+ when `HTMLMediaElement.NETWORK_NO_SOURCE` then :no_source
22
+ end
23
+ end
24
+ end
25
+
26
+ element :video do
27
+ def fullscreen
28
+ fullscreen = %w(
29
+ requestFullScreen
30
+ requestFullscreen
31
+ webkitRequestFullScreen
32
+ webkitRequestFullscreen
33
+ mozRequestFullScreen
34
+ msRequestFullscreen
35
+ ).find { |prop| `!!#@native[prop]` }
36
+
37
+ if fullscreen
38
+ `#@native[fullscreen]()`
39
+ else
40
+ warn "[#{self.class}] Cannot determine the method to full-screen a video"
41
+ super
42
+ end
43
+ end
44
+ alias request_fullscreen fullscreen
45
+ end
46
+
47
+ class TimeRanges
48
+ include Enumerable
49
+
50
+ def initialize native
51
+ @native = native
52
+ end
53
+
54
+ def to_n
55
+ @native
56
+ end
57
+
58
+ def each
59
+ `#@native.length`.times do |i|
60
+ yield TimeRange.new(`#@native.start(i)`, `#@native.end(i)`)
61
+ end
62
+
63
+ self
64
+ end
65
+ end
66
+
67
+ class TimeRange
68
+ attr_reader :start, :end
69
+
70
+ def initialize start, _end
71
+ @start = start
72
+ @end = _end
73
+ end
74
+
75
+ alias begin start
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,92 @@
1
+ module Browser
2
+ # Wrapper for JS events
3
+ class Event
4
+ # @param [JS] the native event to wrap
5
+ def initialize native
6
+ @native = native
7
+ end
8
+
9
+ # Prevent the runtime from executing this event's default behavior. For
10
+ # example, prevent navigation after clicking a link.
11
+ #
12
+ # @return [Browser::Event] self
13
+ def prevent
14
+ `#@native.preventDefault()`
15
+ self
16
+ end
17
+
18
+ # Prevent the runtime from bubbling this event up the hierarchy. This is
19
+ # typically used to keep an event local to the element on which it was
20
+ # triggered, such as keeping a click event on a button from unintentionally
21
+ # triggering a handler on a parent element.
22
+ #
23
+ # @return self
24
+ def stop_propagation
25
+ `#@native.stopPropagation()`
26
+ self
27
+ end
28
+
29
+ # @return [Boolean] true if `prevent` has been called on this event, false
30
+ # otherwise
31
+ def prevented?
32
+ `#@native.defaultPrevented`
33
+ end
34
+
35
+ # @return [Boolean] true if the Meta/Command/Windows key was pressed when
36
+ # this event fired, false otherwise
37
+ def meta?
38
+ `#@native.metaKey`
39
+ end
40
+
41
+ # @return [Boolean] true if the Shift key was pressed when this event fired,
42
+ # false otherwise
43
+ def shift?
44
+ `#@native.shiftKey`
45
+ end
46
+
47
+ # @return [Boolean] true if the Ctrl key was pressed when this event fired,
48
+ # false otherwise
49
+ def ctrl?
50
+ `#@native.ctrlKey`
51
+ end
52
+
53
+ # @return [Boolean] true if the Alt key was pressed when this event fired,
54
+ # false otherwise
55
+ def alt?
56
+ `#@native.altKey`
57
+ end
58
+
59
+ # The target for this event
60
+ #
61
+ # @return [Browser::Element] the element on which this event was triggered
62
+ # @todo Handle non-DOM events here
63
+ def target
64
+ Element.new(`#@native.target`)
65
+ end
66
+
67
+ # @return [Numeric] the key code associated with this event. Only useful for
68
+ # keyboard-based events.
69
+ def code
70
+ `#@native.keyCode`
71
+ end
72
+
73
+ # Return properties on the event not covered by Ruby methods.
74
+ def method_missing name, *args
75
+ property = name.gsub(/_[a-z]/) { |match| match[-1, 1].upcase }
76
+ value = `#@native[property]`
77
+
78
+ if `!!value && #{Proc === value}`
79
+ value.call(*args)
80
+ elsif `value == null`
81
+ nil
82
+ else
83
+ value
84
+ end
85
+ end
86
+
87
+ # @return [JS] the native event wrapped by this object.
88
+ def to_n
89
+ @native
90
+ end
91
+ end
92
+ end