1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
use dioxus::prelude::*;
use crate::components::avatar::Avatar;
use crate::state::app_state::AppState;
/// Breadcrumbs bar showing recently visited rooms for quick switching.
#[component]
pub fn Breadcrumbs() -> Element {
let mut state = use_context::<Signal<AppState>>();
let crumbs: Vec<(String, String, Option<String>)> = {
let s = state.read();
s.breadcrumbs.iter().take(8).filter_map(|rid| {
s.rooms.get(rid).map(|r| {
(rid.to_string(), r.display_name.clone(), r.avatar_url.clone())
})
}).collect()
};
if crumbs.is_empty() {
return rsx! {};
}
rsx! {
div {
class: "breadcrumbs-bar",
for (rid, name, avatar) in crumbs.iter() {
{
let rid = rid.clone();
let name = name.clone();
let avatar = avatar.clone();
rsx! {
button {
class: "breadcrumbs-bar__item",
title: "{name}",
onclick: move |_| {
if let Ok(room_id) = matrix_sdk::ruma::OwnedRoomId::try_from(rid.as_str()) {
state.write().active_room_id = Some(room_id);
}
},
Avatar {
name: name.clone(),
url: avatar,
size: 28,
}
}
}
}
}
}
}
}