add quicklist to subreddit

This commit is contained in:
ayaka 2025-01-06 09:32:52 +13:00
parent ad39254ddc
commit 85dab5e070
4 changed files with 75 additions and 4 deletions

View File

@ -327,6 +327,8 @@ async fn main() {
app.at("/r/:sub/unsubscribe").post(|r| subreddit::subscriptions_filters(r).boxed()); app.at("/r/:sub/unsubscribe").post(|r| subreddit::subscriptions_filters(r).boxed());
app.at("/r/:sub/filter").post(|r| subreddit::subscriptions_filters(r).boxed()); app.at("/r/:sub/filter").post(|r| subreddit::subscriptions_filters(r).boxed());
app.at("/r/:sub/unfilter").post(|r| subreddit::subscriptions_filters(r).boxed()); app.at("/r/:sub/unfilter").post(|r| subreddit::subscriptions_filters(r).boxed());
app.at("/r/:sub/quicklist").post(|r| subreddit::subscriptions_filters(r).boxed());
app.at("/r/:sub/unquicklist").post(|r| subreddit::subscriptions_filters(r).boxed());
app.at("/r/:sub/comments/:id").get(|r| post::item(r).boxed()); app.at("/r/:sub/comments/:id").get(|r| post::item(r).boxed());
app.at("/r/:sub/comments/:id/:title").get(|r| post::item(r).boxed()); app.at("/r/:sub/comments/:id/:title").get(|r| post::item(r).boxed());

View File

@ -229,6 +229,7 @@ pub async fn subscriptions_filters(req: Request<Body>) -> Result<Response<Body>,
let preferences = Preferences::new(&req); let preferences = Preferences::new(&req);
let mut sub_list = preferences.subscriptions; let mut sub_list = preferences.subscriptions;
let mut filters = preferences.filters; let mut filters = preferences.filters;
let mut quicklist = preferences.quicklist;
// Retrieve list of posts for these subreddits to extract display names // Retrieve list of posts for these subreddits to extract display names
@ -290,7 +291,14 @@ pub async fn subscriptions_filters(req: Request<Body>) -> Result<Response<Body>,
} else if action.contains(&"unfilter".to_string()) { } else if action.contains(&"unfilter".to_string()) {
// Remove sub name from filtered list // Remove sub name from filtered list
filters.retain(|s| s.to_lowercase() != part.to_lowercase()); filters.retain(|s| s.to_lowercase() != part.to_lowercase());
} } else if action.contains(&"quicklist".to_string()) && !quicklist.contains(&part.to_owned()) {
// Add each sub name to the filtered list
quicklist.push(part.to_owned());
} else if action.contains(&"unquicklist".to_string()) {
// Remove sub name from filtered list
quicklist.retain(|s| s.to_lowercase() != part.to_lowercase());
}
} }
// Redirect back to subreddit // Redirect back to subreddit
@ -326,6 +334,17 @@ pub async fn subscriptions_filters(req: Request<Body>) -> Result<Response<Body>,
.into(), .into(),
); );
} }
if quicklist.is_empty() {
response.remove_cookie("quicklist".to_string());
} else {
response.insert_cookie(
Cookie::build(("quicklist", quicklist.join("+")))
.path("/")
.http_only(true)
.expires(OffsetDateTime::now_utc() + Duration::weeks(52))
.into(),
);
}
Ok(response) Ok(response)
} }

View File

