diff --git a/app/helpers/theme_helper.rb b/app/helpers/theme_helper.rb index c2af85cf..6d3f9024 100644 --- a/app/helpers/theme_helper.rb +++ b/app/helpers/theme_helper.rb @@ -28,15 +28,6 @@ module ThemeHelper "muted_text" => "muted-text", }.freeze - def render_theme - theme = get_active_theme - - return unless theme - - css = get_theme_css(theme) - content_tag(:style, css) - end - def get_theme_css(theme) body = ":root {\n" @@ -61,7 +52,7 @@ module ThemeHelper end def theme_color - theme = get_active_theme + theme = active_theme_user&.theme if theme theme.theme_color else @@ -70,7 +61,7 @@ module ThemeHelper end def mobile_theme_color - theme = get_active_theme + theme = active_theme_user&.theme if theme theme.mobile_theme_color else @@ -78,32 +69,18 @@ module ThemeHelper end end - def get_active_theme - if @user&.theme - if user_signed_in? - if current_user&.show_foreign_themes? - @user.theme - else - current_user&.theme - end - else - @user.theme - end - elsif @answer&.user&.theme - if user_signed_in? - if current_user&.show_foreign_themes? - @answer.user.theme - else - current_user&.theme - end - else - @answer.user.theme - end - elsif current_user&.theme - current_user.theme + def active_theme_user + user = @user ||= @answer&.user + + if user&.theme.present? && should_show_foreign_theme? + user + elsif user_signed_in? + current_user end end + def should_show_foreign_theme? = current_user&.show_foreign_themes || !user_signed_in? + def get_hex_color_from_theme_value(value) "0000000#{value.to_s(16)}"[-6, 6] end diff --git a/app/views/layouts/base.html.haml b/app/views/layouts/base.html.haml index 5aafbe9a..2a142dc6 100644 --- a/app/views/layouts/base.html.haml +++ b/app/views/layouts/base.html.haml @@ -5,10 +5,10 @@ %meta{ 'http-equiv': 'X-UA-Compatible', content: 'IE=edge' } %meta{ name: 'viewport', content: 'width=device-width, initial-scale=1, user-scalable=no, viewport-fit=cover' } - if user_signed_in? - %meta{ name: 'theme-color', content: "var(--primary)", media: '(min-width: 993px)' } - %meta{ name: 'theme-color', content: "var(--background)", media: '(max-width: 992px)' } + %meta{ name: "theme-color", content: "var(--primary)", media: "(min-width: 993px)" } + %meta{ name: "theme-color", content: "var(--background)", media: "(max-width: 992px)" } - else - %meta{ name: 'theme-color', content: "var(--primary)" } + %meta{ name: "theme-color", content: "var(--primary)" } - if @user&.privacy_noindex? || @answer&.user&.privacy_noindex? || @question&.user&.privacy_noindex? %meta{ name: 'robots', content: 'noindex' } %link{ rel: 'manifest', href: '/manifest.json', crossorigin: 'use-credentials' } @@ -19,10 +19,7 @@ %link{ rel: 'icon', href: '/images/favicon/favicon-32.png', sizes: '32x32' } %title= yield(:title) = stylesheet_link_tag "application", data: { 'turbo-track': "reload" }, media: "all" - - if current_user&.show_foreign_themes? - %link{ rel: 'stylesheet', href: user_path(username: @user&.screen_name || @answer&.user&.screen_name || current_user&.screen_name, format: "css"), data: { turbo_track: "reload" } } - - elsif user_signed_in? - %link{ rel: 'stylesheet', href: user_path(username: current_user&.screen_name, format: "css"), data: { turbo_track: "reload" } } + %link{ rel: "stylesheet", href: user_path(username: active_theme_user.screen_name, format: "css"), data: { turbo_track: "reload" } } = javascript_include_tag 'application', data: { 'turbo-track': 'reload' }, defer: true = csrf_meta_tags = yield(:og) diff --git a/spec/helpers/theme_helper_spec.rb b/spec/helpers/theme_helper_spec.rb index f7de9441..3476f316 100644 --- a/spec/helpers/theme_helper_spec.rb +++ b/spec/helpers/theme_helper_spec.rb @@ -3,33 +3,6 @@ require "rails_helper" describe ThemeHelper, type: :helper do - describe "#render_theme" do - context "when target page doesn't have a theme" do - it "returns no theme" do - expect(helper.render_theme).to be_nil - end - end - - context "when target page has a theme" do - before(:each) do - @user = FactoryBot.create(:user) - @user.theme = Theme.new - @user.save! - end - - it "returns a theme" do - expect(helper.render_theme).to include("<style>:root {") - end - - it "contains correct theme background colors" do - expect(helper.render_theme).to include("--primary: #5e35b1;") - end - - it "properly converts color values for *-text theme attributes" do - expect(helper.render_theme).to include("--primary-text: 255, 255, 255;") - end - end - end describe "#get_hex_color_from_theme_value" do it "returns the proper hex value from the decimal value for white" do @@ -51,11 +24,11 @@ describe ThemeHelper, type: :helper do end end - describe "#get_active_theme" do + describe "#active_theme_user" do context "when user is a guest" do context "when target page doesn't have a theme" do - it "returns no theme" do - expect(helper.get_active_theme).to be_nil + it "returns no user" do + expect(helper.active_theme_user).to be_nil end end @@ -67,7 +40,7 @@ describe ThemeHelper, type: :helper do end it "returns a theme" do - expect(helper.get_active_theme).to be_a(Theme) + expect(helper.active_theme_user).to be_a(User) end end @@ -78,8 +51,8 @@ describe ThemeHelper, type: :helper do @answer.user.save! end - it "returns a theme" do - expect(helper.get_active_theme).to be_a(Theme) + it "returns a user" do + expect(helper.active_theme_user).to be_a(User) end end end @@ -90,13 +63,7 @@ describe ThemeHelper, type: :helper do before(:each) { sign_in(user) } context "when user has no theme" do - context "when target page has no theme" do - it "returns no theme" do - expect(helper.get_active_theme).to be_nil - end - end - - context "when target page has a theme" do + context "when target page has a corresponding user" do let(:theme) { Theme.new } before(:each) do @@ -106,11 +73,11 @@ describe ThemeHelper, type: :helper do end it "returns a theme" do - expect(helper.get_active_theme).to be(theme) + expect(helper.active_theme_user).to be(@user) end end - context "when target answer's user has a theme" do + context "when target page has contains an answer" do let(:theme) { Theme.new } before(:each) do @@ -120,7 +87,7 @@ describe ThemeHelper, type: :helper do end it "returns a theme" do - expect(helper.get_active_theme).to be(theme) + expect(helper.active_theme_user).to be(@answer.user) end end end @@ -136,7 +103,7 @@ describe ThemeHelper, type: :helper do context "when target page has no theme" do it "returns the theme of the current user" do - expect(helper.get_active_theme).to eq(theme) + expect(helper.active_theme_user).to eq(user) end end @@ -150,7 +117,7 @@ describe ThemeHelper, type: :helper do end it "returns the theme of the current page" do - expect(helper.get_active_theme).to eq(user_theme) + expect(helper.active_theme_user).to eq(@user) end context "when user doesn't allow foreign themes" do @@ -160,7 +127,7 @@ describe ThemeHelper, type: :helper do end it "should return the users theme" do - expect(helper.get_active_theme).to eq(theme) + expect(helper.active_theme_user).to eq(user) end end end @@ -175,7 +142,7 @@ describe ThemeHelper, type: :helper do end it "returns the theme of the current page" do - expect(helper.get_active_theme).to eq(answer_theme) + expect(helper.active_theme_user).to eq(@answer.user) end context "when user doesn't allow foreign themes" do @@ -185,7 +152,7 @@ describe ThemeHelper, type: :helper do end it "should return the users theme" do - expect(helper.get_active_theme).to eq(theme) + expect(helper.active_theme_user).to eq(user) end end end