From 34f7889ee930a05bd9ae2b80f427c5f1fd1a3f7b Mon Sep 17 00:00:00 2001 From: Zak Nesler Date: Fri, 1 Nov 2024 16:58:58 -0400 Subject: [PATCH] wip --- Cargo.lock | 584 ++++++++++++-------------- bun.lockb | Bin 161874 -> 147924 bytes crates/blend-db/src/repo/entry.rs | 10 + crates/blend-db/src/repo/feed.rs | 11 + crates/blend-web/src/router/entry.rs | 7 + crates/blend-web/src/router/feed.rs | 24 +- package.json | 34 +- ui/src/api/entries.ts | 2 + ui/src/api/feeds.ts | 5 + ui/src/components/feed/feed-info.tsx | 6 +- ui/src/components/feed/feed-item.tsx | 10 +- ui/src/constants/query.ts | 2 + ui/src/hooks/queries/use-feed-read.ts | 24 ++ 13 files changed, 380 insertions(+), 339 deletions(-) mode change 100644 => 100755 bun.lockb create mode 100644 ui/src/hooks/queries/use-feed-read.ts diff --git a/Cargo.lock b/Cargo.lock index d389e8b6..d73f4c10 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] @@ -151,9 +151,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" [[package]] name = "arbitrary" @@ -169,7 +169,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] @@ -192,9 +192,9 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "async-compression" -version = "0.4.12" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fec134f64e2bc57411226dfc4e52dec859ddfc7e711fc5e07b612584f000e4aa" +checksum = "0cb8f1d480b0ea3783ab015936d2a55c87e219676f0c0b7dec61494043f21857" dependencies = [ "brotli", "futures-core", @@ -205,13 +205,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.81" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] @@ -240,9 +240,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "av1-grain" @@ -260,22 +260,22 @@ dependencies = [ [[package]] name = "avif-serialize" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876c75a42f6364451a033496a14c44bffe41f5f4a8236f697391f11024e596d2" +checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" dependencies = [ "arrayvec", ] [[package]] name = "axum" -version = "0.7.5" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" +checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae" dependencies = [ "async-trait", "axum-core", - "base64 0.21.7", + "base64 0.22.1", "bytes", "futures-util", "http", @@ -306,9 +306,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" dependencies = [ "async-trait", "bytes", @@ -319,7 +319,7 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper 0.1.2", + "sync_wrapper 1.0.1", "tower-layer", "tower-service", "tracing", @@ -341,17 +341,17 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", - "miniz_oxide 0.7.4", + "miniz_oxide 0.8.0", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -360,12 +360,6 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -544,9 +538,9 @@ dependencies = [ [[package]] name = "brotli" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" +checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -565,9 +559,9 @@ dependencies = [ [[package]] name = "built" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "236e6289eda5a812bc6b53c3b024039382a2895fbbeef2d748b2931546d392c4" +checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" [[package]] name = "bumpalo" @@ -577,9 +571,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.17.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fd4c6dcc3b0aea2f5c0b4b82c2b15fe39ddbc76041a310848f4706edf76bb31" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" [[package]] name = "byteorder" @@ -595,15 +589,15 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" [[package]] name = "cc" -version = "1.1.15" +version = "1.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" dependencies = [ "jobserver", "libc", @@ -643,9 +637,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.16" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed6719fffa43d0d87e5fd8caeab59be1554fb028cd30edc88fc4369b17971019" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", "clap_derive", @@ -653,9 +647,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.15" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216aec2b177652e3846684cbfe25c9964d18ec45234f0f5da5157b207ed1aab6" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstream", "anstyle", @@ -665,14 +659,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.13" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] @@ -737,9 +731,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -838,7 +832,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] @@ -862,7 +856,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] @@ -873,7 +867,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] @@ -910,7 +904,7 @@ checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] @@ -993,9 +987,9 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] @@ -1077,18 +1071,18 @@ dependencies = [ [[package]] name = "fdeflate" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +checksum = "d8090f921a24b04994d9929e204f50b498a33ea6ba559ffaa05e04f7ee7fb5ab" dependencies = [ "simd-adler32", ] [[package]] name = "feed-rs" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c546f6f85e02eaca09e6a6dd22fe4db839745f55ae16c8f36626980a57f5bc4" +checksum = "6511d29ecf291f32688d546c33d8e62bbebd4fe60ef40b52b20e3f3a0ec6eb56" dependencies = [ "chrono", "mediatype", @@ -1117,9 +1111,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.33" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", "miniz_oxide 0.8.0", @@ -1127,9 +1121,9 @@ dependencies = [ [[package]] name = "flume" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" dependencies = [ "futures-core", "futures-sink", @@ -1178,9 +1172,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1193,9 +1187,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1203,15 +1197,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1231,38 +1225,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -1327,9 +1321,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "h2" @@ -1370,13 +1364,19 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + [[package]] name = "hashlink" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" dependencies = [ - "hashbrown", + "hashbrown 0.14.5", ] [[package]] @@ -1435,7 +1435,7 @@ dependencies = [ "markup5ever", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] @@ -1480,9 +1480,9 @@ checksum = "08a397c49fec283e3d6211adbe480be95aae5f304cfb923e9970e08956d5168a" [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -1492,9 +1492,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" dependencies = [ "bytes", "futures-channel", @@ -1513,9 +1513,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.2" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http", @@ -1546,9 +1546,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" dependencies = [ "bytes", "futures-channel", @@ -1559,16 +1559,15 @@ dependencies = [ "pin-project-lite", "socket2", "tokio", - "tower", "tower-service", "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1605,9 +1604,9 @@ dependencies = [ [[package]] name = "image" -version = "0.25.2" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10" +checksum = "bc144d44a31d753b02ce64093d532f55ff8dc4ebf2ffb8a63c0dda691385acae" dependencies = [ "bytemuck", "byteorder-lite", @@ -1628,9 +1627,9 @@ dependencies = [ [[package]] name = "image-webp" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79afb8cbee2ef20f59ccd477a218c12a93943d075b492015ecb1bb81f8ee904" +checksum = "e031e8e3d94711a9ccb5d6ea357439ef3dcbed361798bd4071dc4d9793fbe22f" dependencies = [ "byteorder-lite", "quick-error", @@ -1638,18 +1637,18 @@ dependencies = [ [[package]] name = "imgref" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" +checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" [[package]] name = "indexmap" -version = "2.4.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.15.0", ] [[package]] @@ -1666,14 +1665,14 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is_terminal_polyfill" @@ -1713,9 +1712,9 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -1752,9 +1751,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.158" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libfuzzer-sys" @@ -1929,7 +1928,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", - "simd-adler32", ] [[package]] @@ -1939,6 +1937,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ "adler2", + "simd-adler32", ] [[package]] @@ -2043,7 +2042,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] @@ -2089,24 +2088,24 @@ dependencies = [ [[package]] name = "object" -version = "0.36.3" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl" -version = "0.10.66" +version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -2125,7 +2124,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] @@ -2136,18 +2135,18 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "300.3.1+3.3.1" +version = "300.4.0+3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7259953d42a81bf137fbbd73bd30a8e1914d6dce43c2b90ed575783a22608b91" +checksum = "a709e02f2b4aca747929cca5ed248880847c650233cf8b8cdc48f40aaf4898a6" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.103" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", @@ -2170,9 +2169,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -2192,7 +2191,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.3", + "redox_syscall", "smallvec", "windows-targets 0.52.6", ] @@ -2234,7 +2233,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] @@ -2321,7 +2320,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] @@ -2342,31 +2341,11 @@ dependencies = [ "siphasher 0.3.11", ] -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.76", -] - [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -2397,21 +2376,21 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "png" -version = "0.17.13" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" +checksum = "52f9d46a34a05a6a57566bc2bfae066ef07585a6e3fa30fbbdff5936380623f0" dependencies = [ "bitflags 1.3.2", "crc32fast", "fdeflate", "flate2", - "miniz_oxide 0.7.4", + "miniz_oxide 0.8.0", ] [[package]] @@ -2461,9 +2440,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -2476,28 +2455,28 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.85", "version_check", "yansi", ] [[package]] name = "profiling" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" +checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" dependencies = [ "profiling-procmacros", ] [[package]] name = "profiling-procmacros" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8021cf59c8ec9c432cfc2526ac6b8aa508ecaf29cd415f271b8406c1b851c3fd" +checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" dependencies = [ "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] @@ -2517,9 +2496,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" -version = "0.36.1" +version = "0.36.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96a05e2e8efddfa51a84ca47cec303fac86c8541b686d37cac5efc0e094417bc" +checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" dependencies = [ "encoding_rs", "memchr", @@ -2601,9 +2580,9 @@ dependencies = [ [[package]] name = "ravif" -version = "0.11.10" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f0bfd976333248de2078d350bfdf182ff96e168a24d23d2436cef320dd4bdd" +checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" dependencies = [ "avif-serialize", "imgref", @@ -2635,18 +2614,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.3" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] @@ -2664,9 +2634,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -2676,9 +2646,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", @@ -2687,15 +2657,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.7" +version = "0.12.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" dependencies = [ "base64 0.22.1", "bytes", @@ -2737,12 +2707,9 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.48" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f86ae463694029097b846d8f99fd5536740602ae00022c0c50c5600720b2f71" -dependencies = [ - "bytemuck", -] +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" [[package]] name = "ring" @@ -2800,7 +2767,7 @@ dependencies = [ "quote", "rust-embed-utils", "shellexpand", - "syn 2.0.76", + "syn 2.0.85", "walkdir", ] @@ -2822,9 +2789,9 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ "bitflags 2.6.0", "errno", @@ -2835,9 +2802,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.12" +version = "0.23.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" +checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" dependencies = [ "once_cell", "rustls-pki-types", @@ -2848,25 +2815,24 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" [[package]] name = "rustls-webpki" -version = "0.102.6" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring", "rustls-pki-types", @@ -2875,9 +2841,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "ryu" @@ -2896,11 +2862,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2940,9 +2906,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.1" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" dependencies = [ "core-foundation-sys", "libc", @@ -2969,29 +2935,29 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.209" +version = "1.0.213" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.213" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] name = "serde_json" -version = "1.0.127" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", "memchr", @@ -3011,9 +2977,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -3171,9 +3137,9 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f895e3734318cc55f1fe66258926c9b910c124d47520339efecbb6c59cec7c1f" +checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" dependencies = [ "nom", "unicode_categories", @@ -3181,9 +3147,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcfa89bea9500db4a0d038513d7a060566bfc51d46d1c014847049a45cce85e8" +checksum = "93334716a037193fac19df402f8571269c84a00852f6a7066b5d2616dcd64d3e" dependencies = [ "sqlx-core", "sqlx-macros", @@ -3194,9 +3160,9 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d06e2f2bd861719b1f3f0c7dbe1d80c30bf59e76cf019f07d9014ed7eefb8e08" +checksum = "d4d8060b456358185f7d50c55d9b5066ad956956fddec42ee2e8567134a8936e" dependencies = [ "atoi", "byteorder", @@ -3211,7 +3177,7 @@ dependencies = [ "futures-intrusive", "futures-io", "futures-util", - "hashbrown", + "hashbrown 0.14.5", "hashlink", "hex", "indexmap", @@ -3235,22 +3201,22 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f998a9defdbd48ed005a89362bd40dd2117502f15294f61c8d47034107dbbdc" +checksum = "cac0692bcc9de3b073e8d747391827297e075c7710ff6276d9f7a1f3d58c6657" dependencies = [ "proc-macro2", "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] name = "sqlx-macros-core" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d100558134176a2629d46cec0c8891ba0be8910f7896abfdb75ef4ab6f4e7ce" +checksum = "1804e8a7c7865599c9c79be146dc8a9fd8cc86935fa641d3ea58e5f0688abaa5" dependencies = [ "dotenvy", "either", @@ -3266,7 +3232,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.76", + "syn 2.0.85", "tempfile", "tokio", "url", @@ -3274,9 +3240,9 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cac0ab331b14cb3921c62156d913e4c15b74fb6ec0f3146bd4ef6e4fb3c12" +checksum = "64bb4714269afa44aef2755150a0fc19d756fb580a67db8885608cf02f47d06a" dependencies = [ "atoi", "base64 0.22.1", @@ -3318,9 +3284,9 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9734dbce698c67ecf67c442f768a5e90a49b2a4d61a9f1d59f73874bd4cf0710" +checksum = "6fa91a732d854c5d7726349bb4bb879bb9478993ceb764247660aee25f67c2f8" dependencies = [ "atoi", "base64 0.22.1", @@ -3358,9 +3324,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75b419c3c1b1697833dd927bdc4c6545a620bc1bbafabd44e1efbe9afcd337e" +checksum = "d5b2cf34a45953bfd3daaf3db0f7a7878ab9b7a6b91b422d24a7a9e4c857b680" dependencies = [ "atoi", "chrono", @@ -3448,9 +3414,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.76" +version = "2.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525" +checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" dependencies = [ "proc-macro2", "quote", @@ -3514,9 +3480,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" -version = "3.12.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", "fastrand", @@ -3538,22 +3504,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] @@ -3625,9 +3591,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.3" +version = "1.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5" +checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" dependencies = [ "backtrace", "bytes", @@ -3647,7 +3613,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] @@ -3673,9 +3639,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", "pin-project-lite", @@ -3684,9 +3650,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.21.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" dependencies = [ "futures-util", "log", @@ -3696,9 +3662,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", @@ -3730,9 +3696,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap", "serde", @@ -3743,14 +3709,14 @@ dependencies = [ [[package]] name = "tower" -version = "0.4.13" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" dependencies = [ "futures-core", "futures-util", - "pin-project", "pin-project-lite", + "sync_wrapper 0.1.2", "tokio", "tower-layer", "tower-service", @@ -3833,7 +3799,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] @@ -3880,9 +3846,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tungstenite" -version = "0.21.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" dependencies = [ "byteorder", "bytes", @@ -3893,7 +3859,6 @@ dependencies = [ "rand", "sha1", "thiserror", - "url", "utf-8", ] @@ -3922,7 +3887,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a615d6c2764852a2e88a4f16e9ce1ea49bb776b5872956309e170d63a042a34f" dependencies = [ "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] @@ -3936,45 +3901,42 @@ dependencies = [ [[package]] name = "unicase" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] +checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] name = "unicode-properties" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" [[package]] name = "unicode-width" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode_categories" @@ -4013,9 +3975,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ "getrandom", "rand", @@ -4051,16 +4013,16 @@ dependencies = [ [[package]] name = "validator_derive" -version = "0.18.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55591299b7007f551ed1eb79a684af7672c19c3193fb9e0a31936987bb2438ec" +checksum = "df0bcf92720c40105ac4b2dda2a4ea3aa717d4d6a862cc217da653a4bd5c6b10" dependencies = [ "darling", "once_cell", "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] @@ -4120,9 +4082,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", "once_cell", @@ -4131,24 +4093,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.85", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -4158,9 +4120,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4168,28 +4130,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.85", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -4203,11 +4165,11 @@ checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" [[package]] name = "whoami" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" dependencies = [ - "redox_syscall 0.4.1", + "redox_syscall", "wasite", ] @@ -4431,9 +4393,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] @@ -4473,7 +4435,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.85", ] [[package]] diff --git a/bun.lockb b/bun.lockb old mode 100644 new mode 100755 index 32db88c188bc06034564d9f40490a34694edc1f3..5553c3554cce2418969714fdad28f2cb87cd7d0d GIT binary patch delta 39044 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%0AEMPD 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 B+DHHZ delta 45896 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 BgOdON diff --git a/crates/blend-db/src/repo/entry.rs b/crates/blend-db/src/repo/entry.rs index 06ad2f88..d7c5c714 100644 --- a/crates/blend-db/src/repo/entry.rs +++ b/crates/blend-db/src/repo/entry.rs @@ -167,6 +167,16 @@ impl EntryRepo { .map_err(|err| err.into()) } + pub async fn update_all_entries_as_read(&self) -> DbResult { + let rows_affected = sqlx::query("UPDATE entries SET read_at = ?1 WHERE read_at IS NULL") + .bind(Utc::now()) + .execute(&self.db) + .await? + .rows_affected(); + + Ok(rows_affected > 0) + } + pub async fn update_entry_as_read(&self, entry_uuid: &uuid::Uuid) -> DbResult { let rows_affected = sqlx::query("UPDATE entries SET read_at = ?1 WHERE uuid = ?2") .bind(Utc::now()) diff --git a/crates/blend-db/src/repo/feed.rs b/crates/blend-db/src/repo/feed.rs index 4ab32fca..b163ba52 100644 --- a/crates/blend-db/src/repo/feed.rs +++ b/crates/blend-db/src/repo/feed.rs @@ -99,4 +99,15 @@ impl FeedRepo { Ok(rows_affected > 0) } + + pub async fn update_feed_as_read(&self, feed_uuid: &uuid::Uuid) -> DbResult { + let rows_affected = sqlx::query("UPDATE entries SET read_at = ?1 WHERE feed_uuid = ?2") + .bind(Utc::now()) + .bind(feed_uuid) + .execute(&self.db) + .await? + .rows_affected(); + + Ok(rows_affected > 0) + } } diff --git a/crates/blend-web/src/router/entry.rs b/crates/blend-web/src/router/entry.rs index e0db2a76..8b01cde6 100644 --- a/crates/blend-web/src/router/entry.rs +++ b/crates/blend-web/src/router/entry.rs @@ -14,6 +14,7 @@ use uuid::Uuid; pub fn router(ctx: crate::Context) -> Router { Router::new() .route("/", get(index)) + .route("/read", post(update_all_read)) .route("/:entry_uuid", get(view)) .route("/:entry_uuid/read", post(update_read)) .route("/:entry_uuid/unread", post(update_unread)) @@ -49,6 +50,12 @@ async fn view( Ok(Json(json!({ "data": entry }))) } +async fn update_all_read(State(ctx): State) -> WebResult { + let success = repo::entry::EntryRepo::new(ctx.db).update_all_entries_as_read().await?; + + Ok(Json(json!({ "success": success }))) +} + async fn update_read( State(ctx): State, Path(params): Path, diff --git a/crates/blend-web/src/router/feed.rs b/crates/blend-web/src/router/feed.rs index f228cdc2..502cf8c8 100644 --- a/crates/blend-web/src/router/feed.rs +++ b/crates/blend-web/src/router/feed.rs @@ -6,7 +6,7 @@ use axum::{ routing::{get, post}, Json, Router, }; -use blend_db::repo; +use blend_db::repo::{self, feed::FeedRepo}; use serde::Deserialize; use serde_json::json; use typeshare::typeshare; @@ -20,13 +20,14 @@ pub fn router(ctx: crate::Context) -> Router { .route("/refresh", post(refresh_feeds)) .route("/stats", get(stats)) .route("/:uuid", get(view)) + .route("/:uuid/read", post(update_read)) .route("/:uuid/refresh", post(refresh_feed)) .route_layer(from_fn_with_state(ctx.clone(), crate::middleware::auth)) .with_state(ctx) } async fn index(State(ctx): State) -> WebResult { - let feeds = repo::feed::FeedRepo::new(ctx.db).get_feeds().await?; + let feeds = FeedRepo::new(ctx.db).get_feeds().await?; Ok(Json(json!({ "data": feeds }))) } @@ -44,7 +45,7 @@ async fn create( data.validate()?; let parsed = blend_feed::parse_feed(&data.url).await?; - let feed = repo::feed::FeedRepo::new(ctx.db) + let feed = FeedRepo::new(ctx.db) .create_feed(repo::feed::CreateFeedParams { id: parsed.id, title: parsed.title.unwrap_or_else(|| data.url.clone()), @@ -64,7 +65,7 @@ async fn create( } async fn stats(State(ctx): State) -> WebResult { - let stats = repo::feed::FeedRepo::new(ctx.db).get_stats().await?; + let stats = FeedRepo::new(ctx.db).get_stats().await?; Ok(Json(json!({ "data": stats }))) } @@ -78,7 +79,7 @@ async fn view( State(ctx): State, Path(params): Path, ) -> WebResult { - let feed = repo::feed::FeedRepo::new(ctx.db) + let feed = FeedRepo::new(ctx.db) .get_feed(params.uuid) .await? .ok_or_else(|| WebError::NotFoundError)?; @@ -86,11 +87,20 @@ async fn view( Ok(Json(json!({ "data": feed }))) } +async fn update_read( + State(ctx): State, + Path(params): Path, +) -> WebResult { + let success = FeedRepo::new(ctx.db).update_feed_as_read(¶ms.uuid).await?; + + Ok(Json(json!({ "success": success }))) +} + async fn refresh_feed( State(ctx): State, Path(params): Path, ) -> WebResult { - let feed = repo::feed::FeedRepo::new(ctx.db) + let feed = FeedRepo::new(ctx.db) .get_feed(params.uuid) .await? .ok_or_else(|| WebError::NotFoundError)?; @@ -108,7 +118,7 @@ async fn refresh_feed( } async fn refresh_feeds(State(ctx): State) -> WebResult { - let feeds = repo::feed::FeedRepo::new(ctx.db).get_feeds().await?; + let feeds = FeedRepo::new(ctx.db).get_feeds().await?; let notifier = ctx.notif_tx.lock().await; let dispatcher = ctx.job_tx.lock().await; diff --git a/package.json b/package.json index 4d02f774..4183e6f2 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "typeshare:generate": "typeshare ./ --lang typescript --output-file ./ui/src/types/bindings.ts && biome check --write ./ui/src/types/bindings.ts" }, "dependencies": { - "@kobalte/core": "^0.13.5", + "@kobalte/core": "^0.13.7", "@kobalte/tailwindcss": "^0.9.0", "@solid-primitives/active-element": "^2.0.20", "@solid-primitives/bounds": "^0.0.122", @@ -28,31 +28,31 @@ "@solid-primitives/resize-observer": "^2.0.26", "@solid-primitives/scheduled": "^1.4.3", "@solid-primitives/scroll": "^2.0.23", - "@solidjs/router": "^0.14.3", - "@tanstack/solid-query": "^5.52.2", - "@tanstack/solid-query-devtools": "^5.52.2", + "@solidjs/router": "^0.14.10", + "@tanstack/solid-query": "^5.59.16", + "@tanstack/solid-query-devtools": "^5.59.16", "class-variance-authority": "^0.7.0", "partysocket": "^1.0.2", "solid-icons": "^1.1.0", - "solid-js": "^1.8.21", + "solid-js": "^1.9.3", "solid-transition-group": "^0.2.3", - "wretch": "^2.9.0" + "wretch": "^2.10.0" }, "devDependencies": { - "@biomejs/biome": "1.8.3", - "@tailwindcss/forms": "^0.5.7", - "@tailwindcss/typography": "^0.5.14", - "@total-typescript/ts-reset": "^0.6.0", - "@vitest/coverage-v8": "^2.0.5", + "@biomejs/biome": "1.9.4", + "@tailwindcss/forms": "^0.5.9", + "@tailwindcss/typography": "^0.5.15", + "@total-typescript/ts-reset": "^0.6.1", + "@vitest/coverage-v8": "^2.1.3", "autoprefixer": "^10.4.20", - "jsdom": "^25.0.0", - "postcss": "^8.4.41", + "jsdom": "^25.0.1", + "postcss": "^8.4.47", "solid-devtools": "^0.30.1", - "tailwindcss": "^3.4.10", - "typescript": "^5.5.4", - "vite": "^5.4.2", + "tailwindcss": "^3.4.14", + "typescript": "^5.6.3", + "vite": "^5.4.10", "vite-plugin-solid": "^2.10.2", "vite-tsconfig-paths": "^5.0.1", - "vitest": "^2.0.5" + "vitest": "^2.1.3" } } diff --git a/ui/src/api/entries.ts b/ui/src/api/entries.ts index 057f2193..9be2ca1d 100644 --- a/ui/src/api/entries.ts +++ b/ui/src/api/entries.ts @@ -18,6 +18,8 @@ export const getEntry = async (entry_uuid: string, signal: AbortSignal) => .json>() .then(res => res.data); +export const updateAllEntriesAsRead = async () => wretch(apiUrl('/entries/read')).post().json(); + export const updateEntryAsRead = async (entry_uuid: string) => wretch(apiUrl(`/entries/${entry_uuid}/read`)) .post() diff --git a/ui/src/api/feeds.ts b/ui/src/api/feeds.ts index 0a794fb5..b7c91dd3 100644 --- a/ui/src/api/feeds.ts +++ b/ui/src/api/feeds.ts @@ -33,3 +33,8 @@ export const refreshFeed = async (uuid: string) => wretch(apiUrl(`/feeds/${uuid}/refresh`)) .post() .json(); + +export const updateFeedAsRead = async (uuid: string) => + wretch(apiUrl(`/feeds/${uuid}/read`)) + .post() + .json(); diff --git a/ui/src/components/feed/feed-info.tsx b/ui/src/components/feed/feed-info.tsx index 46a64e24..fa7599c8 100644 --- a/ui/src/components/feed/feed-info.tsx +++ b/ui/src/components/feed/feed-info.tsx @@ -3,6 +3,7 @@ import { HiOutlineCheck } from 'solid-icons/hi'; import { type Component, Match, Switch, createSignal } from 'solid-js'; import { getFeed } from '~/api/feeds'; import { QUERY_KEYS } from '~/constants/query'; +import { useFeedRead } from '~/hooks/queries/use-feed-read'; import { FeedMenu } from '../menus/menu-feed'; import { IconButton } from '../ui/button/icon-button'; import { FeedHeader } from './feed-header'; @@ -12,6 +13,7 @@ type FeedInfoProps = { }; export const FeedInfo: Component = props => { + const markFeedAsRead = useFeedRead(); const feed = createQuery(() => ({ queryKey: [QUERY_KEYS.FEEDS_VIEW, props.uuid], queryFn: () => getFeed(props.uuid), @@ -33,14 +35,14 @@ export const FeedInfo: Component = props => {
- + markFeedAsRead(feed.data!.uuid)} /> = props => { const stats = useFeedsStats(); const refreshFeed = useRefreshFeed(); + const markFeedAsRead = useFeedRead(); const notifications = useNotifications(); const getPath = createMemo(() => `/feeds/${props.feed.uuid}`); @@ -62,11 +64,15 @@ export const FeedItem: Component = props => { /> )} > - + markFeedAsRead(props.feed.uuid)} + /> refreshFeed(props.feed.uuid)} icon={HiOutlineArrowPath} + onClick={() => refreshFeed(props.feed.uuid)} iconClass={isRefreshing() && 'animate-spin'} disabled={isRefreshing()} /> diff --git a/ui/src/constants/query.ts b/ui/src/constants/query.ts index ca55ee3c..513b99e1 100644 --- a/ui/src/constants/query.ts +++ b/ui/src/constants/query.ts @@ -5,10 +5,12 @@ export const QUERY_KEYS = { FEEDS_CREATE: 'feeds.create', FEEDS_VIEW: 'feeds.view', FEEDS_VIEW_REFRESH: 'feeds.view.refresh', + FEEDS_VIEW_READ: 'feeds.view.read', FEEDS_STATS: 'feeds.stats', // Entries ENTRIES_INDEX: 'entries.index', + ENTRIES_INDEX_READ: 'entries.index.read', ENTRIES_VIEW: 'entries.view', ENTRIES_VIEW_READ: 'entries.view.read', ENTRIES_VIEW_UNREAD: 'entries.view.unread', diff --git a/ui/src/hooks/queries/use-feed-read.ts b/ui/src/hooks/queries/use-feed-read.ts new file mode 100644 index 00000000..8371e7be --- /dev/null +++ b/ui/src/hooks/queries/use-feed-read.ts @@ -0,0 +1,24 @@ +import { createMutation, useQueryClient } from '@tanstack/solid-query'; +import { updateFeedAsRead } from '~/api/feeds'; +import { QUERY_KEYS } from '~/constants/query'; +import { useQueryState } from '~/contexts/query-state-context'; +import { useInvalidateStats } from '~/hooks/queries/use-invalidate-stats'; + +export const useFeedRead = () => { + const state = useQueryState(); + const queryClient = useQueryClient(); + const invalidateStats = useInvalidateStats(); + + const markAsRead = createMutation(() => ({ + mutationKey: [QUERY_KEYS.FEEDS_VIEW_READ], + mutationFn: updateFeedAsRead, + })); + + const invalidate = (feed_uuid: string) => { + invalidateStats(); + queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.FEEDS_VIEW, feed_uuid] }); + queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.ENTRIES_INDEX, undefined, state.getView()] }); + }; + + return (feed_uuid: string) => markAsRead.mutateAsync(feed_uuid).then(() => invalidate(feed_uuid)); +};