fix: teleport was prepopulating prior wisper

This commit is contained in:
Evan Carroll 2026-01-20 20:11:37 -06:00
parent 41ea9d13cb
commit 864cfaec54
2 changed files with 19 additions and 9 deletions

View file

@ -128,8 +128,9 @@ pub fn ChatInput(
#[prop(optional)] #[prop(optional)]
on_open_log: Option<Callback<()>>, on_open_log: Option<Callback<()>>,
/// Signal containing the display name to whisper to. When set, pre-fills the input. /// Signal containing the display name to whisper to. When set, pre-fills the input.
#[prop(optional, into)] /// Uses RwSignal so the component can clear it after consuming.
whisper_target: Option<Signal<Option<String>>>, #[prop(optional)]
whisper_target: Option<RwSignal<Option<String>>>,
/// List of available scenes for teleport command. /// List of available scenes for teleport command.
#[prop(optional, into)] #[prop(optional, into)]
scenes: Option<Signal<Vec<SceneSummary>>>, scenes: Option<Signal<Vec<SceneSummary>>>,
@ -240,6 +241,9 @@ pub fn ChatInput(
let _ = input.focus(); let _ = input.focus();
let len = whisper_prefix.len() as u32; let len = whisper_prefix.len() as u32;
let _ = input.set_selection_range(len, len); let _ = input.set_selection_range(len, len);
// Clear the whisper target so it doesn't re-trigger on re-render
whisper_signal.set(None);
} }
}); });
} }

View file

@ -111,7 +111,7 @@ pub fn RealmPage() -> impl IntoView {
let (is_guest, set_is_guest) = signal(false); let (is_guest, set_is_guest) = signal(false);
// Whisper target - when set, triggers pre-fill in ChatInput // Whisper target - when set, triggers pre-fill in ChatInput
let (whisper_target, set_whisper_target) = signal(Option::<String>::None); let whisper_target = RwSignal::new(Option::<String>::None);
// Notification state for cross-scene whispers // Notification state for cross-scene whispers
let (current_notification, set_current_notification) = let (current_notification, set_current_notification) =
@ -852,10 +852,17 @@ pub fn RealmPage() -> impl IntoView {
*closure_holder_clone.borrow_mut() = Some(closure); *closure_holder_clone.borrow_mut() = Some(closure);
// Add keyup handler for releasing '?' (hotkey help) // Add keyup handler for releasing '?' (hotkey help)
// We hide on any keyup when visible, since ? = Shift+/ and releasing
// either key means the user is no longer holding '?'
let keyup_closure = Closure::<dyn Fn(web_sys::KeyboardEvent)>::new( let keyup_closure = Closure::<dyn Fn(web_sys::KeyboardEvent)>::new(
move |ev: web_sys::KeyboardEvent| { move |ev: web_sys::KeyboardEvent| {
if ev.key() == "?" { let key = ev.key();
// Hide if releasing ?, /, or Shift while help is visible
if hotkey_help_visible.get_untracked()
&& (key == "?" || key == "/" || key == "Shift")
{
set_hotkey_help_visible.set(false); set_hotkey_help_visible.set(false);
ev.prevent_default();
} }
}, },
); );
@ -1024,9 +1031,8 @@ pub fn RealmPage() -> impl IntoView {
let on_open_log_cb = Callback::new(move |_: ()| { let on_open_log_cb = Callback::new(move |_: ()| {
set_log_open.set(true); set_log_open.set(true);
}); });
let whisper_target_signal = Signal::derive(move || whisper_target.get());
let on_whisper_request_cb = Callback::new(move |target: String| { let on_whisper_request_cb = Callback::new(move |target: String| {
set_whisper_target.set(Some(target)); whisper_target.set(Some(target));
}); });
let scenes_signal = Signal::derive(move || available_scenes.get()); let scenes_signal = Signal::derive(move || available_scenes.get());
let teleport_enabled_signal = Signal::derive(move || allow_user_teleport.get()); let teleport_enabled_signal = Signal::derive(move || allow_user_teleport.get());
@ -1074,7 +1080,7 @@ pub fn RealmPage() -> impl IntoView {
on_open_settings=on_open_settings_cb on_open_settings=on_open_settings_cb
on_open_inventory=on_open_inventory_cb on_open_inventory=on_open_inventory_cb
on_open_log=on_open_log_cb on_open_log=on_open_log_cb
whisper_target=whisper_target_signal whisper_target=whisper_target
scenes=scenes_signal scenes=scenes_signal
allow_user_teleport=teleport_enabled_signal allow_user_teleport=teleport_enabled_signal
on_teleport=on_teleport_cb on_teleport=on_teleport_cb
@ -1179,7 +1185,7 @@ pub fn RealmPage() -> impl IntoView {
<NotificationToast <NotificationToast
notification=Signal::derive(move || current_notification.get()) notification=Signal::derive(move || current_notification.get())
on_reply=Callback::new(move |name: String| { on_reply=Callback::new(move |name: String| {
set_whisper_target.set(Some(name)); whisper_target.set(Some(name));
}) })
on_context=Callback::new(move |name: String| { on_context=Callback::new(move |name: String| {
set_conversation_partner.set(name); set_conversation_partner.set(name);
@ -1222,7 +1228,7 @@ pub fn RealmPage() -> impl IntoView {
open=Signal::derive(move || history_modal_open.get()) open=Signal::derive(move || history_modal_open.get())
on_close=Callback::new(move |_: ()| set_history_modal_open.set(false)) on_close=Callback::new(move |_: ()| set_history_modal_open.set(false))
on_reply=Callback::new(move |name: String| { on_reply=Callback::new(move |name: String| {
set_whisper_target.set(Some(name)); whisper_target.set(Some(name));
}) })
on_context=Callback::new(move |name: String| { on_context=Callback::new(move |name: String| {
set_conversation_partner.set(name); set_conversation_partner.set(name);