@ -429,7 +429,7 @@ a:hover {
} }
svg { svg {
stroke: var(--text); color: var(--text);
} }
img[src=""] { img[src=""] {
@ -523,9 +523,16 @@ aside {
margin-bottom: 20px; margin-bottom: 20px;
} }
#sub_actions {
display: grid;
grid-template-columns: auto 2fr 1fr;
grid-template-rows: 1fr;
grid-column-gap: 0px;
grid-row-gap: 0px;
}
#user_details, #user_details,
#sub_details, #sub_details,
#sub_actions,
#user_actions { #user_actions {
display: grid; display: grid;
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 1fr);
@ -545,6 +552,8 @@ aside {
#user_subscription, #user_subscription,
#sub_filter, #sub_filter,
#user_filter, #user_filter,
#sub_quicklist,
#user_quicklist,
#sub_rss, #sub_rss,
#user_rss { #user_rss {
margin-top: 20px; margin-top: 20px;
@ -554,9 +563,15 @@ aside {
margin-bottom: 20px; margin-bottom: 20px;
} }
#sub_quicklist button {
padding: 0px;
}
.subscribe, .subscribe,
.unsubscribe, .unsubscribe,
.filter, .filter,
.unquick,
.quick,
.unfilter { .unfilter {
padding: 10px 20px; padding: 10px 20px;
border-radius: 5px; border-radius: 5px;
@ -568,12 +583,22 @@ aside {
color: var(--foreground); color: var(--foreground);
background-color: var(--accent); background-color: var(--accent);
} }
.quick {
color: var(--foreground);
background-color: var(--accent);
height: 18px;
}
.unsubscribe, .unsubscribe,
.unfilter { .unfilter {
color: var(--text); color: var(--text);
background-color: var(--highlighted); background-color: var(--highlighted);
} }
.unquick {
color: var(--text);
background-color: var(--highlighted);
height: 18px;
}
/* Feeds */ /* Feeds */
@ -2283,4 +2308,4 @@ th {
.download:active { .download:active {
background-color: var(--background); background-color: var(--background);
} }

View File

@ -134,6 +134,31 @@
</form> </form>
{% endif %} {% endif %}
</div> </div>
<div id="sub_quicklist">
{% if prefs.quicklist.contains(sub.name) %}
<form action="/r/{{ sub.name }}/unquicklist?redirect={{ redirect_url }}" method="POST">
<button>
<svg class="unquick" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
<g fill="none">
<path d="m12.594 23.258l-.012.002l-.071.035l-.02.004l-.014-.004l-.071-.036q-.016-.004-.024.006l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.016-.018m.264-.113l-.014.002l-.184.093l-.01.01l-.003.011l.018.43l.005.012l.008.008l.201.092q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.003-.011l.018-.43l-.003-.012l-.01-.01z" />
<path fill="currentColor" d="M16 2a3 3 0 0 1 3 3v11h-3a3 3 0 0 0-2.997 2.87L12 18.202l-4.668 3.112C6.335 21.978 5 21.264 5 20.066V5a3 3 0 0 1 3-3zm6 16a1 1 0 0 1 .117 1.993L22 20h-6a1 1 0 0 1-.117-1.993L16 18z" />
</g>
</svg>
</button>
</form>
{% else %}
<form action="/r/{{ sub.name }}/quicklist?redirect={{ redirect_url }}" method="POST">
<button>
<svg class="quick" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
<g fill="none" fill-rule="evenodd">
<path d="m12.594 23.258l-.012.002l-.071.035l-.02.004l-.014-.004l-.071-.036q-.016-.004-.024.006l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.016-.018m.264-.113l-.014.002l-.184.093l-.01.01l-.003.011l.018.43l.005.012l.008.008l.201.092q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.003-.011l.018-.43l-.003-.012l-.01-.01z" />
<path fill="currentColor" d="M10 2a3 3 0 0 0-3 3a3 3 0 0 0-3 3v13.018c0 1.226 1.39 1.934 2.382 1.213l4.118-2.995l4.118 2.995c.991.721 2.382.013 2.382-1.213v-2.236l.618.45c.991.72 2.382.012 2.382-1.214V5a3 3 0 0 0-3-3zm7 14.309l1 .727V5a1 1 0 0 0-1-1h-7a1 1 0 0 0-1 1h5a3 3 0 0 1 3 3z" />
</g>
</svg>
</button>
</form>
{% endif %}
</div>
{% if crate::utils::enable_rss() %} {% if crate::utils::enable_rss() %}
<div id="sub_rss"> <div id="sub_rss">
<a href="/r/{{ sub.name }}.rss" title="RSS feed for r/{{ sub.name }}"> <a href="/r/{{ sub.name }}.rss" title="RSS feed for r/{{ sub.name }}">