summaryrefslogtreecommitdiffstats
path: root/src/components/roster_list.rs
diff options
context:
space:
mode:
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>
+ }
+}
+