view_component_reflex 3.1.6 → 3.1.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5c4b72c7ca04feca0612b84925248838aa817e75618cbde750f23b60ad6c7802
4
- data.tar.gz: b9bc83b05e5ff725eb95df9771832d7c28fdd0ab010dd9f27b75ab19c319ce28
3
+ metadata.gz: 457de938235885451ab74f7c2a5136bc6e87443467f8ae7944eb27fb23f1dbdd
4
+ data.tar.gz: 4b6c6b6152facd010da5f74355e46a9f8db492e8b84e54563b27179f3edf7a93
5
5
  SHA512:
6
- metadata.gz: 864da0ee540160df39dfd03970ab52ac8bdfadc4df15eb173aeb301be5e3d507999bb6e4e96bb4095b2245caea8fe0969eebac006a6f5247be9fb2785c105fb1
7
- data.tar.gz: 993c5c58f8dd8a927cb953f9bb89aa54bd997b9bcb41d07a0a39db7ccc9c71d8faf79cbaf1cf76513b50c5207fe7ef56e268b86ef6c7301d549d99e7b69ec270
6
+ metadata.gz: 300ec189d65159384a26ee644ab7fa2deb3e9609fea703f004822cbde354af444ef2c4f4ed050b3770c4b2f19b81c1f0e710be673f1f570445d41216bb8ab2b7
7
+ data.tar.gz: 304db5f0fa2e8a98d6cf97603e17c110faa84f82fe06cfdd675f154b69bad27841474dc7ca7a048be500d65ccf957af9545599339acb35e24a8babccbe4dc07c
@@ -1,6 +1,7 @@
1
1
  module ViewComponentReflex
2
2
  class Component < ViewComponent::Base
3
3
  class_attribute :reflex_base_class, default: ViewComponentReflex::Reflex
4
+ attr_reader :key
4
5
 
5
6
  class << self
6
7
  def init_stimulus_reflex
@@ -55,7 +56,7 @@ module ViewComponentReflex
55
56
  end
56
57
 
57
58
  def component_controller(opts_or_tag = :div, opts = {}, &blk)
58
- init_key
59
+ initialize_component
59
60
 
60
61
  tag = :div
61
62
  options = if opts_or_tag.is_a? Hash
@@ -77,11 +78,64 @@ module ViewComponentReflex
77
78
  omitted_from_state.empty?
78
79
  end
79
80
 
80
- # key is required if you're using state
81
- # We can't initialize the session state in the initial method
82
- # because it doesn't have a view_context yet
83
- # This is the next best place to do it
84
- def init_key
81
+ # We can't truly initialize the component without the view_context,
82
+ # which isn't available in the `initialize` method. We require the
83
+ # developer to wrap components in `component_controller`, so this is where
84
+ # we truly initialize the component.
85
+ # This method is overridden in reflex.rb when the component is re-rendered. The
86
+ # override simply sets @key to element.dataset[:key]
87
+ # We don't want it to initialize the state again, and since we're rendering the component
88
+ # outside of the view, we need to skip the initialize_key method as well
89
+ def initialize_component
90
+ initialize_key
91
+ initialize_state
92
+ end
93
+
94
+ # Note to self:
95
+ # This has to be in the Component class because there are situations
96
+ # where the controller is the one rendering the component
97
+ # so we can't rely on the component created by the reflex
98
+ def initialize_state
99
+ return if state_initialized?
100
+ adapter = ViewComponentReflex::Engine.state_adapter
101
+
102
+ # newly mounted
103
+ if !stimulus_reflex? || adapter.state(request, @key).empty?
104
+
105
+ new_state = create_safe_state
106
+
107
+ adapter.wrap_write_async do
108
+ adapter.store_state(request, @key, new_state)
109
+ adapter.store_state(request, "#{@key}_initial", new_state)
110
+ end
111
+
112
+ # updating a mounted component
113
+ else
114
+ initial_state = adapter.state(request, "#{@key}_initial")
115
+
116
+ parameters_changed = []
117
+ adapter.state(request, @key).each do |k, v|
118
+ instance_value = instance_variable_get(k)
119
+ if permit_parameter?(initial_state[k], instance_value)
120
+ parameters_changed << k
121
+ adapter.wrap_write_async do
122
+ adapter.set_state(request, controller, "#{@key}_initial", {k => instance_value})
123
+ adapter.set_state(request, controller, @key, {k => instance_value})
124
+ end
125
+ else
126
+ instance_variable_set(k, v)
127
+ end
128
+ end
129
+ after_state_initialized(parameters_changed)
130
+ end
131
+ @state_initialized = true
132
+ end
133
+
134
+ def state_initialized?
135
+ @state_initialized
136
+ end
137
+
138
+ def initialize_key
85
139
  # we want the erb file that renders the component. `caller` gives the file name,
