use std::collections::HashSet; use jid::BareJID; use leptos::prelude::*; use crate::components::{ personal_status::PersonalStatus, chats_list::ChatsList, roster_list::RosterList, }; #[derive(PartialEq, Eq, Clone, Copy)] pub enum SidebarOpen { Roster, Chats, } pub enum Open { /// Currently on screen Focused, /// Open in background somewhere (e.g. in another chat tab) Open, /// Closed Closed, } impl Open { pub fn is_focused(&self) -> bool { match self { Open::Focused => true, Open::Open => false, Open::Closed => false, } } pub fn is_open(&self) -> bool { match self { Open::Focused => true, Open::Open => true, Open::Closed => false, } } } /// 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; false } else { *state = Some(open); true } } None => { *state = Some(open); true }, } } #[component] pub fn Sidebar() -> impl IntoView { let requests: ReadSignal> = use_context().expect("no pending subscriptions in context"); // for what has been clicked open (in the background) 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! { } }