summaryrefslogtreecommitdiffstats
path: root/src/views/macaw/settings.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/views/macaw/settings.rs')
-rw-r--r--src/views/macaw/settings.rs207
1 files changed, 146 insertions, 61 deletions
diff --git a/src/views/macaw/settings.rs b/src/views/macaw/settings.rs
index c4cc99b..3e87e3e 100644
--- a/src/views/macaw/settings.rs
+++ b/src/views/macaw/settings.rs
@@ -1,15 +1,29 @@
use leptos::prelude::*;
use profile_settings::ProfileSettings;
-use crate::{components::{icon::IconComponent, modal::Modal}, icon::Icon};
+use crate::{
+ components::{icon::IconComponent, modal::Modal},
+ icon::Icon,
+};
mod profile_settings {
- use filamento::{error::{AvatarPublishError, CommandError, NickError}, user::User};
- use thiserror::Error;
+ use filamento::{
+ error::{AvatarPublishError, CommandError, NickError},
+ user::User,
+ };
use leptos::prelude::*;
- use web_sys::{js_sys::Uint8Array, wasm_bindgen::{prelude::Closure, JsCast, UnwrapThrowExt}, Event, FileReader, HtmlInputElement, ProgressEvent, Url};
+ use thiserror::Error;
+ use web_sys::{
+ Event, FileReader, HtmlInputElement, ProgressEvent, Url,
+ js_sys::Uint8Array,
+ wasm_bindgen::{JsCast, UnwrapThrowExt, prelude::Closure},
+ };
- use crate::{client::Client, files::Files, user::{fetch_avatar, NO_AVATAR}};
+ use crate::{
+ client::Client,
+ files::Files,
+ user::{NO_AVATAR, fetch_avatar},
+ };
#[derive(Debug, Clone, Error)]
pub enum ProfileSaveError {
@@ -36,9 +50,7 @@ mod profile_settings {
view! {
{move || {
if let Some(old_profile) = old_profile.get() {
- view! {
- <ProfileForm old_profile />
- }.into_any()
+ view! { <ProfileForm old_profile /> }.into_any()
} else {
view! {}.into_any()
}
@@ -48,7 +60,6 @@ mod profile_settings {
#[component]
pub fn ProfileForm(old_profile: User) -> impl IntoView {
-
let client: Client = use_context().expect("no client in context");
// TODO: compartmentalise into error component, form component...
@@ -75,14 +86,14 @@ mod profile_settings {
let (profile_save_pending, set_profile_save_pending) = signal(false);
let profile_upload_data = RwSignal::new(None::<Vec<u8>>);
- let new_nick= RwSignal::new(old_profile.nick.clone().unwrap_or_default().to_string());
+ let new_nick = RwSignal::new(old_profile.nick.clone().unwrap_or_default().to_string());
let has_avatar = RwSignal::new(old_profile.avatar.is_some());
let new_avatar_preview_url = RwSignal::new(None::<String>);
let remove_avatar = RwSignal::new(false);
let from_input = move |ev: Event| {
let elem = ev.target().unwrap().unchecked_into::<HtmlInputElement>();
-
+
// let UploadSignal(file_signal) = expect_context();
// file_signal.update(Vec::clear); // Clear list from previous change
let files = elem.files().unwrap_throw();
@@ -104,7 +115,7 @@ mod profile_settings {
// `.result` valid after the `read_*` completes on FileReader
// https://developer.mozilla.org/en-US/docs/Web/API/FileReader/result
let result = reader.result().unwrap_throw();
- let data= Uint8Array::new(&result).to_vec();
+ let data = Uint8Array::new(&result).to_vec();
// Do whatever you want with the Vec<u8>
profile_upload_data.set(Some(data));
})
@@ -152,32 +163,32 @@ mod profile_settings {
};
if new_nick != old_nick {
match client.change_nick(new_nick).await {
- Ok(_) => {},
+ Ok(_) => {}
Err(e) => {
set_error.set(Some(ProfileSaveError::Nick(e)));
set_profile_save_pending.set(false);
return;
- },
+ }
}
}
if let Some(profile_data) = profile_upload_data.get() {
match client.change_avatar(Some(profile_data)).await {
- Ok(_) => {},
+ Ok(_) => {}
Err(e) => {
set_error.set(Some(ProfileSaveError::Avatar(e)));
set_profile_save_pending.set(false);
return;
- },
+ }
}
} else if remove_avatar.get() {
match client.change_avatar(None).await {
- Ok(_) => {},
+ Ok(_) => {}
Err(e) => {
set_error.set(Some(ProfileSaveError::Avatar(e)));
set_profile_save_pending.set(false);
return;
- },
+ }
}
}
@@ -200,45 +211,65 @@ mod profile_settings {
<h2>Profile Preview</h2>
<div class="preview">
<img class="avatar" src=new_avatar_preview_url />
- <div class="nick">{move || {
- let nick = new_nick.get();
- if nick.is_empty() {
- old_profile.jid.to_string()
- } else {
- nick
- }
- }}</div>
+ <div class="nick">
+ {move || {
+ let nick = new_nick.get();
+ if nick.is_empty() { old_profile.jid.to_string() } else { nick }
+ }}
+ </div>
</div>
</div>
- <form class="profile-form" on:submit=move |ev| {
- ev.prevent_default();
- save_profile.dispatch(());
- }>
+ <form
+ class="profile-form"
+ on:submit=move |ev| {
+ ev.prevent_default();
+ save_profile.dispatch(());
+ }
+ >
{success_message}
{error_message}
<div>
- <h3>Nick</h3>
- <input disabled=profile_save_pending placeholder="Nick" type="text" id="client-user-nick" bind:value=new_nick name="client-user-nick" />
+ <h3>Nick</h3>
+ <input
+ disabled=profile_save_pending
+ placeholder="Nick"
+ type="text"
+ id="client-user-nick"
+ bind:value=new_nick
+ name="client-user-nick"
+ />
</div>
<div>
<h3>Avatar</h3>
<div class="change-avatar">
- <label for="client-user-avatar"><div class="button">Change Avatar</div></label>
- <input type="file" id="client-user-avatar" on:change=move |e| {
- has_avatar.set(true);
- remove_avatar.set(false);
- from_input(e);
- } />
+ <label for="client-user-avatar">
+ <div class="button">Change Avatar</div>
+ </label>
+ <input
+ type="file"
+ id="client-user-avatar"
+ on:change=move |e| {
+ has_avatar.set(true);
+ remove_avatar.set(false);
+ from_input(e);
+ }
+ />
{move || {
if has_avatar.get() {
view! {
- <a on:click=move |_| {
- profile_upload_data.set(None);
- remove_avatar.set(true);
- has_avatar.set(false);
- new_avatar_preview_url.set(Some(NO_AVATAR.to_string()));
- } style="cursor: pointer">Remove Avatar</a>
- }.into_any()
+ <a
+ on:click=move |_| {
+ profile_upload_data.set(None);
+ remove_avatar.set(true);
+ has_avatar.set(false);
+ new_avatar_preview_url.set(Some(NO_AVATAR.to_string()));
+ }
+ style="cursor: pointer"
+ >
+ Remove Avatar
+ </a>
+ }
+ .into_any()
} else {
view! {}.into_any()
}
@@ -246,7 +277,12 @@ mod profile_settings {
</div>
</div>
<hr />
- <input disabled=profile_save_pending class="button" type="submit" value="Save Changes" />
+ <input
+ disabled=profile_save_pending
+ class="button"
+ type="submit"
+ value="Save Changes"
+ />
</form>
</div>
}
@@ -266,31 +302,81 @@ pub fn Settings() -> impl IntoView {
let show_settings: RwSignal<Option<SettingsPage>> = use_context().unwrap();
view! {
- <Modal on_background_click=move |_| { show_settings.set(None); }>
+ <Modal on_background_click=move |_| {
+ show_settings.set(None);
+ }>
<div class="settings panel">
<div class="header">
<h2>Settings</h2>
<div class="header-icon close">
- <IconComponent icon=Icon::Close24 on:click=move |_| show_settings.set(None)/>
+ <IconComponent
+ icon=Icon::Close24
+ on:click=move |_| show_settings.set(None)
+ />
</div>
</div>
<div class="settings-main">
<div class="settings-sidebar">
- <div class:open=move || *show_settings.read() == Some(SettingsPage::Account) on:click=move |_| show_settings.set(Some(SettingsPage::Account))>Account</div>
- <div class:open=move || *show_settings.read() == Some(SettingsPage::Chat) on:click=move |_| show_settings.set(Some(SettingsPage::Chat))>Chat</div>
- <div class:open=move || *show_settings.read() == Some(SettingsPage::Privacy) on:click=move |_| show_settings.set(Some(SettingsPage::Privacy))>Privacy</div>
- <div class:open=move || *show_settings.read() == Some(SettingsPage::Profile) on:click=move |_| show_settings.set(Some(SettingsPage::Profile))>Profile</div>
+ <div
+ class:open=move || *show_settings.read() == Some(SettingsPage::Account)
+ on:click=move |_| show_settings.set(Some(SettingsPage::Account))
+ >
+ Account
+ </div>
+ <div
+ class:open=move || *show_settings.read() == Some(SettingsPage::Chat)
+ on:click=move |_| show_settings.set(Some(SettingsPage::Chat))
+ >
+ Chat
+ </div>
+ <div
+ class:open=move || *show_settings.read() == Some(SettingsPage::Privacy)
+ on:click=move |_| show_settings.set(Some(SettingsPage::Privacy))
+ >
+ Privacy
+ </div>
+ <div
+ class:open=move || *show_settings.read() == Some(SettingsPage::Profile)
+ on:click=move |_| show_settings.set(Some(SettingsPage::Profile))
+ >
+ Profile
+ </div>
</div>
<div class="settings-page">
- {move || if let Some(page) = show_settings.get() {
- match page {
- SettingsPage::Account => view! { <div style="padding: 16px">"Account settings coming soon!"</div> }.into_any(),
- SettingsPage::Chat => view! { <div style="padding: 16px">"Chat settings coming soon!"</div> }.into_any(),
- SettingsPage::Profile => view! { <ProfileSettings /> }.into_any(),
- SettingsPage::Privacy => view! { <div style="padding: 16px">"Privacy settings coming soon!"</div> }.into_any(),
+ {move || {
+ if let Some(page) = show_settings.get() {
+ match page {
+ SettingsPage::Account => {
+ view! {
+ <div style="padding: 16px">
+ "Account settings coming soon!"
+ </div>
+ }
+ .into_any()
+ }
+ SettingsPage::Chat => {
+ view! {
+ <div style="padding: 16px">
+ "Chat settings coming soon!"
+ </div>
+ }
+ .into_any()
+ }
+ SettingsPage::Profile => {
+ view! { <ProfileSettings /> }.into_any()
+ }
+ SettingsPage::Privacy => {
+ view! {
+ <div style="padding: 16px">
+ "Privacy settings coming soon!"
+ </div>
+ }
+ .into_any()
+ }
+ }
+ } else {
+ view! {}.into_any()
}
- } else {
- view! {}.into_any()
}}
</div>
</div>
@@ -298,4 +384,3 @@ pub fn Settings() -> impl IntoView {
</Modal>
}
}
-