use leptos::prelude::*; type LogicFn = Box (String, String)>; #[component] pub fn CipherForm(title: &'static str, logic: LogicFn) -> impl IntoView { let (mode, set_mode) = signal("Encrypt".to_string()); let (key_input, set_key_input) = signal(String::new()); let (text_input, set_text_input) = signal(String::new()); let (output, set_output) = signal(String::new()); let (error_msg, set_error_msg) = signal(String::new()); let handle_submit = move |_| { set_error_msg(String::new()); set_output(String::new()); let is_encrypt = mode.get() == "Encrypt"; let key = key_input.get(); let text = text_input.get(); if key.is_empty() || text.is_empty() { set_error_msg("Please enter both key and text/hex.".to_string()); return; } let (res_out, res_err) = logic(is_encrypt, key, text); if !res_err.is_empty() { set_error_msg(res_err); return; } set_output(res_out); }; view! {

{title} " Encryption"

{move || { if error_msg.get().is_empty() { view! { }.into_any() } else { view! {
{error_msg.get()}
}.into_any() } }} {move || { if output.get().is_empty() { view! { }.into_any() } else { view! {
"Output:" {output.get()}
} .into_any() } }}
} }