Files
Mycelium-ui-private/src-tauri/src/state.rs
syoul c1a81a9065 P2: peers CRUD and aggregated stats
Backend
- api/peers.rs: list/add/remove + aggregate() that derives totals,
  per-state counts, and tx/rx sums in one pass over the peer list
- poller.rs spawns a 3s tokio loop that emits peers://updated and
  stats://updated; cancelled via abort() on stop_daemon
- DELETE peer URL-encodes the endpoint (the path includes ://) with
  a small inline percent-encoder to avoid a url crate dep
- Tauri commands: peers_list, peer_add (with empty-string guard),
  peer_remove, peers_stats

Frontend
- peers store subscribes to the two events and refreshes after
  add/remove for immediate UI feedback
- Peers view renders endpoint, type, color-coded state badge, and
  formatBytes-formatted rx/tx; the four stat cards re-use a
  reusable Stat component
- AddPeerDialog uses radix-vue's Dialog primitive with regex
  validation for tcp:// and quic:// schemes
2026-04-25 22:56:50 +02:00

24 lines
412 B
Rust

use crate::poller::Poller;
use crate::sidecar::SidecarHandle;
use std::sync::Arc;
pub struct AppState {
pub sidecar: Arc<SidecarHandle>,
pub poller: Arc<Poller>,
}
impl AppState {
pub fn new() -> Self {
Self {
sidecar: SidecarHandle::new(),
poller: Poller::new(),
}
}
}
impl Default for AppState {
fn default() -> Self {
Self::new()
}
}