From 8d941740c86d7a2faaf742d7fc4c4aedfe2979d5 Mon Sep 17 00:00:00 2001 From: girst Date: Wed, 11 Sep 2019 23:46:11 +0200 Subject: [PATCH] WIP: generalize infobox concept instead of a single infobox only for welcome, allow multiple infoboxes to be dismissed independently of each other. it'd be best to use a hash or array for storing these values, but then the state does not clear properly between sessions. --- assets/js/welcome.js | 5 +- src/invidious.cr | 68 +++++++++++++------ src/invidious/helpers/helpers.cr | 2 +- src/invidious/users.cr | 2 +- src/invidious/views/components/feed_menu.ecr | 2 +- .../views/components/welcome_message.ecr | 2 +- src/invidious/views/popular.ecr | 2 +- 7 files changed, 54 insertions(+), 29 deletions(-) diff --git a/assets/js/welcome.js b/assets/js/welcome.js index fba30f83..4b5fc274 100644 --- a/assets/js/welcome.js +++ b/assets/js/welcome.js @@ -2,16 +2,13 @@ var dismiss_welcome = document.getElementById('dismiss_welcome'); dismiss_welcome.href = 'javascript:void(0);'; dismiss_welcome.addEventListener('click', function () { - var dark_mode = document.getElementById('dark_theme').media === 'none'; - - var url = '/dismiss_welcome?redirect=false'; + var url = '/dismiss_info?name=welcome&redirect=false'; var xhr = new XMLHttpRequest(); xhr.responseType = 'json'; xhr.timeout = 10000; xhr.open('GET', url, true); hide_welcome(); - window.localStorage.setItem('welcome_dismissed', true); xhr.send(); }); diff --git a/src/invidious.cr b/src/invidious.cr index fd4d74d2..96fa36c0 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -90,6 +90,10 @@ LOCALES = { "zh-CN" => load_locale("zh-CN"), } +DISMISSALS = [ + "welcome", +] + config = CONFIG logger = Invidious::LogHandler.new @@ -1224,10 +1228,11 @@ post "/login" do |env| env.response.cookies << cookie end - if env.request.cookies["PREFS"]? - preferences = env.get("preferences").as(Preferences) - PG_DB.exec("UPDATE users SET preferences = $1 WHERE email = $2", preferences.to_json, user.email) + preferences = env.get("preferences").as(Preferences) + preferences.dismissals = "#{preferences.dismissals},welcome" # registering automatically dismisses "sign up" message + PG_DB.exec("UPDATE users SET preferences = $1 WHERE email = $2", preferences.to_json, user.email) + if env.request.cookies["PREFS"]? cookie = env.request.cookies["PREFS"] cookie.expires = Time.utc(1990, 1, 1) env.response.cookies << cookie @@ -1404,10 +1409,11 @@ post "/login" do |env| secure: secure, http_only: true) end - if env.request.cookies["PREFS"]? - preferences = env.get("preferences").as(Preferences) - PG_DB.exec("UPDATE users SET preferences = $1 WHERE email = $2", preferences.to_json, user.email) + preferences = env.get("preferences").as(Preferences) + preferences.dismissals = "#{preferences.dismissals},welcome" # registering automatically dismisses "sign up" message + PG_DB.exec("UPDATE users SET preferences = $1 WHERE email = $2", preferences.to_json, user.email) + if env.request.cookies["PREFS"]? cookie = env.request.cookies["PREFS"] cookie.expires = Time.utc(1990, 1, 1) env.response.cookies << cookie @@ -1699,32 +1705,54 @@ get "/toggle_theme" do |env| end end -get "/dismiss_welcome" do |env| +get "/dismiss_info" do |env| locale = LOCALES[env.get("preferences").as(Preferences).locale]? referer = get_referer(env, unroll: false) + which = env.params.query["name"]? + if !which || !DISMISSALS.includes?(which) + error_message = {"error" => "cannot dismiss nonexisting info"}.to_json + env.response.status_code = 400 + next error_message + end + redirect = env.params.query["redirect"]? redirect ||= "true" redirect = redirect == "true" - preferences = env.get("preferences").as(Preferences) + if user = env.get? "user" + user = user.as(User) + preferences = user.preferences - preferences.welcome_dismissed = true + if !preferences.dismissals.split(',').includes?(which) + preferences.dismissals = "#{preferences.dismissals},#{which}" + end - preferences = preferences.to_json + preferences = preferences.to_json - if Kemal.config.ssl || config.https_only - secure = true + PG_DB.exec("UPDATE users SET preferences = $1 WHERE email = $2", preferences, user.email) else - secure = false - end + preferences = env.get("preferences").as(Preferences) - if config.domain - env.response.cookies["PREFS"] = HTTP::Cookie.new(name: "PREFS", domain: "#{config.domain}", value: preferences, expires: Time.utc + 2.years, - secure: secure, http_only: true) - else - env.response.cookies["PREFS"] = HTTP::Cookie.new(name: "PREFS", value: preferences, expires: Time.utc + 2.years, - secure: secure, http_only: true) + if !preferences.dismissals.split(',').includes?(which) + preferences.dismissals = "#{preferences.dismissals},#{which}" + end + + preferences = preferences.to_json + + if Kemal.config.ssl || config.https_only + secure = true + else + secure = false + end + + if config.domain + env.response.cookies["PREFS"] = HTTP::Cookie.new(name: "PREFS", domain: "#{config.domain}", value: preferences, expires: Time.utc + 2.years, + secure: secure, http_only: true) + else + env.response.cookies["PREFS"] = HTTP::Cookie.new(name: "PREFS", value: preferences, expires: Time.utc + 2.years, + secure: secure, http_only: true) + end end if redirect diff --git a/src/invidious/helpers/helpers.cr b/src/invidious/helpers/helpers.cr index faaa2dbe..96857551 100644 --- a/src/invidious/helpers/helpers.cr +++ b/src/invidious/helpers/helpers.cr @@ -135,6 +135,7 @@ struct ConfigPreferences continue: {type: Bool, default: false}, continue_autoplay: {type: Bool, default: true}, dark_mode: {type: String, default: "", converter: BoolToString}, + dismissals: {type: String, default: ""}, latest_only: {type: Bool, default: false}, listen: {type: Bool, default: false}, local: {type: Bool, default: false}, @@ -151,7 +152,6 @@ struct ConfigPreferences unseen_only: {type: Bool, default: false}, video_loop: {type: Bool, default: false}, volume: {type: Int32, default: 100}, - welcome_dismissed: {type: Bool, default: false}, }) end diff --git a/src/invidious/users.cr b/src/invidious/users.cr index 1a998881..cd2e7808 100644 --- a/src/invidious/users.cr +++ b/src/invidious/users.cr @@ -76,6 +76,7 @@ struct Preferences continue: {type: Bool, default: CONFIG.default_user_preferences.continue}, continue_autoplay: {type: Bool, default: CONFIG.default_user_preferences.continue_autoplay}, dark_mode: {type: String, default: CONFIG.default_user_preferences.dark_mode, converter: ConfigPreferences::BoolToString}, + dismissals: {type: String, default: CONFIG.default_user_preferences.dismissals}, latest_only: {type: Bool, default: CONFIG.default_user_preferences.latest_only}, listen: {type: Bool, default: CONFIG.default_user_preferences.listen}, local: {type: Bool, default: CONFIG.default_user_preferences.local}, @@ -92,7 +93,6 @@ struct Preferences unseen_only: {type: Bool, default: CONFIG.default_user_preferences.unseen_only}, video_loop: {type: Bool, default: CONFIG.default_user_preferences.video_loop}, volume: {type: Int32, default: CONFIG.default_user_preferences.volume}, - welcome_dismissed: {type: Bool, default: CONFIG.default_user_preferences.welcome_dismissed}, }) end diff --git a/src/invidious/views/components/feed_menu.ecr b/src/invidious/views/components/feed_menu.ecr index 64423581..a93d232e 100644 --- a/src/invidious/views/components/feed_menu.ecr +++ b/src/invidious/views/components/feed_menu.ecr @@ -1,4 +1,4 @@ -<% if !(env.get? "user") && !env.get("preferences").as(Preferences).welcome_dismissed %> +<% if !env.get("preferences").as(Preferences).dismissals.split(",").includes?("welcome") %>