synpad 0.1.0

A full-featured Matrix chat client built with Dioxus
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,
                            }
                        }
                    }
                }
            }
        }
    }
}