Use of Conversations layout

This commit is contained in:
2024-05-26 11:39:18 +02:00
parent c8e8e2da67
commit 62015f8d13
5 changed files with 88 additions and 153 deletions

View File

@@ -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<bool>, session: &GlobalSignal<Session>) {
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#"
// <style type="text/css">
// html, body {
// height: 100%;
// width: 100%;
// margin: 0;
// }
// #main, #bodywrap {
// height: 100%;
// width: 100%;
// }
// </style>
// "#
// .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! {