feat: Refactor VibeTorrent v3 with shared crate, fine-grained updates, tracing, and middleware optimization
This commit is contained in:
@@ -19,3 +19,4 @@ uuid = { version = "1", features = ["v4", "js"] }
|
||||
futures = "0.3"
|
||||
chrono = { version = "0.4", features = ["serde"] }
|
||||
web-sys = { version = "0.3", features = ["Window", "Storage"] }
|
||||
shared = { path = "../shared" }
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
use leptos::*;
|
||||
use crate::models::{Torrent, AppEvent, TorrentStatus, Theme};
|
||||
use shared::{Torrent, AppEvent, TorrentStatus, Theme, TorrentUpdate};
|
||||
use crate::components::context_menu::ContextMenu;
|
||||
use gloo_net::eventsource::futures::EventSource;
|
||||
use futures::StreamExt;
|
||||
@@ -120,9 +120,23 @@ pub fn App() -> impl IntoView {
|
||||
let data = msg.data().as_string().unwrap();
|
||||
match serde_json::from_str::<AppEvent>(&data) {
|
||||
Ok(event) => {
|
||||
if let AppEvent::FullList(list, ts) = event {
|
||||
set_torrents.set(list);
|
||||
set_last_updated.set(ts);
|
||||
match event {
|
||||
AppEvent::FullList(list, ts) => {
|
||||
set_torrents.set(list);
|
||||
set_last_updated.set(ts);
|
||||
}
|
||||
AppEvent::Update(diff) => {
|
||||
set_torrents.update(|list| {
|
||||
if let Some(target) = list.iter_mut().find(|t| t.hash == diff.hash) {
|
||||
if let Some(v) = diff.down_rate { target.down_rate = v; }
|
||||
if let Some(v) = diff.up_rate { target.up_rate = v; }
|
||||
if let Some(v) = diff.percent_complete { target.percent_complete = v; }
|
||||
if let Some(v) = diff.completed { target.completed = v; }
|
||||
if let Some(v) = diff.eta { target.eta = v; }
|
||||
if let Some(v) = diff.status { target.status = v; }
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
mod app;
|
||||
mod models;
|
||||
// mod models; // Removed
|
||||
mod components;
|
||||
|
||||
use leptos::*;
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
|
||||
pub struct Torrent {
|
||||
pub hash: String,
|
||||
pub name: String,
|
||||
pub size: i64,
|
||||
pub completed: i64,
|
||||
pub down_rate: i64,
|
||||
pub up_rate: i64,
|
||||
pub eta: i64,
|
||||
pub percent_complete: f64,
|
||||
pub status: TorrentStatus,
|
||||
pub error_message: String,
|
||||
pub added_date: i64,
|
||||
}
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
|
||||
pub enum TorrentStatus {
|
||||
Downloading,
|
||||
Seeding,
|
||||
Paused,
|
||||
Error,
|
||||
Checking,
|
||||
Queued,
|
||||
}
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||
#[serde(tag = "type", content = "data")]
|
||||
pub enum AppEvent {
|
||||
FullList(Vec<Torrent>, u64),
|
||||
Update(TorrentUpdate),
|
||||
}
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||
pub struct TorrentUpdate {
|
||||
pub hash: String,
|
||||
pub down_rate: Option<i64>,
|
||||
pub up_rate: Option<i64>,
|
||||
pub percent_complete: Option<f64>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
|
||||
pub enum Theme {
|
||||
Midnight,
|
||||
Light,
|
||||
Amoled,
|
||||
}
|
||||
Reference in New Issue
Block a user