Sha256: 87b207038efff8d04bc728cda80f8b9fc659d0e66e53cc28c63c9b445027392d

Contents?: true

Size: 1.28 KB

Versions: 9

Compression:

Stored size: 1.28 KB

Contents

# frozen_string_literal: true

module ViewComponent::UseHelpers
  extend ActiveSupport::Concern

  class_methods do
    def use_helpers(*args, from: nil, prefix: false)
      args.each { |helper_method| use_helper(helper_method, from: from, prefix: prefix) }
    end

    def use_helper(helper_method, from: nil, prefix: false)
      helper_method_name = full_helper_method_name(helper_method, prefix: prefix, source: from)

      class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
        def #{helper_method_name}(*args, &block)
          raise HelpersCalledBeforeRenderError if view_context.nil?

          #{define_helper(helper_method: helper_method, source: from)}
        end
      RUBY
      ruby2_keywords(helper_method_name) if respond_to?(:ruby2_keywords, true)
    end

    private

    def full_helper_method_name(helper_method, prefix: false, source: nil)
      return helper_method unless prefix.present?

      if !!prefix == prefix
        "#{source.to_s.underscore}_#{helper_method}"
      else
        "#{prefix}_#{helper_method}"
      end
    end

    def define_helper(helper_method:, source:)
      return "__vc_original_view_context.#{helper_method}(*args, &block)" unless source.present?

      "#{source}.instance_method(:#{helper_method}).bind(self).call(*args, &block)"
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
view_component-3.21.0 lib/view_component/use_helpers.rb
view_component-3.20.0 lib/view_component/use_helpers.rb
view_component-3.19.0 lib/view_component/use_helpers.rb
view_component-3.18.0 lib/view_component/use_helpers.rb
view_component-3.17.0 lib/view_component/use_helpers.rb
view_component-3.16.0 lib/view_component/use_helpers.rb
view_component-3.15.1 lib/view_component/use_helpers.rb
view_component-3.15.0 lib/view_component/use_helpers.rb
view_component-3.14.0 lib/view_component/use_helpers.rb