summaryrefslogtreecommitdiffstats
path: root/src/components/roster_list.rs
diff options
context:
space:
mode:
authorLibravatar cel 🌸 <cel@bunny.garden>2025-06-01 16:10:26 +0100
committerLibravatar cel 🌸 <cel@bunny.garden>2025-06-01 17:27:40 +0100
commit6ee4190a26f32bfa953302ee363ad3bb6c384ebb (patch)
tree2c3182c29d5780a0ad9c9770b5e546312bea49b4 /src/components/roster_list.rs
parentf76c80c1d23177ab00c81240ee3a75d3bcda0e3b (diff)
downloadmacaw-web-6ee4190a26f32bfa953302ee363ad3bb6c384ebb.tar.gz
macaw-web-6ee4190a26f32bfa953302ee363ad3bb6c384ebb.tar.bz2
macaw-web-6ee4190a26f32bfa953302ee363ad3bb6c384ebb.zip
refactor: reorganise code
Diffstat (limited to 'src/components/roster_list.rs')
-rw-r--r--src/components/roster_list.rs58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/components/roster_list.rs b/src/components/roster_list.rs
new file mode 100644
index 0000000..a398ffe
--- /dev/null
+++ b/src/components/roster_list.rs
@@ -0,0 +1,58 @@
+use std::collections::HashSet;
+
+use contact_request_manager::AddContact;
+use jid::BareJID;
+use leptos::prelude::*;
+use reactive_stores::Store;
+use roster_list_item::RosterListItem;
+
+use crate::{components::icon::IconComponent, icon::Icon, roster::{Roster, RosterStoreFields}};
+
+mod contact_request_manager;
+mod roster_list_item;
+
+#[component]
+pub fn RosterList() -> impl IntoView {
+ let requests: ReadSignal<HashSet<BareJID>> = use_context().expect("no pending subscriptions in context");
+
+ let roster: Store<Roster> = use_context().expect("no roster in context");
+ let (open_add_contact, set_open_add_contact) = signal(false);
+
+ // TODO: filter new messages signal
+ view! {
+ <div class="roster-list panel">
+ <div class="header">
+ <h2>Roster</h2>
+ <div class="add-contact header-icon" class:open=open_add_contact>
+ <IconComponent icon=Icon::AddContact24 on:click=move |_| set_open_add_contact.update(|state| *state = !*state)/>
+ {move || {
+ if !requests.read().is_empty() {
+ view! {
+ <div class="badge"></div>
+ }.into_any()
+ } else {
+ view! {}.into_any()
+ }
+ }}
+ </div>
+ </div>
+ {move || {
+ if *open_add_contact.read() {
+ view! {
+ <div class="roster-add-contact">
+ <AddContact />
+ </div>
+ }.into_any()
+ } else {
+ 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>
+ </div>
+ }
+}
+