feat: hide default feeds option (#370)

This commit is contained in:
Matthew Esposito 2025-02-06 13:03:42 -05:00 committed by GitHub
parent 85329c96a7
commit 5265ccb033
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 78 additions and 7 deletions

View file

@ -440,7 +440,7 @@ Assign a default value for each user-modifiable setting by passing environment v
| `WIDE` | `["on", "off"]` | `off` | | `WIDE` | `["on", "off"]` | `off` |
| `POST_SORT` | `["hot", "new", "top", "rising", "controversial"]` | `hot` | | `POST_SORT` | `["hot", "new", "top", "rising", "controversial"]` | `hot` |
| `COMMENT_SORT` | `["confidence", "top", "new", "controversial", "old"]` | `confidence` | | `COMMENT_SORT` | `["confidence", "top", "new", "controversial", "old"]` | `confidence` |
| `BLUR_SPOILER` | `["on", "off"]` | `off` | | `BLUR_SPOILER` | `["on", "off"]` | `off` |
| `SHOW_NSFW` | `["on", "off"]` | `off` | | `SHOW_NSFW` | `["on", "off"]` | `off` |
| `BLUR_NSFW` | `["on", "off"]` | `off` | | `BLUR_NSFW` | `["on", "off"]` | `off` |
| `USE_HLS` | `["on", "off"]` | `off` | | `USE_HLS` | `["on", "off"]` | `off` |
@ -452,3 +452,4 @@ Assign a default value for each user-modifiable setting by passing environment v
| `HIDE_SCORE` | `["on", "off"]` | `off` | | `HIDE_SCORE` | `["on", "off"]` | `off` |
| `HIDE_SIDEBAR_AND_SUMMARY` | `["on", "off"]` | `off` | | `HIDE_SIDEBAR_AND_SUMMARY` | `["on", "off"]` | `off` |
| `FIXED_NAVBAR` | `["on", "off"]` | `on` | | `FIXED_NAVBAR` | `["on", "off"]` | `on` |
| `REMOVE_DEFAULT_FEEDS` | `["on", "off"]` | `off` |

View file

@ -22,7 +22,7 @@ struct SettingsTemplate {
// CONSTANTS // CONSTANTS
const PREFS: [&str; 18] = [ const PREFS: [&str; 19] = [
"theme", "theme",
"front_page", "front_page",
"layout", "layout",
@ -41,6 +41,7 @@ const PREFS: [&str; 18] = [
"hide_score", "hide_score",
"disable_visit_reddit_confirmation", "disable_visit_reddit_confirmation",
"video_quality", "video_quality",
"remove_default_feeds",
]; ];
// FUNCTIONS // FUNCTIONS

View file

@ -3,12 +3,13 @@
use crate::{config, utils}; use crate::{config, utils};
// CRATES // CRATES
use crate::utils::{ use crate::utils::{
catch_random, error, filter_posts, format_num, format_url, get_filters, nsfw_landing, param, redirect, rewrite_urls, setting, template, val, Post, Preferences, Subreddit, catch_random, error, filter_posts, format_num, format_url, get_filters, info, nsfw_landing, param, redirect, rewrite_urls, setting, template, val, Post, Preferences,
Subreddit,
}; };
use crate::{client::json, server::RequestExt, server::ResponseExt}; use crate::{client::json, server::RequestExt, server::ResponseExt};
use cookie::Cookie; use cookie::Cookie;
use hyper::{Body, Request, Response}; use hyper::{Body, Request, Response};
use log::{debug, trace}; use log::debug;
use rinja::Template; use rinja::Template;
use chrono::DateTime; use chrono::DateTime;
@ -66,6 +67,7 @@ pub async fn community(req: Request<Body>) -> Result<Response<Body>, String> {
let query = req.uri().query().unwrap_or_default().to_string(); let query = req.uri().query().unwrap_or_default().to_string();
let subscribed = setting(&req, "subscriptions"); let subscribed = setting(&req, "subscriptions");
let front_page = setting(&req, "front_page"); let front_page = setting(&req, "front_page");
let remove_default_feeds = setting(&req, "remove_default_feeds") == "on";
let post_sort = req.cookie("post_sort").map_or_else(|| "hot".to_string(), |c| c.value().to_string()); let post_sort = req.cookie("post_sort").map_or_else(|| "hot".to_string(), |c| c.value().to_string());
let sort = req.param("sort").unwrap_or_else(|| req.param("id").unwrap_or(post_sort)); let sort = req.param("sort").unwrap_or_else(|| req.param("id").unwrap_or(post_sort));
@ -78,6 +80,21 @@ pub async fn community(req: Request<Body>) -> Result<Response<Body>, String> {
} else { } else {
front_page.clone() front_page.clone()
}); });
if (sub_name == "popular" || sub_name == "all") && remove_default_feeds {
if subscribed.is_empty() {
return info(req, "Subscribe to some subreddits! (Default feeds disabled in settings)").await;
} else {
// If there are subscribed subs, but we get here, then the problem is that front_page pref is set to something besides default.
// Tell user to go to settings and change front page to default.
return info(
req,
"You have subscribed to some subreddits, but your front page is not set to default. Visit settings and change front page to default.",
)
.await;
}
}
let quarantined = can_access_quarantine(&req, &sub_name) || root; let quarantined = can_access_quarantine(&req, &sub_name) || root;
// Handle random subreddits // Handle random subreddits

View file

@ -551,6 +551,14 @@ pub struct ErrorTemplate {
pub url: String, pub url: String,
} }
#[derive(Template)]
#[template(path = "info.html")]
pub struct InfoTemplate {
pub msg: String,
pub prefs: Preferences,
pub url: String,
}
/// Template for NSFW landing page. The landing page is displayed when a page's /// Template for NSFW landing page. The landing page is displayed when a page's
/// content is wholly NSFW, but a user has not enabled the option to view NSFW /// content is wholly NSFW, but a user has not enabled the option to view NSFW
/// posts. /// posts.
@ -636,6 +644,7 @@ pub struct Preferences {
pub filters: Vec<String>, pub filters: Vec<String>,
pub hide_awards: String, pub hide_awards: String,
pub hide_score: String, pub hide_score: String,
pub remove_default_feeds: String,
} }
fn serialize_vec_with_plus<S>(vec: &[String], serializer: S) -> Result<S::Ok, S::Error> fn serialize_vec_with_plus<S>(vec: &[String], serializer: S) -> Result<S::Ok, S::Error>
@ -682,6 +691,7 @@ impl Preferences {
filters: setting(req, "filters").split('+').map(String::from).filter(|s| !s.is_empty()).collect(), filters: setting(req, "filters").split('+').map(String::from).filter(|s| !s.is_empty()).collect(),
hide_awards: setting(req, "hide_awards"), hide_awards: setting(req, "hide_awards"),
hide_score: setting(req, "hide_score"), hide_score: setting(req, "hide_score"),
remove_default_feeds: setting(req, "remove_default_feeds"),
} }
} }
@ -1265,6 +1275,20 @@ pub async fn error(req: Request<Body>, msg: &str) -> Result<Response<Body>, Stri
Ok(Response::builder().status(404).header("content-type", "text/html").body(body.into()).unwrap_or_default()) Ok(Response::builder().status(404).header("content-type", "text/html").body(body.into()).unwrap_or_default())
} }
/// Renders a generic info landing page.
pub async fn info(req: Request<Body>, msg: &str) -> Result<Response<Body>, String> {
let url = req.uri().to_string();
let body = InfoTemplate {
msg: msg.to_string(),
prefs: Preferences::new(&req),
url,
}
.render()
.unwrap_or_default();
Ok(Response::builder().status(200).header("content-type", "text/html").body(body.into()).unwrap_or_default())
}
/// Returns true if the config/env variable `REDLIB_SFW_ONLY` carries the /// Returns true if the config/env variable `REDLIB_SFW_ONLY` carries the
/// value `on`. /// value `on`.
/// ///
@ -1463,10 +1487,11 @@ mod tests {
filters: vec![], filters: vec![],
hide_awards: "off".to_owned(), hide_awards: "off".to_owned(),
hide_score: "off".to_owned(), hide_score: "off".to_owned(),
remove_default_feeds: "off".to_owned(),
}; };
let urlencoded = serde_urlencoded::to_string(prefs).expect("Failed to serialize Prefs"); let urlencoded = serde_urlencoded::to_string(prefs).expect("Failed to serialize Prefs");
assert_eq!(urlencoded, "theme=laserwave&front_page=default&layout=compact&wide=on&blur_spoiler=on&show_nsfw=off&blur_nsfw=on&hide_hls_notification=off&video_quality=best&hide_sidebar_and_summary=off&use_hls=on&autoplay_videos=on&fixed_navbar=on&disable_visit_reddit_confirmation=on&comment_sort=confidence&post_sort=top&subscriptions=memes%2Bmildlyinteresting&filters=&hide_awards=off&hide_score=off") assert_eq!(urlencoded, "theme=laserwave&front_page=default&layout=compact&wide=on&blur_spoiler=on&show_nsfw=off&blur_nsfw=on&hide_hls_notification=off&video_quality=best&hide_sidebar_and_summary=off&use_hls=on&autoplay_videos=on&fixed_navbar=on&disable_visit_reddit_confirmation=on&comment_sort=confidence&post_sort=top&subscriptions=memes%2Bmildlyinteresting&filters=&hide_awards=off&hide_score=off&remove_default_feeds=off");
} }
} }

