Isomorfeus.load_configuration(File.expand_path(File.join(__dir__, '..', '..', 'config'))) class <%= roda_app_class %> < Roda extend Isomorfeus::Transport::Middlewares include Preact::ViewHelper include LucidI18nMixin use_isomorfeus_middlewares plugin :public, root: 'public', gzip: true, brotli: true @@templates = {} @@templates_path = File.expand_path(File.join(__dir__, '..', 'layouts')) def page_content(env, location) if Isomorfeus.development? req = Rack::Request.new(env) skip_ssr = req.params.key?("skip_ssr") else skip_ssr = false end mount_component('<%= app_class %>', { location_host: env['HTTP_HOST'], location: location, locale: current_locale }, skip_ssr: skip_ssr) end def render(template_name, locals: {}) @@templates.delete(template_name) if Isomorfeus.development? # cause reloading of template in development environment unless @@templates.key?(template_name) @@templates[template_name] = Iodine::Mustache.new(File.join(@@templates_path, "#{template_name}.mustache")) end @@templates[template_name].render(locals) end route do |r| r.root do content = page_content(env, '/') response.status = ssr_response_status render('web', locals: { content: content, script_tag: script_tag('web.js'), ssr_data: ssr_data, ssr_styles: ssr_styles, title: 'Welcome to <%= app_class %>' }) end r.on 'public' do r.public end r.get 'favicon.ico' do r.public end r.get 'robots.txt' do r.public end unless Isomorfeus.production? r.on 'mail_preview', String do |component_name| component_class = component_name.camelize props = { location_host: env['HTTP_HOST'], location: '/mail_preview', locale: current_locale }.merge(r.params) content = mount_component(component_class, props) response.status = ssr_response_status render('mail_preview', locals: { content: content, component_class: component_class, ssr_styles: ssr_styles }) end end r.get do content = page_content(env, env['PATH_INFO']) response.status = ssr_response_status render('web', locals: { content: content, script_tag: script_tag('web.js'), ssr_data: ssr_data, ssr_styles: ssr_styles, title: 'Welcome to <%= app_class %>' }) end end end