From 62015f8d131cf60f48ea25b7eac169430e34cdaa Mon Sep 17 00:00:00 2001 From: Adrien Date: Sun, 26 May 2024 11:39:18 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Use=20of=20Conversations=20layout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base.rs | 71 ---------------- src/main.rs | 131 ++++++++++++++--------------- src/ui/components/conversations.rs | 6 +- src/ui/components/login.rs | 23 +++-- src/ui/mod.rs | 10 +++ 5 files changed, 88 insertions(+), 153 deletions(-) delete mode 100644 src/base.rs diff --git a/src/base.rs b/src/base.rs deleted file mode 100644 index 4d62c58..0000000 --- a/src/base.rs +++ /dev/null @@ -1,71 +0,0 @@ -use std::rc::Rc; - -use dioxus::prelude::*; -use futures_util::stream::StreamExt; -use tracing::{debug, error, warn}; - -use crate::domain::model::account::Account; -use crate::domain::model::messaging_interface::AccountMessagingProviderInterface; -use crate::domain::model::session::Session; -use crate::infrastructure::messaging::matrix::client::Client; -use crate::infrastructure::messaging::matrix::worker_tasks::LoginStyle; -use crate::ui::store::Store; - -pub async fn login(mut rx: UnboundedReceiver, session: &GlobalSignal) { - while let Some(is_logged) = rx.next().await { - error!("is_logged={is_logged}"); - if !is_logged { - let homeserver_url = session.read().homeserver_url.clone(); - let username = session.read().username.clone(); - let password = session.read().password.clone(); - - if homeserver_url.is_some() && username.is_some() && password.is_some() { - let (requester, account_events_receiver) = - Client::spawn(homeserver_url.unwrap()).await; - - if let Err(err) = requester.init().await { - error!("Following error occureds during client init: {}", err); - } - - error!("Before login"); - - match requester - .login(LoginStyle::Password(username.unwrap(), password.unwrap())) - .await - { - Ok(_) => { - debug!("successfully logged"); - session.write().is_logged = true; - - let requester = Rc::new(requester); - - dioxus::prelude::spawn(async move { - ACCOUNT.write().set_messaging_provider(requester.clone()); - - let _ = requester - .run_forever(&*ACCOUNT.read(), account_events_receiver) - .await; - }); - } - Err(err) => { - error!("Error during login: {err}"); - // TODO: Handle invalid login - // invalid_login.modify(|_| true); - return; - } - } - } else { - warn!("At least one of the following values is/are invalid: homeserver, username or password"); - } - } else { - warn!("already logged... skip login"); - } - } - error!("=== LOGIN END ==="); -} - -pub static STORE: GlobalSignal = Signal::global(Store::new); - -// TODO: Merge ACCOUNT and SESSION -pub static ACCOUNT: GlobalSignal = Signal::global(|| Account::new(&STORE)); -pub static SESSION: GlobalSignal = Signal::global(Session::new); diff --git a/src/main.rs b/src/main.rs index 3009a40..c29d3f3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,12 +8,22 @@ mod infrastructure; mod ui; mod utils; -use dioxus::prelude::*; -use tracing::{debug, error}; +use std::rc::Rc; +use dioxus::prelude::*; +use futures_util::stream::StreamExt; +use tracing::{debug, error, warn}; use tracing_forest::ForestLayer; -use tracing_subscriber::prelude::*; -use tracing_subscriber::EnvFilter; +use tracing_subscriber::{prelude::*, EnvFilter}; + +use crate::{ + domain::model::{messaging_interface::AccountMessagingProviderInterface, session::Session}, + infrastructure::messaging::matrix::{client::Client, worker_tasks::LoginStyle}, + ui::{ + layouts::{conversations::Conversations, login::Login}, + ACCOUNT, SESSION, + }, +}; cfg_if! { if #[cfg(target_family = "wasm")] { @@ -26,80 +36,65 @@ cfg_if! { } } -use crate::base::{login, sync_rooms}; -use crate::base::{APP_SETTINGS, ROOMS, SESSION}; -use crate::ui::components::login::Login; -use crate::ui::components::main_window::MainWindow; -use crate::ui::layouts::login::Login; +async fn login(mut rx: UnboundedReceiver, session: &GlobalSignal) { + while let Some(is_logged) = rx.next().await { + if !is_logged { + let homeserver_url = session.read().homeserver_url.clone(); + let username = session.read().username.clone(); + let password = session.read().password.clone(); -mod base; + if homeserver_url.is_some() && username.is_some() && password.is_some() { + let (requester, account_events_receiver) = + Client::spawn(homeserver_url.unwrap()).await; + + if let Err(err) = requester.init().await { + warn!("Unable to login: {}", err); + } + + match requester + .login(LoginStyle::Password(username.unwrap(), password.unwrap())) + .await + { + Ok(_) => { + debug!("successfully logged"); + session.write().is_logged = true; + + let requester = Rc::new(requester); + + dioxus::prelude::spawn(async move { + ACCOUNT.write().set_messaging_provider(requester.clone()); + + let _ = requester + .run_forever(&*ACCOUNT.read(), account_events_receiver) + .await; + }); + } + Err(err) => { + error!("Error during login: {err}"); + // TODO: Handle invalid login + // invalid_login.modify(|_| true); + return; + } + } + } else { + warn!("At least one of the following values is/are invalid: homeserver, username or password"); + } + } else { + warn!("already logged... skip login"); + } + } +} fn app() -> Element { - debug!("*** App rendering ***"); - - let login_coro = use_coroutine(|rx| login(rx, &APP_SETTINGS, &SESSION)); - - let mut sync_rooms_coro = None; - - if let Some(requester) = &APP_SETTINGS.read().requester { - sync_rooms_coro = Some(use_coroutine(|rx| { - sync_rooms(rx, requester.borrow().receivers.clone(), &ROOMS) - })); - } + let login_coro = use_coroutine(|rx| login(rx, &SESSION)); if !SESSION.read().is_logged { login_coro.send(false); - } else { - if let Some(coro) = sync_rooms_coro { - coro.send(true); - } - - // if chats_win_state.read().is_none() { - // let chats_window = dioxus_desktop::use_window(cx); - - // let receivers = app_settings - // .read() - // .requester - // .as_ref() - // .unwrap() - // .borrow() - // .receivers - // .clone(); - - // let chats_props = ChatsWindowProps { - // receivers, - // interface: chats_win_interface_ref.clone(), - // }; - - // let chats_dom = VirtualDom::new_with_props(ChatsWindow, chats_props); - - // let window_cfg = Config::default().with_custom_head( - // r#" - // - // "# - // .to_owned(), - // ); - - // let chats_window_desktop_service = chats_window.new_window(chats_dom, window_cfg); - // chats_win_state.set(Some(chats_window_desktop_service)); - // } } if SESSION.read().is_logged { - debug!("Should render the MainWindow component"); rsx! { - MainWindow {}, + Conversations {} } } else { rsx! { diff --git a/src/ui/components/conversations.rs b/src/ui/components/conversations.rs index 1b7d65f..597c2fe 100644 --- a/src/ui/components/conversations.rs +++ b/src/ui/components/conversations.rs @@ -4,9 +4,11 @@ use tracing::{debug, trace, warn}; use super::{button::Button, icons::SearchIcon, text_input::TextInput}; use crate::{ - base::{ACCOUNT, STORE}, domain::model::{common::PresenceState as DomainPresenceState, room::RoomId, space::SpaceId}, - ui::components::icons::{ChatsIcon, LogoIcon, RoomsIcon, SpacesIcon}, + ui::{ + components::icons::{ChatsIcon, LogoIcon, RoomsIcon, SpacesIcon}, + ACCOUNT, STORE, + }, }; turf::style_sheet!("src/ui/components/conversations.scss"); diff --git a/src/ui/components/login.rs b/src/ui/components/login.rs index 012654c..fce17f0 100644 --- a/src/ui/components/login.rs +++ b/src/ui/components/login.rs @@ -1,7 +1,4 @@ -use std::borrow::Cow; -use std::cell::RefCell; -use std::collections::HashMap; -use std::rc::Rc; +use std::{borrow::Cow, cell::RefCell, collections::HashMap, rc::Rc}; use const_format::formatcp; use dioxus::prelude::*; @@ -9,16 +6,18 @@ use tracing::{debug, error, warn}; use validator::{Validate, ValidateArgs, ValidateEmail, ValidationError, ValidationErrors}; use zxcvbn::zxcvbn; -use crate::base::SESSION; -use crate::domain::model::session::Session; -use crate::infrastructure::services::random_svg_generators::{ - generate_random_svg_shape, ShapeConfig, +use crate::{ + domain::model::session::Session, + infrastructure::services::random_svg_generators::{generate_random_svg_shape, ShapeConfig}, + ui::SESSION, }; -use super::button::{LoginButton, RegisterButton}; -use super::modal::{Modal, Severity}; -use super::spinner::Spinner; -use super::text_input::{PasswordInputState, PasswordTextInput, TextInput, TextInputState}; +use super::{ + button::{LoginButton, RegisterButton}, + modal::{Modal, Severity}, + spinner::Spinner, + text_input::{PasswordInputState, PasswordTextInput, TextInput, TextInputState}, +}; include!(concat!(env!("OUT_DIR"), "/style_vars.rs")); diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 7c27e1d..d3dc2dd 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -1,3 +1,13 @@ pub(crate) mod components; pub(crate) mod layouts; pub(crate) mod store; + +use dioxus::prelude::{GlobalSignal, Signal}; + +use super::domain::model::{account::Account, session::Session}; +use store::Store; + +pub static STORE: GlobalSignal = Signal::global(Store::new); +// TODO: Merge ACCOUNT and SESSION +pub static ACCOUNT: GlobalSignal = Signal::global(|| Account::new(&STORE)); +pub static SESSION: GlobalSignal = Signal::global(Session::new);