20
templates/info.html Normal file
View file

@ -0,0 +1,20 @@
{% extends "base.html" %}
{% import "utils.html" as utils %}
{% block title %}Info: {{ msg }}{% endblock %}
{% block sortstyle %}{% endblock %}
{% block subscriptions %}
{% call utils::sub_list("") %}
{% endblock %}
{% block search %}
{% call utils::search("".to_owned(), "") %}
{% endblock %}
{% block content %}
<div id="error">
<h2>{{ msg }}</h2>
<br />
</div>
{% endblock %}

View file

@ -26,6 +26,11 @@
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>Interface</legend> <legend>Interface</legend>
<div class="prefs-group">
<label for="remove_default_feeds">Remove default feeds</label>
<input type="hidden" value="off" name="remove_default_feeds">
<input type="checkbox" name="remove_default_feeds" id="remove_default_feeds" {% if prefs.remove_default_feeds == "on" %}checked{% endif %}>
</div>
<div class="prefs-group"> <div class="prefs-group">
<label for="front_page">Front page:</label> <label for="front_page">Front page:</label>
<select name="front_page" id="front_page"> <select name="front_page" id="front_page">

View file

@ -43,8 +43,10 @@
<div id="feed_list"> <div id="feed_list">
<p>MAIN FEEDS</p> <p>MAIN FEEDS</p>
<a href="/">Home</a> <a href="/">Home</a>
<a href="/r/popular">Popular</a> {% if prefs.remove_default_feeds != "on" %}
<a href="/r/all">All</a> <a href="/r/popular">Popular</a>
<a href="/r/all">All</a>
{% endif %}
{% if prefs.subscriptions.len() > 0 %} {% if prefs.subscriptions.len() > 0 %}
<p>REDDIT FEEDS</p> <p>REDDIT FEEDS</p>
{% for sub in prefs.subscriptions %} {% for sub in prefs.subscriptions %}