diff --git a/crates/app/src/public/html/components.lisp b/crates/app/src/public/html/components.lisp
index d8c192f..77b28c8 100644
--- a/crates/app/src/public/html/components.lisp
+++ b/crates/app/src/public/html/components.lisp
@@ -173,6 +173,12 @@
("class" "flex items-center")
("style" "color: var(--color-primary)")
(text "{{ icon \"square-asterisk\" }}"))
+ (text "{%- endif %} {% if post.context.full_unlist -%}")
+ (span
+ ("title" "Unlisted")
+ ("class" "flex items-center")
+ ("style" "color: var(--color-primary)")
+ (icon (text "eye-off")))
(text "{%- endif %} {% if post.stack -%}")
(a
("title" "Posted to a stack you're in")
@@ -1507,6 +1513,7 @@
is_nsfw: false,
content_warning: \"\",
tags: [],
+ full_unlist: false,
};
window.BLANK_INITIAL_SETTINGS = JSON.stringify(
@@ -1543,6 +1550,11 @@
// window.POST_INITIAL_SETTINGS.is_nsfw.toString(),
// \"checkbox\",
// ],
+ [
+ [\"full_unlist\", \"Unlist from timelines\"],
+ window.POST_INITIAL_SETTINGS.full_unlist.toString(),
+ \"checkbox\",
+ ],
[
[\"content_warning\", \"Content warning\"],
window.POST_INITIAL_SETTINGS.content_warning,
diff --git a/crates/app/src/public/html/post/post.lisp b/crates/app/src/public/html/post/post.lisp
index 11a5156..062db3d 100644
--- a/crates/app/src/public/html/post/post.lisp
+++ b/crates/app/src/public/html/post/post.lisp
@@ -201,7 +201,7 @@
\"checkbox\",
],
[
- [\"is_nsfw\", \"Hide from public timelines\"],
+ [\"is_nsfw\", \"Mark as NSFW\"],
\"{{ community.context.is_nsfw }}\",
\"checkbox\",
],
@@ -210,6 +210,11 @@
settings.content_warning,
\"textarea\",
],
+ [
+ [\"full_unlist\", \"Unlist from timelines\"],
+ \"{{ user.settings.auto_full_unlist }}\",
+ \"checkbox\",
+ ],
[
[\"tags\", \"Tags\"],
settings.tags.join(\", \"),
diff --git a/crates/app/src/public/html/profile/settings.lisp b/crates/app/src/public/html/profile/settings.lisp
index 6d08053..4397155 100644
--- a/crates/app/src/public/html/profile/settings.lisp
+++ b/crates/app/src/public/html/profile/settings.lisp
@@ -1526,6 +1526,16 @@
\"{{ profile.settings.auto_unlist }}\",
\"checkbox\",
],
+ [
+ [\"auto_full_unlist\", \"Only publish my posts to my profile\"],
+ \"{{ profile.settings.auto_unlist }}\",
+ \"checkbox\",
+ ],
+ [
+ [],
+ \"Your posts will still be visible in the \\\"Following\\\" timeline for users following you.\",
+ \"text\",
+ ],
[
[\"all_timeline_hide_answers\", 'Hide posts answering questions from the \"All\" timeline'],
\"{{ profile.settings.all_timeline_hide_answers }}\",
diff --git a/crates/core/src/database/posts.rs b/crates/core/src/database/posts.rs
index dda4ae6..f17bbea 100644
--- a/crates/core/src/database/posts.rs
+++ b/crates/core/src/database/posts.rs
@@ -1468,7 +1468,7 @@ impl DataManager {
let res = query_rows!(
&conn,
&format!(
- "SELECT * FROM posts WHERE replying_to = 0{}{}{} ORDER BY created DESC LIMIT $1 OFFSET $2",
+ "SELECT * FROM posts WHERE replying_to = 0{}{}{} AND NOT context LIKE '%\"full_unlist\":true%' ORDER BY created DESC LIMIT $1 OFFSET $2",
if before_time > 0 {
format!(" AND created < {before_time}")
} else {
@@ -1534,7 +1534,7 @@ impl DataManager {
let res = query_rows!(
&conn,
&format!(
- "SELECT * FROM posts WHERE (community = {} {query_string}){} AND replying_to = 0 AND is_deleted = 0 ORDER BY created DESC LIMIT $1 OFFSET $2",
+ "SELECT * FROM posts WHERE (community = {} {query_string}){} AND NOT context LIKE '%\"full_unlist\":true%' AND replying_to = 0 AND is_deleted = 0 ORDER BY created DESC LIMIT $1 OFFSET $2",
first.community,
if hide_nsfw {
" AND NOT context LIKE '%\"is_nsfw\":true%'"
@@ -1979,6 +1979,10 @@ impl DataManager {
data.context.is_nsfw = true;
}
+ if owner.settings.auto_full_unlist {
+ data.context.full_unlist = true;
+ }
+
// ...
let conn = match self.0.connect().await {
Ok(c) => c,
@@ -2379,6 +2383,10 @@ impl DataManager {
x.is_nsfw = true;
}
+ if user.settings.auto_full_unlist {
+ x.full_unlist = true;
+ }
+
// ...
let conn = match self.0.connect().await {
Ok(c) => c,
diff --git a/crates/core/src/model/auth.rs b/crates/core/src/model/auth.rs
index 3b14d41..c3d7de9 100644
--- a/crates/core/src/model/auth.rs
+++ b/crates/core/src/model/auth.rs
@@ -308,6 +308,10 @@ pub struct UserSettings {
/// be shown in the UI (or API).
#[serde(default)]
pub hide_from_social_lists: bool,
+ /// Automatically hide your posts from all timelines except your profile
+ /// and the following timeline.
+ #[serde(default)]
+ pub auto_full_unlist: bool,
}
fn mime_avif() -> String {
diff --git a/crates/core/src/model/communities.rs b/crates/core/src/model/communities.rs
index 4df9795..8a4ab9a 100644
--- a/crates/core/src/model/communities.rs
+++ b/crates/core/src/model/communities.rs
@@ -190,6 +190,8 @@ pub struct PostContext {
pub content_warning: String,
#[serde(default)]
pub tags: Vec,
+ #[serde(default)]
+ pub full_unlist: bool,
}
fn default_comments_enabled() -> bool {
@@ -218,6 +220,7 @@ impl Default for PostContext {
reactions_enabled: default_reactions_enabled(),
content_warning: String::new(),
tags: Vec::new(),
+ full_unlist: false,
}
}
}