Module: Superglue::StreamsHelper

Defined in:
app/helpers/superglue/streams_helper.rb

Overview

This file was ported from the amazing folks at turbo-rails You can find its MIT License here: github.com/hotwired/turbo-rails/blob/main/MIT-LICENSE

Instance Method Summary collapse

Instance Method Details

#broadcast_action_props(action:, partial: nil, model: nil, target: nil, options: {}, **rendering) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'app/helpers/superglue/streams_helper.rb', line 47

def broadcast_action_props(action:, partial: nil, model: nil, target: nil, options: {}, **rendering)
  if model
    target = model.broadcast_target_default if !target

    if model.respond_to?(:to_partial_path)
      rendering[:locals] = (rendering[:locals] || {}).reverse_merge(model.model_name.element.to_sym => model).compact
      partial ||= model.to_partial_path
    end
  end

  target = fragment_id(target)

  if !partial
    raise StandardError, "A partial is needed to render a stream"
  end

  json = instance_variable_get(:@__json)

  json.child! do
    json.fragmentIds [target]
    json.handler action
    json.options(options)
    json.data(partial: [partial, rendering]) do
    end
  end
end

#broadcast_append_props(model: nil, target: nil, save_target: nil, options: {}, **rendering) ⇒ Object



31
32
33
34
35
36
37
# File 'app/helpers/superglue/streams_helper.rb', line 31

def broadcast_append_props(model: nil, target: nil, save_target: nil, options: {}, **rendering)
  if save_target
    options[:saveAs] ||= fragment_id(save_target)
  end

  broadcast_action_props(action: "append", model:, target:, options:, **rendering)
end

#broadcast_prepend_props(model: nil, target: nil, save_target: nil, options: {}, **rendering) ⇒ Object



23
24
25
26
27
28
29
# File 'app/helpers/superglue/streams_helper.rb', line 23

def broadcast_prepend_props(model: nil, target: nil, save_target: nil, options: {}, **rendering)
  if save_target
    options[:saveAs] ||= fragment_id(save_target)
  end

  broadcast_action_props(action: "prepend", model:, target:, options:, **rendering)
end

#broadcast_update_props(model: nil, target: nil, options: {}, **rendering) ⇒ Object



39
40
41
42
43
44
45
# File 'app/helpers/superglue/streams_helper.rb', line 39

def broadcast_update_props(model: nil, target: nil, options: {}, **rendering)
  if model && !target
    target = fragment_id(model)
  end

  broadcast_action_props(action: "update", model:, target:, options:, **rendering)
end

#fragment_id(value) ⇒ Object



13
14
15
16
17
18
19
20
21
# File 'app/helpers/superglue/streams_helper.rb', line 13

def fragment_id(value)
  if value.respond_to?(:to_key)
    ActionView::RecordIdentifier.dom_id(value)
  elsif value.respond_to?(:broadcast_target_default)
    value.broadcast_target_default
  else
    value.to_s
  end
end

#stream_from_props(*streamables, **attributes) ⇒ Object

Raises:

  • (ArgumentError)


5
6
7
8
9
10
11
# File 'app/helpers/superglue/streams_helper.rb', line 5

def stream_from_props(*streamables, **attributes)
  raise ArgumentError, "streamables can't be blank" unless streamables.any?(&:present?)
  attributes[:channel] = attributes[:channel]&.to_s || "Superglue::StreamsChannel"
  attributes[:signed_stream_name] = Superglue::StreamsChannel.signed_stream_name(streamables)

  attributes
end