vanten-s.com/src/main.rs

94 lines
2 KiB
Rust
Raw Normal View History

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();
}