86
140
  # and line number, which should be unique. We hash it to make it a nice number
87
141
  erb_file = caller.select { |p| p.match? /.\.html\.(haml|erb|slim)/ }[1]
@@ -137,44 +191,6 @@ module ViewComponentReflex
137
191
  # # no op
138
192
  # end
139
193
 
140
- def key
141
- adapter = ViewComponentReflex::Engine.state_adapter
142
-
143
- # initialize session state
144
- if (!stimulus_reflex? || adapter.state(request, @key).empty?) && !@initialized_state
145
-
146
- new_state = create_safe_state
147
-
148
- adapter.wrap_write_async do
149
- adapter.store_state(request, @key, new_state)
150
- adapter.store_state(request, "#{@key}_initial", new_state)
151
- end
152
- elsif !@initialized_state
153
- initial_state = adapter.state(request, "#{@key}_initial")
154
-
155
- # incoming_params = safe_instance_variables.each_with_object({}) { |var, obj| obj[var] = instance_variable_get(var) }
156
- # receive_params(ViewComponentReflex::Engine.state_adapter.state(request, @key), incoming_params)
157
-
158
- parameters_changed = []
159
- adapter.state(request, @key).each do |k, v|
160
- instance_value = instance_variable_get(k)
161
- if permit_parameter?(initial_state[k], instance_value)
162
- parameters_changed << k
163
- adapter.wrap_write_async do
164
- adapter.set_state(request, controller, "#{@key}_initial", {k => instance_value})
165
- adapter.set_state(request, controller, @key, {k => instance_value})
166
- end
167
- else
168
- instance_variable_set(k, v)
169
- end
170
- end
171
- after_state_initialized(parameters_changed)
172
- end
173
-
174
- @initialized_state = true
175
- @key
176
- end
177
-
178
194
  def safe_instance_variables
179
195
  instance_variables - unsafe_instance_variables - omitted_from_state
180
196
  end
@@ -185,7 +201,7 @@ module ViewComponentReflex
185
201
  [
186
202
  :@view_context, :@lookup_context, :@view_renderer, :@view_flow,
187
203
  :@virtual_path, :@variant, :@current_template, :@output_buffer, :@key,
188
- :@helpers, :@controller, :@request, :@tag_builder, :@initialized_state
204
+ :@helpers, :@controller, :@request, :@tag_builder, :@state_initialized
189
205
  ]
190
206
  end
191
207
 
@@ -196,6 +212,7 @@ module ViewComponentReflex
196
212
  safe_instance_variables.each do |k|
197
213
  new_state[k] = instance_variable_get(k)
198
214
  end
215
+
199
216
  new_state
200
217
  end
201
218
 
@@ -1,5 +1,4 @@
1
1
  require "stimulus_reflex"
2
- require "view_component_reflex/null_broadcaster"
3
2
  require 'view_component_reflex/reflex_factory'
4
3
  require "view_component_reflex/state_adapter/base"
5
4
  require "view_component_reflex/state_adapter/session"
@@ -24,7 +24,6 @@ module ViewComponentReflex
24
24
  html: html.inner_html,
25
25
  children_only: true,
