synpad 0.1.0

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

use crate::components::modal::Modal;
use crate::state::app_state::AppState;

/// Account deactivation dialog with safety checks.
#[component]
pub fn AccountDeactivationDialog(on_close: EventHandler<()>) -> Element {
    let state = use_context::<Signal<AppState>>();
    let mut password = use_signal(|| String::new());
    let mut erase_data = use_signal(|| false);
    let mut confirmed = use_signal(|| false);
    let mut deactivating = use_signal(|| false);
    let mut error = use_signal(|| Option::<String>::None);
    let mut confirm_text = use_signal(|| String::new());

    let on_deactivate = move |_| {
        if confirm_text.read().as_str() != "DEACTIVATE" {
            error.set(Some("Please type DEACTIVATE to confirm".to_string()));
            return;
        }
        if password.read().is_empty() {
            error.set(Some("Password is required".to_string()));
            return;
        }

        deactivating.set(true);
        error.set(None);

        let _pw = password.read().clone();
        let erase = *erase_data.read();

        spawn(async move {
            let client = { state.read().client.clone() };
            if let Some(client) = client {
                // Use the deactivate account API
                use matrix_sdk::ruma::api::client::account::deactivate::v3::Request;
                let request = Request::new();
                // The actual implementation would include auth with password
                match client.send(request).await {
                    Ok(_) => {
                        tracing::info!("Account deactivated (erase_data={erase})");
                        // Log out and clear session
                        let _ = client.matrix_auth().logout().await;
                    }
                    Err(e) => {
                        error.set(Some(format!("Failed to deactivate: {e}")));
                    }
                }
            }
            deactivating.set(false);
        });
    };

    rsx! {
        Modal {
            title: "Deactivate Account".to_string(),
            on_close: move |_| on_close.call(()),

            div {
                class: "account-deactivation",

                div {
                    class: "account-deactivation__warning",
                    h4 { "⚠ Warning" }
                    p {
                        "Deactivating your account is "
                        strong { "permanent" }
                        ". You will not be able to log in again, and no one will be able to re-register the same user ID."
                    }
                    p { "This will:" }
                    ul {
                        li { "Leave all rooms and spaces you are in" }
                        li { "Remove your account from the homeserver" }
                        li { "Invalidate all your access tokens" }
                        if *erase_data.read() {
                            li { "Erase all your messages and data" }
                        }
                    }
                }

                if !*confirmed.read() {
                    div {
                        class: "account-deactivation__step",
                        p { "Are you sure you want to proceed?" }
                        div {
                            class: "account-deactivation__actions",
                            button {
                                class: "btn btn--secondary",
                                onclick: move |_| on_close.call(()),
                                "Cancel"
                            }
                            button {
                                class: "btn btn--danger",
                                onclick: move |_| confirmed.set(true),
                                "I understand, continue"
                            }
                        }
                    }
                } else {
                    div {
                        class: "account-deactivation__step",

                        label {
                            class: "settings-toggle",
                            input {
                                r#type: "checkbox",
                                checked: *erase_data.read(),
                                oninput: move |evt| erase_data.set(evt.checked()),
                            }
                            div {
                                class: "settings-toggle__info",
                                span { class: "settings-toggle__label", "Erase all messages" }
                                span { class: "settings-toggle__description",
                                    "Request that the server remove your messages (may not be honored by all servers)"
                                }
                            }
                        }

                        div {
                            class: "account-deactivation__field",
                            label { "Password" }
                            input {
                                r#type: "password",
                                class: "settings-input",
                                placeholder: "Enter your password",
                                value: "{password}",
                                oninput: move |evt| password.set(evt.value()),
                            }
                        }

                        div {
                            class: "account-deactivation__field",
                            label { "Type DEACTIVATE to confirm" }
                            input {
                                r#type: "text",
                                class: "settings-input",
                                placeholder: "DEACTIVATE",
                                value: "{confirm_text}",
                                oninput: move |evt| confirm_text.set(evt.value()),
                            }
                        }

                        if let Some(ref err) = *error.read() {
                            div { class: "account-deactivation__error", "{err}" }
                        }

                        div {
                            class: "account-deactivation__actions",
                            button {
                                class: "btn btn--secondary",
                                onclick: move |_| on_close.call(()),
                                "Cancel"
                            }
                            button {
                                class: "btn btn--danger",
                                disabled: *deactivating.read(),
                                onclick: on_deactivate,
                                if *deactivating.read() { "Deactivating..." } else { "Deactivate Account" }
                            }
                        }
                    }
                }
            }
        }
    }
}