diff options
Diffstat (limited to '')
| -rw-r--r-- | src/components/chats_list.rs | 42 | ||||
| -rw-r--r-- | src/components/message_composer.rs | 79 | ||||
| -rw-r--r-- | src/components/roster_list.rs | 77 | 
3 files changed, 160 insertions, 38 deletions
diff --git a/src/components/chats_list.rs b/src/components/chats_list.rs index 43ee53e..027de64 100644 --- a/src/components/chats_list.rs +++ b/src/components/chats_list.rs @@ -1,7 +1,9 @@  use chats_list_item::ChatsListItem;  use indexmap::IndexMap;  use jid::BareJID; -use leptos::prelude::*; +use js_sys::{wasm_bindgen::UnwrapThrowExt, Object, Reflect, JSON}; +use leptos::{html::Div, prelude::*}; +use overlay_scrollbars::OverlayScrollbars;  use tracing::debug;  use crate::{ @@ -86,6 +88,30 @@ pub fn ChatsList() -> impl IntoView {          }      }); +    let chats_list: NodeRef<Div> = NodeRef::new(); +    let chats_list_viewport: NodeRef<Div> = NodeRef::new(); +     +    let _scrollbars = Effect::new(move |_| { +        if let Some(buffer) = chats_list.get() { +            if let Some(viewport) = chats_list_viewport.get() { +                let scrollbars_obj = Object::new(); +                // Reflect::set(&scrollbars_obj, &"theme".into(), &"os-macaw".into()).unwrap_throw(); +                // Reflect::set(&scrollbars_obj, &"autoHide".into(), &"leave".into()).unwrap_throw(); +                let options_obj = Object::new(); +                // Reflect::set(&options_obj, &"scrollbars".into(), &scrollbars_obj).unwrap_throw(); + +                let elements_obj = Object::new(); +                Reflect::set(&elements_obj, &"viewport".into(), &viewport.into()).unwrap_throw(); +                let element_obj = Object::new(); +                Reflect::set(&elements_obj, &"elements".into(), &elements_obj).unwrap_throw(); +                Reflect::set(&element_obj, &"target".into(), &buffer.into()).unwrap_throw(); +                // let element = Object::define_property(&Object::define_property(&Object::new(), &"target".into(), &buffer.into()), &"elements".into(), &Object::define_property(&Object::new(), &"viewport".into(), &viewport.into())); +                debug!("scrollable element: {}", JSON::stringify(&element_obj.clone().into()).unwrap_throw()); +                OverlayScrollbars(element_obj, options_obj);  +            } +        } +    }); +      view! {          <div class="chats-list panel">              // TODO: update icon, tooltip on hover. @@ -110,10 +136,16 @@ pub fn ChatsList() -> impl IntoView {                      }}                  </div>              </div> -            <div class="chats-list-chats"> -                <For each=move || chats.get() key=|chat| chat.1.1.message.get().read().id let(chat)> -                    <ChatsListItem chat=chat.1.0.into() message=chat.1.1.into() /> -                </For> +            <div class="overlay-scroll" node_ref=chats_list> +                <div class="chats-list-chats" node_ref=chats_list_viewport> +                    <For +                        each=move || chats.get() +                        key=|chat| chat.1.1.message.get().read().id +                        let(chat) +                    > +                        <ChatsListItem chat=chat.1.0.into() message=chat.1.1.into() /> +                    </For> +                </div>              </div>          </div>      } diff --git a/src/components/message_composer.rs b/src/components/message_composer.rs index 09e5f80..6b34298 100644 --- a/src/components/message_composer.rs +++ b/src/components/message_composer.rs @@ -1,6 +1,9 @@  use filamento::chat::Body;  use jid::BareJID; +use js_sys::{wasm_bindgen::UnwrapThrowExt, Object, Reflect, JSON};  use leptos::{html::Div, prelude::*, task::spawn_local}; +use overlay_scrollbars::OverlayScrollbars; +use tracing::debug;  use crate::client::Client; @@ -60,35 +63,67 @@ pub fn ChatViewMessageComposer(chat: BareJID) -> impl IntoView {      // };      // +    let composer: NodeRef<Div> = NodeRef::new(); + +    let _scrollbars = Effect::new(move |_| { +        if let Some(buffer) = composer.get() { +            if let Some(viewport) = message_input.get() { +                let scrollbars_obj = Object::new(); +                Reflect::set(&scrollbars_obj, &"theme".into(), &"os-macaw".into()).unwrap_throw(); +                Reflect::set(&scrollbars_obj, &"autoHide".into(), &"leave".into()).unwrap_throw(); +                let options_obj = Object::new(); +                Reflect::set(&options_obj, &"scrollbars".into(), &scrollbars_obj).unwrap_throw(); + +                let elements_obj = Object::new(); +                Reflect::set(&elements_obj, &"viewport".into(), &viewport.into()).unwrap_throw(); +                let element_obj = Object::new(); +                Reflect::set(&elements_obj, &"elements".into(), &elements_obj).unwrap_throw(); +                Reflect::set(&element_obj, &"target".into(), &buffer.into()).unwrap_throw(); +                // let element = Object::define_property(&Object::define_property(&Object::new(), &"target".into(), &buffer.into()), &"elements".into(), &Object::define_property(&Object::new(), &"viewport".into(), &viewport.into())); +                debug!( +                    "scrollable element: {}", +                    JSON::stringify(&element_obj.clone().into()).unwrap_throw() +                ); +                debug!( +                    "scrollable options: {}", +                    JSON::stringify(&options_obj.clone().into()).unwrap_throw() +                ); +                OverlayScrollbars(element_obj, options_obj); +            } +        } +    }); +      // TODO: placeholder      view! {          <form class="new-message-composer panel"> -            <div -                class="text-box" -                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() { -                                ev.prevent_default(); -                                send_message(); +            <div class="overlay-scroll" node_ref=composer> +                <div +                    class="text-box" +                    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() { +                                    ev.prevent_default(); +                                    send_message(); +                                }                              } +                            _ => {}                          } -                        _ => {}                      } -                } -                on:keyup=move |ev| { -                    match ev.key_code() { -                        16 => set_shift_pressed.set(false), -                        _ => {} +                    on:keyup=move |ev| { +                        match ev.key_code() { +                            16 => set_shift_pressed.set(false), +                            _ => {} +                        }                      } -                } -            ></div> +                ></div> +            </div>          // <input hidden type="submit" />          </form>      } diff --git a/src/components/roster_list.rs b/src/components/roster_list.rs index 50c7989..21a9666 100644 --- a/src/components/roster_list.rs +++ b/src/components/roster_list.rs @@ -2,9 +2,12 @@ use std::collections::HashSet;  use contact_request_manager::AddContact;  use jid::BareJID; -use leptos::prelude::*; +use js_sys::{wasm_bindgen::UnwrapThrowExt, Object, Reflect, JSON}; +use leptos::{html::Div, prelude::*}; +use overlay_scrollbars::OverlayScrollbars;  use reactive_stores::Store;  use roster_list_item::RosterListItem; +use tracing::debug;  use crate::{      components::icon::IconComponent, @@ -29,6 +32,54 @@ pub fn RosterList() -> impl IntoView {      let open_chat = Memo::new(move |_| open_chats.chat_view().get());      provide_context(open_chat); +    let roster_list: NodeRef<Div> = NodeRef::new(); +    let roster_list_viewport: NodeRef<Div> = NodeRef::new(); + +    let _scrollbars = Effect::new(move |_| { +        if let Some(buffer) = roster_list.get() { +            if let Some(viewport) = roster_list_viewport.get() { +                let elements_obj = Object::new(); +                Reflect::set(&elements_obj, &"viewport".into(), &viewport.into()).unwrap_throw(); +                let element_obj = Object::new(); +                Reflect::set(&elements_obj, &"elements".into(), &elements_obj).unwrap_throw(); +                Reflect::set(&element_obj, &"target".into(), &buffer.into()).unwrap_throw(); +                // let element = Object::define_property(&Object::define_property(&Object::new(), &"target".into(), &buffer.into()), &"elements".into(), &Object::define_property(&Object::new(), &"viewport".into(), &viewport.into())); +                debug!( +                    "scrollable element: {}", +                    JSON::stringify(&element_obj.clone().into()).unwrap_throw() +                ); +                OverlayScrollbars(element_obj, Object::new()); +            } +        } +    }); + +    let add_contact: NodeRef<Div> = NodeRef::new(); +    let add_contact_viewport: NodeRef<Div> = NodeRef::new(); + +    let _scrollbars = Effect::new(move |_| { +        if let Some(buffer) = add_contact.get() { +            if let Some(viewport) = add_contact_viewport.get() { +                let scrollbars_obj = Object::new(); +                Reflect::set(&scrollbars_obj, &"theme".into(), &"os-macaw".into()).unwrap_throw(); +                Reflect::set(&scrollbars_obj, &"move".into(), &"leave".into()).unwrap_throw(); +                let options_obj = Object::new(); +                Reflect::set(&options_obj, &"scrollbars".into(), &scrollbars_obj).unwrap_throw(); + +                let elements_obj = Object::new(); +                Reflect::set(&elements_obj, &"viewport".into(), &viewport.into()).unwrap_throw(); +                let element_obj = Object::new(); +                Reflect::set(&elements_obj, &"elements".into(), &elements_obj).unwrap_throw(); +                Reflect::set(&element_obj, &"target".into(), &buffer.into()).unwrap_throw(); +                // let element = Object::define_property(&Object::define_property(&Object::new(), &"target".into(), &buffer.into()), &"elements".into(), &Object::define_property(&Object::new(), &"viewport".into(), &viewport.into())); +                debug!( +                    "scrollable element: {}", +                    JSON::stringify(&element_obj.clone().into()).unwrap_throw() +                ); +                OverlayScrollbars(element_obj, options_obj); +            } +        } +    }); +      // TODO: filter new messages signal      view! {          <div class="roster-list panel"> @@ -51,8 +102,10 @@ pub fn RosterList() -> impl IntoView {              {move || {                  if *open_add_contact.read() {                      view! { -                        <div class="roster-add-contact"> -                            <AddContact /> +                        <div class="overlay-scroll add-contact-panel" node_ref=add_contact> +                            <div class="roster-add-contact" node_ref=add_contact_viewport> +                                <AddContact /> +                            </div>                          </div>                      }                          .into_any() @@ -60,14 +113,16 @@ pub fn RosterList() -> impl IntoView {                      view! {}.into_any()                  }              }} -            <div class="roster-list-roster"> -                <For -                    each=move || roster.contacts().get() -                    key=|contact| contact.0.clone() -                    let(contact) -                > -                    <RosterListItem contact=contact.1 /> -                </For> +            <div class="overlay-scroll" node_ref=roster_list> +                <div class="roster-list-roster" node_ref=roster_list_viewport> +                    <For +                        each=move || roster.contacts().get() +                        key=|contact| contact.0.clone() +                        let(contact) +                    > +                        <RosterListItem contact=contact.1 /> +                    </For> +                </div>              </div>          </div>      }  | 
