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