Compare commits
8 Commits
dcb90ca2c8
...
letterbox-
| Author | SHA1 | Date | |
|---|---|---|---|
| 0cf3e3ce05 | |||
| d10a34e32e | |||
| f311e517a9 | |||
| aacee2f537 | |||
| e2bec7760b | |||
| a4ef7e48a6 | |||
| 1aa6f22461 | |||
| 2f5026c75b |
93
Cargo.lock
generated
93
Cargo.lock
generated
@@ -1135,30 +1135,15 @@ dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crc"
|
||||
version = "2.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23"
|
||||
dependencies = [
|
||||
"crc-catalog 1.1.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crc"
|
||||
version = "3.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d"
|
||||
dependencies = [
|
||||
"crc-catalog 2.4.0",
|
||||
"crc-catalog",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crc-catalog"
|
||||
version = "1.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403"
|
||||
|
||||
[[package]]
|
||||
name = "crc-catalog"
|
||||
version = "2.4.0"
|
||||
@@ -3181,6 +3166,20 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "letterbox-notmuch"
|
||||
version = "0.17.61"
|
||||
source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/"
|
||||
checksum = "28f7db11bd5e63d2e4e3e870e5ca224e2a7acee4eb722aafb9b430f9b24d7dc6"
|
||||
dependencies = [
|
||||
"log",
|
||||
"mailparse",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"thiserror 2.0.18",
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "letterbox-notmuch"
|
||||
version = "0.17.65"
|
||||
dependencies = [
|
||||
"itertools",
|
||||
"log",
|
||||
@@ -3193,28 +3192,14 @@ dependencies = [
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "letterbox-notmuch"
|
||||
version = "0.17.61"
|
||||
source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/"
|
||||
checksum = "28f7db11bd5e63d2e4e3e870e5ca224e2a7acee4eb722aafb9b430f9b24d7dc6"
|
||||
dependencies = [
|
||||
"log",
|
||||
"mailparse",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"thiserror 2.0.18",
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "letterbox-procmail2notmuch"
|
||||
version = "0.17.61"
|
||||
version = "0.17.65"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"clap",
|
||||
"letterbox-notmuch 0.17.61 (sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/)",
|
||||
"letterbox-shared 0.17.61 (sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/)",
|
||||
"letterbox-notmuch 0.17.61",
|
||||
"letterbox-shared 0.17.61",
|
||||
"serde",
|
||||
"sqlx",
|
||||
"tokio 1.49.0",
|
||||
@@ -3222,7 +3207,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "letterbox-server"
|
||||
version = "0.17.61"
|
||||
version = "0.17.65"
|
||||
dependencies = [
|
||||
"ammonia",
|
||||
"anyhow",
|
||||
@@ -3245,8 +3230,8 @@ dependencies = [
|
||||
"html-escape",
|
||||
"html2text",
|
||||
"ical",
|
||||
"letterbox-notmuch 0.17.61",
|
||||
"letterbox-shared 0.17.61",
|
||||
"letterbox-notmuch 0.17.65",
|
||||
"letterbox-shared 0.17.65",
|
||||
"linkify",
|
||||
"lol_html",
|
||||
"mailparse",
|
||||
@@ -3273,6 +3258,8 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "letterbox-shared"
|
||||
version = "0.17.61"
|
||||
source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/"
|
||||
checksum = "ca342be12e54e0a54aa3df86b2bda6e3ff014c75a00f6fb3cd087a80fa5e46df"
|
||||
dependencies = [
|
||||
"build-info",
|
||||
"letterbox-notmuch 0.17.61",
|
||||
@@ -3285,12 +3272,10 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "letterbox-shared"
|
||||
version = "0.17.61"
|
||||
source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/"
|
||||
checksum = "ca342be12e54e0a54aa3df86b2bda6e3ff014c75a00f6fb3cd087a80fa5e46df"
|
||||
version = "0.17.65"
|
||||
dependencies = [
|
||||
"build-info",
|
||||
"letterbox-notmuch 0.17.61 (sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/)",
|
||||
"letterbox-notmuch 0.17.65",
|
||||
"regex",
|
||||
"serde",
|
||||
"sqlx",
|
||||
@@ -3300,7 +3285,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "letterbox-web"
|
||||
version = "0.17.61"
|
||||
version = "0.17.65"
|
||||
dependencies = [
|
||||
"build-info",
|
||||
"build-info-build",
|
||||
@@ -3312,7 +3297,7 @@ dependencies = [
|
||||
"graphql_client",
|
||||
"human_format",
|
||||
"itertools",
|
||||
"letterbox-shared 0.17.61",
|
||||
"letterbox-shared 0.17.65",
|
||||
"log",
|
||||
"seed",
|
||||
"seed_hooks",
|
||||
@@ -3489,16 +3474,6 @@ version = "0.11.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "08ab2867e3eeeca90e844d1940eab391c9dc5228783db2ed999acbc0a9ed375a"
|
||||
|
||||
[[package]]
|
||||
name = "lzma-rust2"
|
||||
version = "0.15.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7fa48f5024824ecd3e8282cc948bd46fbd095aed5a98939de0594601a59b4e2b"
|
||||
dependencies = [
|
||||
"crc 2.1.0",
|
||||
"sha2 0.10.9",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mac"
|
||||
version = "0.1.1"
|
||||
@@ -4477,12 +4452,6 @@ version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
|
||||
|
||||
[[package]]
|
||||
name = "ppmd-rust"
|
||||
version = "1.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "efca4c95a19a79d1c98f791f10aebd5c1363b473244630bb7dbde1dc98455a24"
|
||||
|
||||
[[package]]
|
||||
name = "ppv-lite86"
|
||||
version = "0.2.21"
|
||||
@@ -5808,7 +5777,7 @@ dependencies = [
|
||||
"base64 0.22.1",
|
||||
"bytes 1.11.0",
|
||||
"chrono",
|
||||
"crc 3.4.0",
|
||||
"crc",
|
||||
"crossbeam-queue 0.3.12",
|
||||
"either",
|
||||
"event-listener",
|
||||
@@ -5884,7 +5853,7 @@ dependencies = [
|
||||
"byteorder",
|
||||
"bytes 1.11.0",
|
||||
"chrono",
|
||||
"crc 3.4.0",
|
||||
"crc",
|
||||
"digest 0.10.7",
|
||||
"dotenvy",
|
||||
"either",
|
||||
@@ -5926,7 +5895,7 @@ dependencies = [
|
||||
"bitflags 2.10.0",
|
||||
"byteorder",
|
||||
"chrono",
|
||||
"crc 3.4.0",
|
||||
"crc",
|
||||
"dotenvy",
|
||||
"etcetera",
|
||||
"futures-channel",
|
||||
@@ -8031,10 +8000,8 @@ dependencies = [
|
||||
"getrandom 0.3.4",
|
||||
"hmac 0.12.1",
|
||||
"indexmap 2.13.0",
|
||||
"lzma-rust2",
|
||||
"memchr",
|
||||
"pbkdf2",
|
||||
"ppmd-rust",
|
||||
"sha1",
|
||||
"time 0.3.46",
|
||||
"typed-path",
|
||||
|
||||
@@ -8,7 +8,7 @@ authors = ["Bill Thiede <git@xinu.tv>"]
|
||||
edition = "2021"
|
||||
license = "UNLICENSED"
|
||||
publish = ["xinu"]
|
||||
version = "0.17.61"
|
||||
version = "0.17.65"
|
||||
repository = "https://git.z.xinu.tv/wathiede/letterbox"
|
||||
|
||||
[profile.dev]
|
||||
|
||||
@@ -56,7 +56,7 @@ urlencoding = "2.1.3"
|
||||
#xtracing = { git = "http://git-private.h.xinu.tv/wathiede/xtracing.git" }
|
||||
#xtracing = { path = "../../xtracing" }
|
||||
xtracing = { version = "0.3.2", registry = "xinu" }
|
||||
zip = "7.0.0"
|
||||
zip = { version = "7.0.0", default-features = false, features = ["aes-crypto", "bzip2", "deflate64", "deflate", "time", "zstd"] }
|
||||
|
||||
|
||||
[build-dependencies]
|
||||
|
||||
@@ -224,6 +224,24 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders<Msg>) {
|
||||
});
|
||||
}
|
||||
Msg::AddTag(query, tag) => {
|
||||
orders.skip().perform_cmd(async move {
|
||||
let res: Result<
|
||||
graphql_client::Response<graphql::add_tag_mutation::ResponseData>,
|
||||
gloo_net::Error,
|
||||
> = send_graphql(graphql::AddTagMutation::build_query(
|
||||
graphql::add_tag_mutation::Variables {
|
||||
query: query.clone(),
|
||||
tag: tag.clone(),
|
||||
},
|
||||
))
|
||||
.await;
|
||||
if let Err(e) = res {
|
||||
error!("Failed to add tag {tag} to {query}: {e}");
|
||||
}
|
||||
Msg::Refresh
|
||||
});
|
||||
}
|
||||
Msg::AddTagAndGoToSearch(query, tag) => {
|
||||
orders.skip().perform_cmd(async move {
|
||||
let res: Result<
|
||||
graphql_client::Response<graphql::add_tag_mutation::ResponseData>,
|
||||
@@ -256,7 +274,24 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders<Msg>) {
|
||||
if let Err(e) = res {
|
||||
error!("Failed to remove tag {tag} to {query}: {e}");
|
||||
}
|
||||
// TODO: reconsider this behavior
|
||||
Msg::Refresh
|
||||
});
|
||||
}
|
||||
Msg::RemoveTagAndGoToSearch(query, tag) => {
|
||||
orders.skip().perform_cmd(async move {
|
||||
let res: Result<
|
||||
graphql_client::Response<graphql::remove_tag_mutation::ResponseData>,
|
||||
gloo_net::Error,
|
||||
> = send_graphql(graphql::RemoveTagMutation::build_query(
|
||||
graphql::remove_tag_mutation::Variables {
|
||||
query: query.clone(),
|
||||
tag: tag.clone(),
|
||||
},
|
||||
))
|
||||
.await;
|
||||
if let Err(e) = res {
|
||||
error!("Failed to remove tag {tag} to {query}: {e}");
|
||||
}
|
||||
Msg::GoToSearchResults
|
||||
});
|
||||
}
|
||||
@@ -505,7 +540,7 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders<Msg>) {
|
||||
.join(" ");
|
||||
orders
|
||||
.skip()
|
||||
.perform_cmd(async move { Msg::AddTag(threads, tag) });
|
||||
.perform_cmd(async move { Msg::AddTagAndGoToSearch(threads, tag) });
|
||||
}
|
||||
}
|
||||
Msg::SelectionRemoveTag(tag) => {
|
||||
@@ -520,7 +555,7 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders<Msg>) {
|
||||
.join(" ");
|
||||
orders
|
||||
.skip()
|
||||
.perform_cmd(async move { Msg::RemoveTag(threads, tag) });
|
||||
.perform_cmd(async move { Msg::RemoveTagAndGoToSearch(threads, tag) });
|
||||
}
|
||||
}
|
||||
Msg::SelectionMarkAsRead => {
|
||||
@@ -692,6 +727,13 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders<Msg>) {
|
||||
};
|
||||
orders.send_msg(Msg::CatchupNext);
|
||||
}
|
||||
Msg::CatchupMarkAsSpam => {
|
||||
if let Some(thread_id) = current_thread_id(&model.context) {
|
||||
orders.send_msg(Msg::AddTag(thread_id.clone(), "Spam".to_string()));
|
||||
orders.send_msg(Msg::SetUnread(thread_id, false));
|
||||
};
|
||||
orders.send_msg(Msg::CatchupNext);
|
||||
}
|
||||
Msg::CatchupNext => {
|
||||
orders.send_msg(Msg::ScrollToTop);
|
||||
let Some(catchup) = &mut model.catchup else {
|
||||
@@ -852,7 +894,10 @@ pub enum Msg {
|
||||
|
||||
SetUnread(String, bool),
|
||||
AddTag(String, String),
|
||||
AddTagAndGoToSearch(String, String),
|
||||
#[allow(dead_code)]
|
||||
RemoveTag(String, String),
|
||||
RemoveTagAndGoToSearch(String, String),
|
||||
Snooze(String, DateTime<Utc>),
|
||||
|
||||
FrontPageRequest {
|
||||
@@ -902,6 +947,7 @@ pub enum Msg {
|
||||
CatchupStart,
|
||||
CatchupKeepUnread,
|
||||
CatchupMarkAsRead,
|
||||
CatchupMarkAsSpam,
|
||||
CatchupNext,
|
||||
CatchupExit,
|
||||
|
||||
|
||||
@@ -268,6 +268,14 @@ fn catchup_view(
|
||||
Msg::GoToSearchResults
|
||||
]))
|
||||
],
|
||||
button![
|
||||
tw_classes::button(),
|
||||
C!["text-red-500"],
|
||||
attrs! {At::Title => "Mark as spam"},
|
||||
span![i![C!["far", "fa-hand"]]],
|
||||
span![C!["pl-2"], "Spam"],
|
||||
ev(Ev::Click, |_| Msg::CatchupMarkAsSpam)
|
||||
],
|
||||
button![
|
||||
tw_classes::button_with_color("bg-green-800", "hover:bg-green-700"),
|
||||
span![i![C!["far", "fa-envelope-open"]]],
|
||||
@@ -450,7 +458,7 @@ fn removable_tags_chiclet<'a>(thread_id: &'a str, tags: &'a [String]) -> Node<Ms
|
||||
a![
|
||||
C![&tw_classes::TAG_X],
|
||||
span![i![C!["fa-solid", "fa-xmark"]]],
|
||||
ev(Ev::Click, move |_| Msg::RemoveTag(thread_id, rm_tag))
|
||||
ev(Ev::Click, move |_| Msg::RemoveTagAndGoToSearch(thread_id, rm_tag))
|
||||
]
|
||||
]
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user