add SPA config UI, wire media/rss adapters, event-driven layout push

- React SPA: dashboard, data sources CRUD, widgets CRUD, layout builder,
  presets. TanStack Router + Query, shadcn/ui, Vite proxy to :3000
- wire media + rss adapters into polling loop, remove xtb source type
- media adapter: read username/password from headers, proper subsonic auth
- event handler: subscribe to LayoutChanged, push screen update to clients
- fix clippy warnings across workspace (Default impls, collapsible ifs,
  redundant closures, is_none_or, unused imports)
This commit is contained in:
2026-06-19 00:12:42 +02:00
parent 21c08911df
commit 26ebfad3a2
175 changed files with 12338 additions and 801 deletions

View File

@@ -1,11 +1,11 @@
use std::thread;
use std::sync::mpsc;
use std::time::Duration;
use client_domain::{BoundingBox, DisplayPort, NetworkPort};
use client_application::ClientApp;
use tcp_client::StdTcpClient;
use client_domain::{BoundingBox, DisplayPort, NetworkPort};
use display_terminal::TerminalDisplay;
use protocol::decode_server_message;
use std::sync::mpsc;
use std::thread;
use std::time::Duration;
use tcp_client::StdTcpClient;
fn main() {
let screen = BoundingBox::screen(240, 320);
@@ -35,12 +35,12 @@ fn main() {
}
match net.receive() {
Ok(Some(payload)) => {
match decode_server_message(&payload) {
Ok(msg) => { let _ = tx.send(msg); }
Err(e) => println!("[NET] Decode error: {e}"),
Ok(Some(payload)) => match decode_server_message(&payload) {
Ok(msg) => {
let _ = tx.send(msg);
}
}
Err(e) => println!("[NET] Decode error: {e}"),
},
Ok(None) => {
thread::sleep(Duration::from_millis(50));
}
@@ -67,11 +67,14 @@ fn main() {
for kv in &cmd.state.data {
if let protocol::WireValue::String(s) = &kv.value {
display.draw_text(
&format!("{}: {s}", kv.key),
cmd.bounds.x, cmd.bounds.y,
cmd.bounds,
).unwrap();
display
.draw_text(
&format!("{}: {s}", kv.key),
cmd.bounds.x,
cmd.bounds.y,
cmd.bounds,
)
.unwrap();
}
}
}