synpad 0.1.0

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

/// Bridge status indicator shown in room headers when a bridge bot is present.
#[component]
pub fn BridgeStatusIndicator(bridge_type: String, is_connected: bool) -> Element {
    let (icon, label) = match bridge_type.as_str() {
        "telegram" => ("🔗", "Telegram Bridge"),
        "discord" => ("🔗", "Discord Bridge"),
        "slack" => ("🔗", "Slack Bridge"),
        "irc" => ("🔗", "IRC Bridge"),
        "signal" => ("🔗", "Signal Bridge"),
        "whatsapp" => ("🔗", "WhatsApp Bridge"),
        "facebook" => ("🔗", "Facebook Bridge"),
        "twitter" => ("🔗", "Twitter Bridge"),
        "email" => ("🔗", "Email Bridge"),
        _ => ("🔗", "Bridge"),
    };

    let status_class = if is_connected {
        "bridge-status bridge-status--connected"
    } else {
        "bridge-status bridge-status--disconnected"
    };

    rsx! {
        span {
            class: status_class,
            title: if is_connected { format!("{label}: Connected") } else { format!("{label}: Disconnected") },
            span { class: "bridge-status__icon", "{icon}" }
            span { class: "bridge-status__label", "{label}" }
            span {
                class: if is_connected { "bridge-status__dot bridge-status__dot--ok" } else { "bridge-status__dot bridge-status__dot--error" },
            }
        }
    }
}

/// Detect bridge type from a user ID (bridge bots typically have specific patterns).
pub fn detect_bridge_from_user_id(user_id: &str) -> Option<String> {
    if user_id.contains("@telegram_") || user_id.contains("@telegrambot:") {
        Some("telegram".to_string())
    } else if user_id.contains("@_discord_") || user_id.contains("@discordbot:") {
        Some("discord".to_string())
    } else if user_id.contains("@slack_") || user_id.contains("@slackbot:") {
        Some("slack".to_string())
    } else if user_id.contains("@irc_") || user_id.contains("@appservice-irc:") {
        Some("irc".to_string())
    } else if user_id.contains("@signal_") || user_id.contains("@signalbot:") {
        Some("signal".to_string())
    } else if user_id.contains("@whatsapp_") || user_id.contains("@whatsappbot:") {
        Some("whatsapp".to_string())
    } else {
        None
    }
}