update to support user expire, timeout, and disconnect
This commit is contained in:
parent
fe65835f4a
commit
5fcd49e847
16 changed files with 744 additions and 238 deletions
|
|
@ -20,6 +20,7 @@ use super::chat_types::ActiveBubble;
|
|||
use super::settings::{
|
||||
calculate_min_zoom, ViewerSettings, BASE_PROP_SIZE, REFERENCE_HEIGHT, REFERENCE_WIDTH,
|
||||
};
|
||||
use super::ws_client::FadingMember;
|
||||
use crate::utils::parse_bounds_dimensions;
|
||||
|
||||
/// Scene viewer component for displaying a realm scene with avatars.
|
||||
|
|
@ -49,6 +50,9 @@ pub fn RealmSceneViewer(
|
|||
/// Callback for zoom changes (from mouse wheel). Receives zoom delta.
|
||||
#[prop(optional)]
|
||||
on_zoom_change: Option<Callback<f64>>,
|
||||
/// Members that are fading out after timeout disconnect.
|
||||
#[prop(optional, into)]
|
||||
fading_members: Option<Signal<Vec<FadingMember>>>,
|
||||
) -> impl IntoView {
|
||||
// Use default settings if none provided
|
||||
let settings = settings.unwrap_or_else(|| Signal::derive(ViewerSettings::default));
|
||||
|
|
@ -774,7 +778,8 @@ pub fn RealmSceneViewer(
|
|||
let ps = prop_size.get();
|
||||
let te = text_em_size.get();
|
||||
|
||||
sorted_members.get()
|
||||
// Render active members
|
||||
let mut views: Vec<_> = sorted_members.get()
|
||||
.into_iter()
|
||||
.enumerate()
|
||||
.map(|(idx, member)| {
|
||||
|
|
@ -795,7 +800,39 @@ pub fn RealmSceneViewer(
|
|||
/>
|
||||
}
|
||||
})
|
||||
.collect_view()
|
||||
.collect();
|
||||
|
||||
// Render fading members with calculated opacity
|
||||
if let Some(fading_signal) = fading_members {
|
||||
#[cfg(feature = "hydrate")]
|
||||
let now = js_sys::Date::now() as i64;
|
||||
#[cfg(not(feature = "hydrate"))]
|
||||
let now = 0i64;
|
||||
|
||||
for fading in fading_signal.get() {
|
||||
let elapsed = now - fading.fade_start;
|
||||
if elapsed < fading.fade_duration {
|
||||
let opacity = 1.0 - (elapsed as f64 / fading.fade_duration as f64);
|
||||
let opacity = opacity.max(0.0).min(1.0);
|
||||
views.push(view! {
|
||||
<AvatarCanvas
|
||||
member=fading.member
|
||||
scale_x=sx
|
||||
scale_y=sy
|
||||
offset_x=ox
|
||||
offset_y=oy
|
||||
prop_size=ps
|
||||
z_index=5
|
||||
active_bubble=None
|
||||
text_em_size=te
|
||||
opacity=opacity
|
||||
/>
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
views.into_iter().collect_view()
|
||||
}}
|
||||
</div>
|
||||
// Click overlay - captures clicks for movement and hit-testing
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue