synpad 0.1.0

A full-featured Matrix chat client built with Dioxus
use dioxus::prelude::*;

use crate::state::room_state::PresenceStatus;

/// Small presence dot indicator (green/orange/grey) with optional custom status text.
#[component]
pub fn PresenceIndicator(
    status: PresenceStatus,
    size: Option<u32>,
    custom_status: Option<String>,
) -> Element {
    let dot_size = size.unwrap_or(10);
    let dot_class = match status {
        PresenceStatus::Online => "presence-indicator presence-indicator--online",
        PresenceStatus::Unavailable => "presence-indicator presence-indicator--unavailable",
        PresenceStatus::Offline => "presence-indicator presence-indicator--offline",
    };
    let title = match status {
        PresenceStatus::Online => "Online",
        PresenceStatus::Unavailable => "Away",
        PresenceStatus::Offline => "Offline",
    };

    let has_status = custom_status.is_some();
    let status_text = custom_status.unwrap_or_default();

    if has_status {
        rsx! {
            span {
                class: "presence-indicator-wrapper",
                span {
                    class: dot_class,
                    title: title,
                    width: "{dot_size}px",
                    height: "{dot_size}px",
                }
                span {
                    class: "presence-indicator__status-text",
                    "{status_text}"
                }
            }
        }
    } else {
        rsx! {
            span {
                class: dot_class,
                title: title,
                width: "{dot_size}px",
                height: "{dot_size}px",
            }
        }
    }
}