module Turbo::Broadcastable::ClassMethods

def broadcast_target_default

All default targets will use the return of this method. Overwrite if you want something else than model_name.plural.
def broadcast_target_default
  model_name.plural
end

def broadcasts(stream = model_name.plural, inserts_by: :append, target: broadcast_target_default, **rendering)

the current model, for creates - to the model plural name, which can be overriden by passing stream.
Same as #broadcasts_to, but the designated stream for updates and destroys is automatically set to
def broadcasts(stream = model_name.plural, inserts_by: :append, target: broadcast_target_default, **rendering)
  after_create_commit  -> { broadcast_action_later_to(stream, action: inserts_by, target: target.try(:call, self) || target, **rendering) }
  after_update_commit  -> { broadcast_replace_later(**rendering) }
  after_destroy_commit -> { broadcast_remove }
end

def broadcasts_refreshes(stream = model_name.plural)

the current model, for creates - to the model plural name, which can be overriden by passing stream.
Same as #broadcasts_refreshes_to, but the designated stream for page refreshes is automatically set to
def broadcasts_refreshes(stream = model_name.plural)
  after_create_commit  -> { broadcast_refresh_later_to(stream) }
  after_update_commit  -> { broadcast_refresh_later }
  after_destroy_commit -> { broadcast_refresh }
end

def broadcasts_refreshes_to(stream)

end
broadcasts_refreshes_to ->(message) { [ message.board, :messages ] }
belongs_to :board
class Message < ApplicationRecord

end
broadcasts_refreshes_to :board
belongs_to :board
class Message < ApplicationRecord

name derived at runtime by the stream symbol invocation. Examples:
Configures the model to broadcast a "page refresh" on creates, updates, and destroys to a stream
def broadcasts_refreshes_to(stream)
  after_commit -> { broadcast_refresh_later_to(stream.try(:call, self) || send(stream)) }
end

def broadcasts_to(stream, inserts_by: :append, target: broadcast_target_default, **rendering)

end
broadcasts_to ->(message) { [ message.board, :messages ] }, partial: "messages/custom_message"
belongs_to :board
class Message < ApplicationRecord

end
broadcasts_to ->(message) { [ message.board, :messages ] }, inserts_by: :prepend, target: "board_messages"
belongs_to :board
class Message < ApplicationRecord

end
broadcasts_to :board
belongs_to :board
class Message < ApplicationRecord

the target dom id overwritten by passing target. Examples:
the model's plural name. The insertion can also be made to be a prepend by overwriting inserts_by and
stream symbol invocation. By default, the creates are appended to a dom id target name derived from
Configures the model to broadcast creates, updates, and destroys to a stream name derived at runtime by the
def broadcasts_to(stream, inserts_by: :append, target: broadcast_target_default, **rendering)
  after_create_commit  -> { broadcast_action_later_to(stream.try(:call, self) || send(stream), action: inserts_by, target: target.try(:call, self) || target, **rendering) }
  after_update_commit  -> { broadcast_replace_later_to(stream.try(:call, self) || send(stream), **rendering) }
  after_destroy_commit -> { broadcast_remove_to(stream.try(:call, self) || send(stream)) }
end

def suppressed_turbo_broadcasts?

def suppressed_turbo_broadcasts?
  suppressed_turbo_broadcasts
end

def suppressing_turbo_broadcasts(&block)

Executes +block+ preventing both synchronous and asynchronous broadcasts from this model.
def suppressing_turbo_broadcasts(&block)
  original, self.suppressed_turbo_broadcasts = self.suppressed_turbo_broadcasts, true
  yield
ensure
  self.suppressed_turbo_broadcasts = original
end