diff options
| -rw-r--r-- | assets/style.scss | 3 | ||||
| -rw-r--r-- | src/lib.rs | 58 | 
2 files changed, 42 insertions, 19 deletions
diff --git a/assets/style.scss b/assets/style.scss index 96291ed..deccd7c 100644 --- a/assets/style.scss +++ b/assets/style.scss @@ -244,6 +244,7 @@ p {  }  .new-message-composer .text-box { +  white-space: pre-wrap;    color: black;    background-color: #dcdcdc;    max-height: 32em; @@ -936,4 +937,4 @@ p {    font-weight: normal;    font-style: italic;    font-display: block; -}
\ No newline at end of file +} @@ -18,7 +18,7 @@ use futures::stream::StreamExt;  use indexmap::IndexMap;  use jid::JID;  use leptos::{ -    html::{self, Div, Input, Textarea}, prelude::*, tachys::dom::document, task::{spawn, spawn_local} +    ev::{Event, KeyboardEvent, SubmitEvent}, html::{self, Div, Input, Pre, Textarea}, prelude::*, tachys::{dom::document, reactive_graph::bind::GetValue}, task::{spawn, spawn_local}  };  use leptos_meta::Stylesheet;  use leptos_use::{use_textarea_autosize, UseTextareaAutosizeReturn}; @@ -570,18 +570,18 @@ pub fn ChatViewMessageComposer(chat: JID) -> impl IntoView {      let new_message = RwSignal::new("".to_string());      let client: Client = use_context().expect("no client in context");      let client = RwSignal::new(client); +    let (shift_pressed, set_shift_pressed) = signal(false); -    let send_message = Action::new(move |_| { +    let send_message = move || {          let value = chat.clone(); -        async move { -            spawn_local(async move { match client.read_untracked().send_message(value, Body { body: new_message.get_untracked() }).await { -                Ok(_) => { -                    new_message.set("".to_string()); -                }, -                Err(e) => tracing::error!("message send error: {}", e), -            }}) -        } -    }); +        spawn_local(async move { match client.read_untracked().send_message(value, Body { body: new_message.get_untracked() }).await { +            Ok(_) => { +                new_message.set("".to_string()); +                message_input.write_untracked().as_ref().expect("message input div not mounted").set_text_content(Some("")); +            }, +            Err(e) => tracing::error!("message send error: {}", e), +        }}) +    };      let _focus = Effect::new(move |_| {          if let Some(input) = message_input.get() { @@ -592,23 +592,45 @@ pub fn ChatViewMessageComposer(chat: JID) -> impl IntoView {          }      }); +    // let on_input = move |ev: Event| { +    //     // let keyboard_event: KeyboardEvent = ev.try_into().unwrap(); +    //     debug!("got input event"); +    //     let key= event_target_value(&ev); +    //     new_message.set(key); +    //     debug!("set new message"); +    // }; +    // +      // TODO: placeholder      view! {          <form              class="new-message-composer panel" -            on:submit=move |ev| { -                ev.prevent_default(); -                send_message.dispatch(()); -            }          >              <div                  class="text-box" -                prop:value=new_message -                on:input=move |ev| new_message.set(event_target_value(&ev)) +                on:input:target=move |ev| new_message.set(ev.target().text_content().unwrap_or_default())                  node_ref=message_input                  contenteditable +                on:keydown=move |ev| { +                    match ev.key_code() { +                        16 => set_shift_pressed.set(true), +                        13 => if !shift_pressed.get_untracked() { +                            ev.prevent_default(); +                            send_message(); +                        } +                        _ => {} +                        // debug!("shift pressed down"); +                    } +                } +                on:keyup=move |ev| { +                    match ev.key_code()  { +                        16 => set_shift_pressed.set(false), +                        _ => {} +                        // debug!("shift released"); +                    } +                }              ></div> -            <input hidden type="submit" /> +            // <input hidden type="submit" />          </form>      }  }  | 
