From bfe8604da17fb332e09d9cf64aa6b307ac2ad968 Mon Sep 17 00:00:00 2001 From: Jose Galisteo Date: Fri, 30 Jul 2021 18:06:23 +0200 Subject: [PATCH] [WIP] Explore exposable concept It allows expose on controllers and views helpers related to the turbo component controller. --- lib/turbo_component.rb | 2 ++ lib/turbo_component/concerns/exposable.rb | 21 +++++++++++++++++++ lib/turbo_component/railtie.rb | 12 +++++++++++ .../app/controllers/application_controller.rb | 1 + .../counter/component_controller.rb | 6 +++++- .../app/turbo_components/counter/helpers.rb | 9 ++++++++ test/dummy/app/views/welcome/show.html.erb | 2 +- 7 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 lib/turbo_component/concerns/exposable.rb create mode 100644 lib/turbo_component/railtie.rb create mode 100644 test/dummy/app/turbo_components/counter/helpers.rb diff --git a/lib/turbo_component.rb b/lib/turbo_component.rb index 15f2610..3c855ce 100644 --- a/lib/turbo_component.rb +++ b/lib/turbo_component.rb @@ -3,6 +3,7 @@ require "turbo-rails" require "turbo_component/version" require "turbo_component/engine" +require "turbo_component/railtie" module TurboComponent extend ActiveSupport::Autoload @@ -19,6 +20,7 @@ module Concerns autoload :Options autoload :Routes autoload :Tags + autoload :Exposable end end end diff --git a/lib/turbo_component/concerns/exposable.rb b/lib/turbo_component/concerns/exposable.rb new file mode 100644 index 0000000..bb90463 --- /dev/null +++ b/lib/turbo_component/concerns/exposable.rb @@ -0,0 +1,21 @@ +module TurboComponent::Concerns::Exposable + extend ActiveSupport::Concern + + included do + def self.expose_in_context(method_name) + prefix = self.name.deconstantize.underscore + module_ref = self + exposed_name = "#{prefix}_#{method_name}".to_sym + + ApplicationController.class_eval do + define_method exposed_name do + module_ref.send(method_name, self) + end + + helper_method exposed_name + end + + exposed_name + end + end +end diff --git a/lib/turbo_component/railtie.rb b/lib/turbo_component/railtie.rb new file mode 100644 index 0000000..e91416c --- /dev/null +++ b/lib/turbo_component/railtie.rb @@ -0,0 +1,12 @@ +module TurboComponent + class Railtie < Rails::Railtie + # initializer "turbo_component.action_controller" do + # ActiveSupport.on_load(:action_controller) do + # helpers = Dir[Rails.root.join("app", "turbo_components", "**", "*helpers.rb")] + # helpers.each do |helper_file| + # module_name + # end + # end + # end + end +end diff --git a/test/dummy/app/controllers/application_controller.rb b/test/dummy/app/controllers/application_controller.rb index 7944f9f..4e13b04 100644 --- a/test/dummy/app/controllers/application_controller.rb +++ b/test/dummy/app/controllers/application_controller.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true class ApplicationController < ActionController::Base + Counter::Helpers end diff --git a/test/dummy/app/turbo_components/counter/component_controller.rb b/test/dummy/app/turbo_components/counter/component_controller.rb index 91d8605..92ea53e 100644 --- a/test/dummy/app/turbo_components/counter/component_controller.rb +++ b/test/dummy/app/turbo_components/counter/component_controller.rb @@ -12,7 +12,11 @@ def increment session[:counter] ||= 0 session[:counter] += 1 - Turbo::StreamsChannel.broadcast_replace_to :counter, targets: "#counter", content: helpers.turbo_component(:counter, async: false) + # Since this demo is based on the session, we should scope the broadcast by "session.id" + turbo_stream_id = counter_turbo_stream_id + Turbo::StreamsChannel.broadcast_replace_to turbo_stream_id, targets: "#counter", content: helpers.turbo_component(:counter, async: false) + + # We don't have to return nothing since we will update the component with Turbo::StreamChannel head :ok end end diff --git a/test/dummy/app/turbo_components/counter/helpers.rb b/test/dummy/app/turbo_components/counter/helpers.rb new file mode 100644 index 0000000..f8a4055 --- /dev/null +++ b/test/dummy/app/turbo_components/counter/helpers.rb @@ -0,0 +1,9 @@ +module Counter::Helpers + include TurboComponent::Concerns::Exposable + + def self.turbo_stream_id(context) + "#{context.session.id}-counter" + end + + expose_in_context :turbo_stream_id +end diff --git a/test/dummy/app/views/welcome/show.html.erb b/test/dummy/app/views/welcome/show.html.erb index f3c94c1..d92db6e 100644 --- a/test/dummy/app/views/welcome/show.html.erb +++ b/test/dummy/app/views/welcome/show.html.erb @@ -1,5 +1,5 @@

Welcome

-<%= turbo_stream_from :counter %> +<%= turbo_stream_from counter_turbo_stream_id %> <%= turbo_component :counter, async: false do %> loading... <% end %>