feat: add teleport

This commit is contained in:
Evan Carroll 2026-01-19 11:48:12 -06:00
parent 226c2e02b5
commit 32e5e42462
11 changed files with 603 additions and 16 deletions

View file

@ -73,6 +73,15 @@ pub struct WsError {
pub message: String,
}
/// Teleport information received from server.
#[derive(Clone, Debug)]
pub struct TeleportInfo {
/// Scene ID to teleport to.
pub scene_id: uuid::Uuid,
/// Scene slug for URL.
pub scene_slug: String,
}
/// Hook to manage WebSocket connection for a channel.
///
/// Returns a tuple of:
@ -91,6 +100,7 @@ pub fn use_channel_websocket(
on_member_fading: Callback<FadingMember>,
on_welcome: Option<Callback<ChannelMemberInfo>>,
on_error: Option<Callback<WsError>>,
on_teleport_approved: Option<Callback<TeleportInfo>>,
) -> (Signal<WsState>, WsSenderStorage) {
use std::cell::RefCell;
use std::rc::Rc;
@ -190,6 +200,7 @@ pub fn use_channel_websocket(
let on_member_fading_clone = on_member_fading.clone();
let on_welcome_clone = on_welcome.clone();
let on_error_clone = on_error.clone();
let on_teleport_approved_clone = on_teleport_approved.clone();
// For starting heartbeat on Welcome
let ws_ref_for_heartbeat = ws_ref.clone();
let heartbeat_started: Rc<RefCell<bool>> = Rc::new(RefCell::new(false));
@ -257,6 +268,7 @@ pub fn use_channel_websocket(
&on_prop_picked_up_clone,
&on_member_fading_clone,
&on_error_clone,
&on_teleport_approved_clone,
);
}
}
@ -304,6 +316,7 @@ fn handle_server_message(
on_prop_picked_up: &Callback<uuid::Uuid>,
on_member_fading: &Callback<FadingMember>,
on_error: &Option<Callback<WsError>>,
on_teleport_approved: &Option<Callback<TeleportInfo>>,
) {
let mut members_vec = members.borrow_mut();
@ -456,6 +469,17 @@ fn handle_server_message(
}
on_update.run(members_vec.clone());
}
ServerMessage::TeleportApproved {
scene_id,
scene_slug,
} => {
if let Some(callback) = on_teleport_approved {
callback.run(TeleportInfo {
scene_id,
scene_slug,
});
}
}
}
}
@ -473,6 +497,7 @@ pub fn use_channel_websocket(
_on_member_fading: Callback<FadingMember>,
_on_welcome: Option<Callback<ChannelMemberInfo>>,
_on_error: Option<Callback<WsError>>,
_on_teleport_approved: Option<Callback<TeleportInfo>>,
) -> (Signal<WsState>, WsSenderStorage) {
let (ws_state, _) = signal(WsState::Disconnected);
let sender: WsSenderStorage = StoredValue::new_local(None);