speki-app 0.1.0

ontological flashcard app
use std::sync::Arc;

use dioxus::prelude::*;
use tracing::info;

#[derive(Props, Clone)]
pub struct Yesno {
    pub question: Arc<String>,
    pub done: Signal<bool>,
    pub on_yes: Arc<Box<dyn Fn()>>,
}

impl PartialEq for Yesno {
    fn eq(&self, _: &Self) -> bool {
        true
    }
}

impl Yesno {
    pub fn new(q: String, hook: Arc<Box<dyn Fn()>>) -> Self {
        Self {
            question: Arc::new(q),
            done: Signal::new_in_scope(false, ScopeId::APP),
            on_yes: hook,
        }
    }
}

#[component]
pub fn YesnoRender(props: Yesno) -> Element {
    let question = props.question.clone();
    let mut done = props.done.clone();
    let on_yes = props.on_yes.clone();

    rsx! {
        div {
            class: "flex flex-col items-center justify-center space-y-4 p-6 bg-gray-100 rounded-lg shadow-md",
            p {
                class: "text-lg font-semibold text-gray-800",
                "{question}"
            }

            button {
                class: "bg-green-500 text-white px-4 py-2 rounded hover:bg-green-600 focus:outline-none focus:ring-2 focus:ring-green-300",
                onclick: move |_| {
                    info!("yes!");
                    on_yes();
                    done.set(true);
                },
                "Yes"
            }

            button {
                class: "bg-red-500 text-white px-4 py-2 rounded hover:bg-red-600 focus:outline-none focus:ring-2 focus:ring-red-300",
                onclick: move |_| {
                    info!("no!");
                    done.set(true);
                },
                "No"
            }
        }
    }
}