lib/svelte_on_rails/view_helpers.rb



module SvelteOnRails
  module ViewHelpers

    def svelte_component(filename, props = {})

      # check filename
      file_path = SvelteOnRails::Configuration.instance.components_folder + "#{filename}.svelte"
      raise "File not found: #{file_path}" unless File.exist?(file_path)

      # check what to do

      rss = if props.key?(:render_server_side)
              props.delete(:render_server_side)
            else
              SvelteOnRails::Configuration.instance.render_server_side
            end
      unless [true, false, :auto].include?(rss)
        raise "Only true, false or auto are allowed for the argument #render_server_side"
      end
      render_server_side = (rss == :auto && request.headers['X-Turbo-Request-ID'].blank? || rss)

      hydrate = if props.key?(:hydrate)
                  props[:hydrate]
                else
                  true
                end

      # separate hashes

      props.delete(:hydrate)
      props.delete(:render_server_side)
      options = props.slice(:class, :id, :style)
      props.delete(:class)
      props.delete(:id)
      props.delete(:style)

      # set up html

      options[:class] = options[:class].to_s
      options[:class] += ' svelte-component svelte-on-rails-not-initialized-component'
      options[:data] ||= {}
      options[:data][:props] = props.to_json
      options[:data][:svelte_component] = filename

      if render_server_side

        # render server side

        start_time = Time.now
        sv = SvelteOnRails::RenderServerSide.new(filename + '.svelte')
        sv.compile_if_changes
        res = sv.render_compiled_file(props)
        time = Time.now - start_time
        Rails.logger.info "  Rendered #{filename}.svelte server-side: #{time.round(3)}ms"

        content_tag(:div, options) do
          r = content_tag(:style, res['css'], type: 'text/css')
          r << res['html'].html_safe
        end

      else

        # render empty element

        content_tag(:div, options) {}

      end
    end

  end
end