1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
use crate::web_sys::HtmlTextAreaElement;
use crate::*;
#[derive(Properties, PartialEq)]
pub struct InputMessageProps {
#[prop_or_default]
pub name: String,
#[prop_or_default]
pub key: String,
pub value: UseStateHandle<String>,
#[prop_or_default]
pub class: String,
#[prop_or_default]
pub placeholder: String,
#[prop_or_default]
pub style: String,
#[prop_or_default]
pub cache_id: Option<String>,
#[prop_or_default]
pub onchange: Option<Callback<Event>>,
}
#[function_component(InputMessage)]
pub fn input_message(props: &InputMessageProps) -> Html {
let my_id = match &props.cache_id {
Some(id) => id.to_string(),
None => interop::get_uuid().to_owned(),
};
let classes = &mut Classes::new();
classes.push("input-message");
if !props.class.is_empty() {
classes.push(&props.class);
}
let inputref = props.value.clone();
let oninput = {
Callback::from(move |ev: InputEvent| match ev.target() {
Some(target) => {
let value = target.unchecked_into::<HtmlTextAreaElement>().value();
inputref.set(value);
}
None => (),
})
};
let changeref = props.value.clone();
let onchange_handler = props.onchange.clone().unwrap_or(Callback::from(|_| ()));
let onchange = {
Callback::from(move |ev: Event| match ev.target() {
Some(target) => {
let value = target.unchecked_into::<HtmlTextAreaElement>().value();
changeref.set(value.to_string());
onchange_handler.emit(ev.clone());
}
None => (),
})
};
let placeholder = if props.placeholder.is_empty() {
"Type text here".to_string()
} else {
props.placeholder.to_string()
};
html! {
<InputField id={my_id.to_owned()}
name={props.name.to_owned()}
class={classes.to_string()}
>
<div class="auto_message_box">
<pre><code>{props.value.to_string()}</code></pre>
<textarea name={props.key.to_owned()}
id={my_id.to_owned()}
{oninput}
{onchange}
{placeholder}
>{props.value}</textarea>
</div>
</InputField>
}
}