🚧 Use of the use_long_press to open a future room configuration menu

This commit is contained in:
2024-06-22 20:55:19 +02:00
parent e55992aed5
commit f0463213cf
2 changed files with 45 additions and 25 deletions

View File

@@ -1,12 +1,18 @@
use std::{rc::Rc, time::Duration};
use base64::{engine::general_purpose, Engine as _}; use base64::{engine::general_purpose, Engine as _};
use dioxus::prelude::*; use dioxus::prelude::*;
use tracing::{debug, trace, warn}; use tracing::{debug, warn};
use super::{button::Button, icons::SearchIcon, text_input::TextInput}; use super::{button::Button, icons::SearchIcon, text_input::TextInput};
use crate::{ use crate::{
domain::model::{common::PresenceState as DomainPresenceState, room::RoomId, space::SpaceId}, domain::model::{common::PresenceState as DomainPresenceState, room::RoomId, space::SpaceId},
ui::{ ui::{
components::icons::{ChatsIcon, LogoIcon, RoomsIcon, SpacesIcon}, components::{
button::{JoinButton, RejectButton},
icons::{ChatsIcon, LogoIcon, RoomsIcon, SpacesIcon},
},
hooks::use_long_press,
ACCOUNT, STORE, ACCOUNT, STORE,
}, },
}; };
@@ -167,13 +173,16 @@ pub fn Account() -> Element {
} }
#[component] #[component]
pub fn ConversationAvatar(room_id: RoomId, on_clicked: EventHandler<RoomId>) -> Element { pub fn ConversationAvatar(
room_id: RoomId,
on_selected: EventHandler<RoomId>,
on_pressed: EventHandler<RoomId>,
) -> Element {
let long_press_duration = Duration::from_millis(500);
let rooms = STORE.read().rooms(); let rooms = STORE.read().rooms();
let toto = rooms.get(&room_id).unwrap(); let room = rooms.get(&room_id).unwrap().signal();
let room_id = Rc::new(room_id);
let room = toto.signal();
let room_id = room.id();
let room_name = room.name(); let room_name = room.name();
let selected_room_id = use_context::<Signal<Option<RoomId>>>(); let selected_room_id = use_context::<Signal<Option<RoomId>>>();
@@ -193,7 +202,7 @@ pub fn ConversationAvatar(room_id: RoomId, on_clicked: EventHandler<RoomId>) ->
}; };
let is_selected = match selected_room_id.read().as_ref() { let is_selected = match selected_room_id.read().as_ref() {
Some(selected_room_id) => *selected_room_id == room_id, Some(selected_room_id) => *selected_room_id == *room_id,
None => false, None => false,
}; };
@@ -232,14 +241,24 @@ pub fn ConversationAvatar(room_id: RoomId, on_clicked: EventHandler<RoomId>) ->
]; ];
let classes_str = classes.join(" "); let classes_str = classes.join(" ");
let on_press = {
let room_id = room_id.clone();
move || {
on_selected.call(room_id.as_ref().clone());
}
};
let on_long_press = move || {
on_pressed.call(room_id.as_ref().clone());
};
let long_press_hook = use_long_press(long_press_duration, on_press, on_long_press);
rsx! { rsx! {
div { div {
class: "{classes_str}", class: "{classes_str}",
onclick: move |evt| { ..long_press_hook.handlers,
on_clicked.call(room_id.clone());
evt.stop_propagation();
},
{avatar} {avatar}
{invited_badge} {invited_badge}
@@ -248,7 +267,10 @@ pub fn ConversationAvatar(room_id: RoomId, on_clicked: EventHandler<RoomId>) ->
} }
#[component] #[component]
pub fn ConversationsCarousel(on_selected_conversation: EventHandler<RoomId>) -> Element { pub fn ConversationsCarousel(
on_selected_conversation: EventHandler<RoomId>,
on_pressed_conversation: EventHandler<RoomId>,
) -> Element {
let mut ordered_rooms = use_signal(Vec::<RoomId>::new); let mut ordered_rooms = use_signal(Vec::<RoomId>::new);
use_effect(move || { use_effect(move || {
@@ -267,7 +289,8 @@ pub fn ConversationsCarousel(on_selected_conversation: EventHandler<RoomId>) ->
rsx! { rsx! {
ConversationAvatar { ConversationAvatar {
room_id: room.clone(), room_id: room.clone(),
on_clicked: on_selected_conversation, on_selected: on_selected_conversation,
on_pressed: on_pressed_conversation,
} }
} }
}); });
@@ -286,7 +309,7 @@ pub fn ConversationsCarousel(on_selected_conversation: EventHandler<RoomId>) ->
// If id is None, the Space will handle all the Conversation which have no parent (Space). // If id is None, the Space will handle all the Conversation which have no parent (Space).
#[component] #[component]
pub fn Space(id: Option<SpaceId>) -> Element { pub fn Space(id: Option<SpaceId>, on_pressed_conversation: EventHandler<RoomId>) -> Element {
let mut selected_room_id = use_context_provider(|| Signal::new(None::<RoomId>)); let mut selected_room_id = use_context_provider(|| Signal::new(None::<RoomId>));
let mut displayed_rooms = use_context_provider(|| Signal::new(Vec::<RoomId>::new())); let mut displayed_rooms = use_context_provider(|| Signal::new(Vec::<RoomId>::new()));
@@ -362,44 +385,42 @@ pub fn Space(id: Option<SpaceId>) -> Element {
}, },
ConversationsCarousel { ConversationsCarousel {
on_selected_conversation, on_selected_conversation,
on_pressed_conversation,
}, },
div { div {
class: ClassName::SPACE_CONVERSATION_NAME, class: ClassName::SPACE_CONVERSATION_NAME,
p { p {
{selected_room_name}, {selected_room_name},
} }
} },
} }
} }
} }
pub fn Spaces() -> Element { #[component]
pub fn Spaces(on_pressed_conversation: EventHandler<RoomId>) -> Element {
let spaces = STORE.read().spaces(); let spaces = STORE.read().spaces();
let space_ids = spaces.keys().clone().last(); let space_ids = spaces.keys().clone().last();
let rendered_spaces = space_ids.map(|id| { let rendered_spaces = space_ids.map(|id| {
rsx! { rsx! {
Space { id: id.clone() } Space { id: id.clone(), on_pressed_conversation }
} }
}); });
rsx! { rsx! {
style { {STYLE_SHEET} },
div { div {
class: ClassName::SPACES, class: ClassName::SPACES,
{rendered_spaces}, {rendered_spaces},
Space {}, Space { on_pressed_conversation },
} }
} }
} }
pub fn Search() -> Element { pub fn Search() -> Element {
rsx! { rsx! {
style { {STYLE_SHEET} },
div { div {
class: ClassName::SEARCH, class: ClassName::SEARCH,

View File

@@ -619,7 +619,6 @@ pub fn Login() -> Element {
}); });
if *spinner_animated.read() && SESSION.read().is_logged { if *spinner_animated.read() && SESSION.read().is_logged {
debug!("Stop spinner");
spinner_animated.set(false); spinner_animated.set(false);
} }