26
26
  permanent_attribute_name: "data-reflex-permanent",
27
- stimulus_reflex: stimulus_reflex_data
28
27
  )
29
28
  end
30
29
  end
@@ -44,17 +43,17 @@ module ViewComponentReflex
44
43
 
45
44
  def refresh_component!
46
45
  component.tap do |k|
47
- k.define_singleton_method(:key) do
48
- element.dataset[:key]
46
+ k.define_singleton_method(:initialize_component) do
47
+ @key = element.dataset[:key]
49
48
  end
50
49
  end
50
+
51
51
  document = Nokogiri::HTML(component.render_in(controller.view_context))
52
52
  CableReady::Channels.instance[stream].morph(
53
53
  selector: selector,
54
54
  children_only: true,
55
55
  html: document.css(selector).inner_html,
56
56
  permanent_attribute_name: "data-reflex-permanent",
57
- stimulus_reflex: stimulus_reflex_data
58
57
  )
59
58
  end
60
59
 
@@ -96,22 +95,10 @@ module ViewComponentReflex
96
95
  !!name.to_proc
97
96
  end
98
97
 
99
- # this is copied out of stimulus_reflex/reflex.rb and modified
100
- def morph(selectors, html = "")
101
- case selectors
102
- when :nothing
103
- @broadcaster = StimulusReflex::NothingBroadcaster.new(self)
104
- when :null
105
- @broadcaster = NullBroadcaster.new(self)
106
- else
107
- @broadcaster = StimulusReflex::SelectorBroadcaster.new(self) unless broadcaster.selector?
108
- broadcaster.morphs << [selectors, html]
109
- end
110
- end
111
-
112
98
  def method_missing(name, *args, &blk)
113
- morph :null
99
+ morph :nothing
114
100
  super unless respond_to_missing?(name)
101
+
115
102
  state.each do |k, v|
116
103
  component.instance_variable_set(k, v)
117
104
  end
@@ -184,11 +171,23 @@ module ViewComponentReflex
184
171
  end
185
172
 
186
173
  def set_state(new_state = {})
187
- ViewComponentReflex::Engine.state_adapter.set_state(request, controller, element.dataset[:key], new_state)
174
+ state_adapter.set_state(request, controller, key, new_state)
175
+ end
176
+
177
+ def key
178
+ element.dataset[:key]
179
+ end
180
+
181
+ def state_adapter
182
+ ViewComponentReflex::Engine.state_adapter
188
183
  end
189
184
 
190
185
  def state
191
- ViewComponentReflex::Engine.state_adapter.state(request, element.dataset[:key])
186
+ state_adapter.state(request, key)
187
+ end
188
+
189
+ def initial_state
190
+ state_adapter.state(request, "#{key}_initial")
192
191
  end
193
192
 
194
193
  def save_state
@@ -1,3 +1,3 @@
1
1
  module ViewComponentReflex
2
- VERSION = '3.1.6'
2
+ VERSION = '3.1.7'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: view_component_reflex
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.6
4
+ version: 3.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua LeBlanc
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-03 00:00:00.000000000 Z
11
+ date: 2021-02-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -85,7 +85,6 @@ files:
85
85
  - app/components/view_component_reflex/component.rb
86
86
  - lib/view_component_reflex.rb
87
87
  - lib/view_component_reflex/engine.rb
88
- - lib/view_component_reflex/null_broadcaster.rb
89
88
  - lib/view_component_reflex/reflex.rb
90
89
  - lib/view_component_reflex/reflex_factory.rb
91
90
  - lib/view_component_reflex/state_adapter/base.rb
@@ -1,19 +0,0 @@
1
- module ViewComponentReflex
2
- class NullBroadcaster < StimulusReflex::Broadcaster
3
- def broadcast(_, data)
4
- nil
5
- end
6
-
7
- def nothing?
8
- true
9
- end
10
-
11
- def to_sym
12
- :nothing
13
- end
14
-
15
- def to_s
16
- "Nothing"
17
- end
18
- end
19
- end