2024-12-18 11:17:29 +01:00
|
|
|
use log::info;
|
2024-12-19 12:24:14 +01:00
|
|
|
use web_sys::{
|
|
|
|
wasm_bindgen::{JsCast, UnwrapThrowExt},
|
|
|
|
HtmlInputElement,
|
|
|
|
};
|
|
|
|
use yew::prelude::*;
|
|
|
|
|
|
|
|
mod commands;
|
|
|
|
|
|
|
|
fn get_prompt() -> String {
|
|
|
|
"[user@vanten-s.com ~]$ ".to_string()
|
|
|
|
}
|
2024-12-18 11:17:29 +01:00
|
|
|
|
|
|
|
#[function_component]
|
|
|
|
fn App() -> Html {
|
|
|
|
let rader: UseStateHandle<Vec<String>> = use_state(Vec::new);
|
|
|
|
|
|
|
|
let rader_handle = rader.clone();
|
2024-12-19 12:24:14 +01:00
|
|
|
let push_rad = move |rad: String| {
|
2024-12-18 11:17:29 +01:00
|
|
|
info!("{}", rad);
|
|
|
|
let handle = rader_handle.clone();
|
|
|
|
let mut val = (*handle).clone();
|
2024-12-19 12:24:14 +01:00
|
|
|
val.push(get_prompt() + &rad);
|
|
|
|
val = commands::run(rad, val);
|
2024-12-18 11:17:29 +01:00
|
|
|
rader_handle.set(val);
|
|
|
|
};
|
|
|
|
|
|
|
|
html! {
|
|
|
|
<div>
|
|
|
|
<Terminal rader = { (*rader).clone() } />
|
|
|
|
<Input { push_rad } />
|
|
|
|
</div>
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Properties, PartialEq)]
|
|
|
|
struct InputProps {
|
2024-12-19 12:24:14 +01:00
|
|
|
pub push_rad: Callback<String>,
|
2024-12-18 11:17:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#[function_component]
|
|
|
|
fn Input(props: &InputProps) -> Html {
|
|
|
|
let push_rad = props.push_rad.clone();
|
|
|
|
|
2024-12-19 12:24:14 +01:00
|
|
|
let onkeydown = move |e: KeyboardEvent| {
|
|
|
|
if e.code() != "Enter" {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
let target: HtmlInputElement = e.target().unwrap_throw().dyn_into().unwrap_throw();
|
2024-12-18 11:17:29 +01:00
|
|
|
let value = target.value();
|
2024-12-19 12:24:14 +01:00
|
|
|
let value = value;
|
2024-12-18 11:17:29 +01:00
|
|
|
target.set_value("");
|
|
|
|
push_rad.emit(value);
|
|
|
|
};
|
|
|
|
|
|
|
|
html! {
|
2024-12-19 12:24:14 +01:00
|
|
|
<>
|
|
|
|
<code>{ get_prompt() }</code><input { onkeydown } type="text" class="input"/>
|
|
|
|
</>
|
2024-12-18 11:17:29 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Properties, PartialEq)]
|
|
|
|
struct TerminalProps {
|
|
|
|
pub rader: Vec<String>,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[function_component]
|
|
|
|
fn Terminal(props: &TerminalProps) -> Html {
|
2024-12-19 12:24:14 +01:00
|
|
|
let rader: Vec<_> = props
|
|
|
|
.rader
|
|
|
|
.iter()
|
|
|
|
.map(|rad| {
|
|
|
|
html! {
|
|
|
|
<>
|
|
|
|
<code><wbr /> { rad } </code>
|
|
|
|
<br />
|
|
|
|
</>
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.collect();
|
2024-12-18 11:17:29 +01:00
|
|
|
|
|
|
|
html! {
|
|
|
|
<div id="terminal" class="terminal">
|
|
|
|
{ rader }
|
|
|
|
</div>
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
wasm_logger::init(wasm_logger::Config::default());
|
|
|
|
yew::Renderer::<App>::new().render();
|
|
|
|
}
|