make emotions named instead, add drop prop
This commit is contained in:
parent
989e20757b
commit
ea3b444d71
19 changed files with 1429 additions and 150 deletions
|
|
@ -6,7 +6,7 @@
|
|||
use leptos::prelude::*;
|
||||
use leptos::reactive::owner::LocalStorage;
|
||||
|
||||
use chattyness_db::models::ChannelMemberWithAvatar;
|
||||
use chattyness_db::models::{ChannelMemberWithAvatar, EmotionState, LooseProp};
|
||||
use chattyness_db::ws_messages::{ClientMessage, ServerMessage};
|
||||
|
||||
use super::chat_types::ChatMessage;
|
||||
|
|
@ -41,6 +41,9 @@ pub fn use_channel_websocket(
|
|||
channel_id: Signal<Option<uuid::Uuid>>,
|
||||
on_members_update: Callback<Vec<ChannelMemberWithAvatar>>,
|
||||
on_chat_message: Callback<ChatMessage>,
|
||||
on_loose_props_sync: Callback<Vec<LooseProp>>,
|
||||
on_prop_dropped: Callback<LooseProp>,
|
||||
on_prop_picked_up: Callback<uuid::Uuid>,
|
||||
) -> (Signal<WsState>, WsSenderStorage) {
|
||||
use std::cell::RefCell;
|
||||
use std::rc::Rc;
|
||||
|
|
@ -133,6 +136,9 @@ pub fn use_channel_websocket(
|
|||
let members_for_msg = members_clone.clone();
|
||||
let on_members_update_clone = on_members_update.clone();
|
||||
let on_chat_message_clone = on_chat_message.clone();
|
||||
let on_loose_props_sync_clone = on_loose_props_sync.clone();
|
||||
let on_prop_dropped_clone = on_prop_dropped.clone();
|
||||
let on_prop_picked_up_clone = on_prop_picked_up.clone();
|
||||
let onmessage = Closure::wrap(Box::new(move |e: MessageEvent| {
|
||||
if let Ok(text) = e.data().dyn_into::<js_sys::JsString>() {
|
||||
let text: String = text.into();
|
||||
|
|
@ -145,6 +151,9 @@ pub fn use_channel_websocket(
|
|||
&members_for_msg,
|
||||
&on_members_update_clone,
|
||||
&on_chat_message_clone,
|
||||
&on_loose_props_sync_clone,
|
||||
&on_prop_dropped_clone,
|
||||
&on_prop_picked_up_clone,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -187,6 +196,9 @@ fn handle_server_message(
|
|||
members: &std::rc::Rc<std::cell::RefCell<Vec<ChannelMemberWithAvatar>>>,
|
||||
on_update: &Callback<Vec<ChannelMemberWithAvatar>>,
|
||||
on_chat_message: &Callback<ChatMessage>,
|
||||
on_loose_props_sync: &Callback<Vec<LooseProp>>,
|
||||
on_prop_dropped: &Callback<LooseProp>,
|
||||
on_prop_picked_up: &Callback<uuid::Uuid>,
|
||||
) {
|
||||
let mut members_vec = members.borrow_mut();
|
||||
|
||||
|
|
@ -239,7 +251,11 @@ fn handle_server_message(
|
|||
if let Some(m) = members_vec.iter_mut().find(|m| {
|
||||
m.member.user_id == user_id && m.member.guest_session_id == guest_session_id
|
||||
}) {
|
||||
m.member.current_emotion = emotion as i16;
|
||||
// Convert emotion name to index for internal state
|
||||
m.member.current_emotion = emotion
|
||||
.parse::<EmotionState>()
|
||||
.map(|e| e.to_index() as i16)
|
||||
.unwrap_or(0);
|
||||
m.avatar.emotion_layer = emotion_layer;
|
||||
}
|
||||
on_update.run(members_vec.clone());
|
||||
|
|
@ -275,6 +291,19 @@ fn handle_server_message(
|
|||
};
|
||||
on_chat_message.run(chat_msg);
|
||||
}
|
||||
ServerMessage::LoosePropsSync { props } => {
|
||||
on_loose_props_sync.run(props);
|
||||
}
|
||||
ServerMessage::PropDropped { prop } => {
|
||||
on_prop_dropped.run(prop);
|
||||
}
|
||||
ServerMessage::PropPickedUp { prop_id, .. } => {
|
||||
on_prop_picked_up.run(prop_id);
|
||||
}
|
||||
ServerMessage::PropExpired { prop_id } => {
|
||||
// Treat expired props the same as picked up (remove from display)
|
||||
on_prop_picked_up.run(prop_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -285,6 +314,9 @@ pub fn use_channel_websocket(
|
|||
_channel_id: Signal<Option<uuid::Uuid>>,
|
||||
_on_members_update: Callback<Vec<ChannelMemberWithAvatar>>,
|
||||
_on_chat_message: Callback<ChatMessage>,
|
||||
_on_loose_props_sync: Callback<Vec<LooseProp>>,
|
||||
_on_prop_dropped: Callback<LooseProp>,
|
||||
_on_prop_picked_up: Callback<uuid::Uuid>,
|
||||
) -> (Signal<WsState>, WsSenderStorage) {
|
||||
let (ws_state, _) = signal(WsState::Disconnected);
|
||||
let sender: WsSenderStorage = StoredValue::new_local(None);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue