From 62aaa8cb8583d9189358a6c15ca69257b342c4ea Mon Sep 17 00:00:00 2001 From: cel 🌸 Date: Thu, 15 May 2025 09:09:37 +0100 Subject: feat: dock hover and pinning focus --- src/lib.rs | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 111 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index 194a8d9..5961204 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -621,6 +621,15 @@ fn Macaw( let user_presences = Store::new(UserPresences::new()); provide_context(user_presences); + let client_user = LocalResource::new(move || { + async move { + let client = use_context::().expect("client not in context"); + let user = client.get_user((*client.jid).clone()).await.unwrap(); + MacawUser::got_user(user) + } + }); + provide_context(client_user); + // TODO: get cached contacts on login before getting the updated contacts OnceResource::new(async move { @@ -717,16 +726,22 @@ pub enum SidebarOpen { Chats, } -pub fn toggle_open(state: &mut Option, open: SidebarOpen) { +/// returns whether the state was changed to open (true) or closed (false) +pub fn toggle_open(state: &mut Option, open: SidebarOpen) -> bool { match state { Some(opened) => { if *opened == open { - *state = None + *state = None; + false } else { - *state = Some(open) + *state = Some(open); + true } } - None => *state = Some(open), + None => { + *state = Some(open); + true + }, } } @@ -736,19 +751,41 @@ pub fn Sidebar() -> impl IntoView { let (open, set_open) = signal(None::); // for what is just in the hovered state (not clicked to be pinned open yet necessarily) let (hovered, set_hovered) = signal(None::); + let (just_closed, set_just_closed) = signal(false); view! { -