synpad 0.1.0

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

use crate::settings::appearance_settings::AppearanceSettings;
use crate::settings::general_settings::GeneralSettings;
use crate::settings::labs_settings::LabsSettings;
use crate::settings::notification_settings::NotificationSettings;
use crate::settings::security_settings::SecuritySettings;
use crate::settings::session_settings::SessionSettings;
use crate::settings::threepid_settings::ThreePidSettings;
use crate::settings::voice_video_settings::VoiceVideoSettings;

/// Active settings tab.
#[derive(Clone, Debug, PartialEq)]
enum SettingsTab {
    General,
    LinkedAccounts,
    Appearance,
    Notifications,
    Security,
    VoiceVideo,
    Sessions,
    Labs,
}

/// Settings screen with tab navigation.
#[component]
pub fn SettingsScreen() -> Element {
    let mut active_tab = use_signal(|| SettingsTab::General);

    let tabs = vec![
        ("General", SettingsTab::General),
        ("Email & Phone", SettingsTab::LinkedAccounts),
        ("Appearance", SettingsTab::Appearance),
        ("Notifications", SettingsTab::Notifications),
        ("Security", SettingsTab::Security),
        ("Voice & Video", SettingsTab::VoiceVideo),
        ("Sessions", SettingsTab::Sessions),
        ("Labs", SettingsTab::Labs),
    ];

    rsx! {
        div {
            class: "settings-screen",

            // Tab navigation
            nav {
                class: "settings-screen__tabs",
                for (label, tab) in tabs {
                    button {
                        class: if *active_tab.read() == tab {
                            "settings-screen__tab settings-screen__tab--active"
                        } else {
                            "settings-screen__tab"
                        },
                        onclick: move |_| active_tab.set(tab.clone()),
                        "{label}"
                    }
                }
            }

            // Tab content
            div {
                class: "settings-screen__content",
                match *active_tab.read() {
                    SettingsTab::General => rsx! { GeneralSettings {} },
                    SettingsTab::LinkedAccounts => rsx! { ThreePidSettings {} },
                    SettingsTab::Appearance => rsx! { AppearanceSettings {} },
                    SettingsTab::Notifications => rsx! { NotificationSettings {} },
                    SettingsTab::Security => rsx! { SecuritySettings {} },
                    SettingsTab::VoiceVideo => rsx! { VoiceVideoSettings {} },
                    SettingsTab::Sessions => rsx! { SessionSettings {} },
                    SettingsTab::Labs => rsx! { LabsSettings {} },
                }
            }
        }
    }
}