feat: added live updates for checking in
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use leptos::{either::Either, prelude::*};
|
||||
use leptos_router::components::A;
|
||||
#[cfg(feature = "hydrate")]
|
||||
use leptos_use::use_websocket;
|
||||
use serde::{Deserialize, Serialize};
|
||||
@@ -62,7 +63,7 @@ pub struct CurrentBeaconInstance {
|
||||
unsafe impl Send for CurrentBeaconInstance {}
|
||||
unsafe impl Send for SidebarEvents {}
|
||||
|
||||
#[derive(Clone, Serialize, Deserialize)]
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub enum SidebarEvents {
|
||||
BeaconList(Vec<CurrentBeaconInstance>),
|
||||
NewBeacon(CurrentBeaconInstance),
|
||||
@@ -99,6 +100,8 @@ pub fn BeaconSidebar() -> impl IntoView {
|
||||
return;
|
||||
};
|
||||
|
||||
leptos::logging::log!("Received message: {m:?}");
|
||||
|
||||
match m {
|
||||
SidebarEvents::BeaconList(bs) => {
|
||||
let mut bs = bs.to_vec();
|
||||
@@ -125,6 +128,7 @@ pub fn BeaconSidebar() -> impl IntoView {
|
||||
return;
|
||||
};
|
||||
if let Some(ref mut b) = bs.iter_mut().find(|b| b.beacon_id == *bid) {
|
||||
leptos::logging::log!("Found beacon to check in");
|
||||
b.last_checkin = chrono::Utc::now();
|
||||
}
|
||||
}),
|
||||
@@ -163,10 +167,6 @@ pub fn BeaconSidebar() -> impl IntoView {
|
||||
let partitions = move || -> Vec<BeaconPartition> {
|
||||
use regex::Regex;
|
||||
|
||||
leptos::logging::log!(
|
||||
"There are {:?} beacons",
|
||||
current_beacons.read().as_ref().map(Vec::len)
|
||||
);
|
||||
let sm = sort_method.read();
|
||||
let search_regex = Regex::new(&*search_input.read());
|
||||
let str_match_search = {
|
||||
@@ -558,23 +558,26 @@ pub fn BeaconSidebar() -> impl IntoView {
|
||||
|
||||
<For
|
||||
each={
|
||||
let beacons = Arc::clone(&partition.beacons);
|
||||
move || (beacons)()
|
||||
move || (partition.beacons)()
|
||||
}
|
||||
key=|b| b.beacon_id.clone()
|
||||
key=|b| (b.beacon_id.clone(), b.last_checkin)
|
||||
let:beacon
|
||||
>
|
||||
<div class="beacon-instance">
|
||||
<div class="beacon-instance-id">
|
||||
{match &*beacon.nickname {
|
||||
"" => Either::Left(view! {
|
||||
<span>{beacon.beacon_id.clone()}</span>
|
||||
<A href=format!("/beacons/beacon/{}", &beacon.beacon_id)>
|
||||
<span>{beacon.beacon_id.clone()}</span>
|
||||
</A>
|
||||
}),
|
||||
nick => {
|
||||
let nick = nick.to_string();
|
||||
Either::Right(view! {
|
||||
{nick}
|
||||
<span>"(" {beacon.beacon_id.clone()} ")"</span>
|
||||
<A href=format!("/beacons/beacon/{}", &beacon.beacon_id)>
|
||||
{nick}
|
||||
<span>"(" {beacon.beacon_id.clone()} ")"</span>
|
||||
</A>
|
||||
})
|
||||
}
|
||||
}}
|
||||
|
||||
@@ -430,8 +430,35 @@ async fn handle_listener_events(
|
||||
let mut event_receiver = state.beacon_event_broadcast.subscribe();
|
||||
|
||||
loop {
|
||||
use sparse_handler::BeaconEvent;
|
||||
|
||||
let event = event_receiver.recv().await;
|
||||
|
||||
match event {
|
||||
Ok(BeaconEvent::Checkin(bid)) => {
|
||||
socket.send(ws::Message::Text(serde_json::to_string(&SidebarEvents::Checkin(bid.clone()))?)).await?;
|
||||
}
|
||||
Ok(BeaconEvent::NewBeacon(bid)) => {
|
||||
let beacons = sqlx::query!(
|
||||
"SELECT template_id, peer_ip, nickname, cwd, operating_system, beacon_userent, hostname, config_id FROM beacon_instance
|
||||
WHERE beacon_id = ?",
|
||||
bid
|
||||
)
|
||||
.fetch_one(&state.db)
|
||||
.await?;
|
||||
|
||||
let category_ids = sqlx::query!(
|
||||
"SELECT category_id FROM beacon_category_assignment
|
||||
WHERE beacon_id = ?",
|
||||
bid
|
||||
)
|
||||
.fetch_one(&state.db)
|
||||
.await?;
|
||||
}
|
||||
Err(e) => {
|
||||
tracing::warn!("Unable to handle general event: {e:?}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user