lib/svelte_on_rails/turbo_stream.rb



module SvelteOnRails
  class TurboStream
    def dispatch_event(event: 'stream-action', event_detail: nil, selector: nil, component: nil, stream_name: nil)

      args = {
        eventDetail: event_detail,
        component: component,
        event: event,
        selector: selector
      }

      args_enc = Base64.strict_encode64(args.to_json)

      Turbo::StreamsChannel.send(
        "broadcast_append_to",
        stream_name || configs['stream_name'],
        target: configs['target_html_id'],
        content: "<div style=\"display: none;\" data-controller=\"svelte-on-rails-turbo-stream\" data-args=\"#{args_enc}\"></div>"
      )

    end

    private

    def configs
      @configs ||= begin

                     conf = SvelteOnRails::Configuration.instance
                     unless conf.configs[:turbo_stream]
                       raise '[svelte-on-rails] missing configuration: :turbo_stream'
                     end
                     unless conf.configs[:turbo_stream]['target_html_id']
                       raise '[svelte-on-rails] missing configuration: turbo_stream/target_html_id'
                     end
                     unless conf.configs[:turbo_stream]['stream_name']
                       raise '[svelte-on-rails] missing configuration: turbo_stream/stream_name'
                     end

                     conf.configs[:turbo_stream]
                   end
    end
  end
end