view_component_reflex 3.1.6 → 3.1.7

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 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