♻️ Replace flume with tokio and share Matrix client infos to chats

- Remove of the flume dependency.
- Add the capability to share data provided by the Matrix client to the ChatsWindow. Indeed, until the 0.6 Dioxus
  release, each window runs in a separate virtual DOM so the context and Fermi states are completely seperate
  (cf. https://discord.com/channels/899851952891002890/1188206938215948378).
This commit is contained in:
2023-12-25 23:14:43 +01:00
parent d7ba8130d3
commit ddeb94e887
8 changed files with 223 additions and 192 deletions

View File

@@ -1,25 +1,40 @@
use dioxus::prelude::*;
use fermi::*;
use tracing::debug;
use crate::base::{sync_rooms, ROOMS};
use crate::components::avatar_selector::AvatarSelector;
use crate::components::chats_window::edit_section::EditSection;
use crate::components::icons::DownArrowIcon;
use crate::matrix_interface::requester::Receivers;
use super::edit_section::EditSection;
turf::style_sheet!("src/components/chats_window/chats_window.scss");
pub fn ChatsWindow(cx: Scope) -> Element {
pub struct ChatsWindowProps {
pub receivers: Receivers,
}
pub fn ChatsWindow(cx: Scope<ChatsWindowProps>) -> Element {
debug!("ChatsWindow rendering");
let room_names = vec![
"MON POTE",
"Second room",
"Third room",
"AAAAAAAAAAAA",
"BBBBBBBBBBBBBBBBBBB",
"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC",
];
let receivers = &cx.props.receivers;
let rendered_room_tabs = room_names.into_iter().map(|room_name| {
use_init_atom_root(cx);
let rooms_ref = use_atom_ref(cx, &ROOMS);
let sync_rooms_coro = use_coroutine(cx, |rx| {
to_owned![receivers];
sync_rooms(rx, receivers, rooms_ref.clone())
});
sync_rooms_coro.send(true);
let rooms = rooms_ref.read();
let rendered_room_tabs = rooms.values().map(|room| {
let room = room.borrow();
let room_name = room.name().unwrap_or(room.id().to_string());
rsx!(
div {
class: ClassName::TAB,

View File

@@ -1,8 +1,8 @@
use dioxus::prelude::*;
use fermi::*;
// use fermi::*;
use tracing::debug;
use crate::base::APP_SETTINGS;
// use crate::base::APP_SETTINGS;
use crate::components::avatar_selector::AvatarSelector;
use crate::components::icons::DownArrowIcon;
@@ -13,28 +13,28 @@ static MESSAGE_PLACEHOLDER: &str = "<Enter a personal message>";
pub fn UserInfos(cx: Scope) -> Element {
debug!("UserInfos rendering");
let app_settings = use_atom_ref(cx, &APP_SETTINGS);
let store = &app_settings.read().store;
// let app_settings = use_atom_ref(cx, &APP_SETTINGS);
// let store = &app_settings.read().store;
println!("----------------------------------");
println!("UserInfos rendering");
// println!("store={:?}", &store);
dbg!(&store.user_id);
println!("----------------------------------");
// println!("----------------------------------");
// println!("UserInfos rendering");
// // println!("store={:?}", &store);
// dbg!(&store.user_id);
// println!("----------------------------------");
// let user_id = store.user_id..as_ref().unwrap();
// let mut user_info_option = None;
let mut user_display_name_option = None;
let user_display_name_option: Option<bool> = None;
let user_id_option = &store.user_id;
if user_id_option.is_some() {
let user_id = user_id_option.as_ref().unwrap();
let user_info_option = store.user_infos.get(user_id);
if user_info_option.is_some() {
user_display_name_option = user_info_option.unwrap().display_name.as_ref();
}
}
// let user_id_option = &store.user_id;
// if user_id_option.is_some() {
// let user_id = user_id_option.as_ref().unwrap();
// let user_info_option = store.user_infos.get(user_id);
// if user_info_option.is_some() {
// user_display_name_option = user_info_option.unwrap().display_name.as_ref();
// }
// }
cx.render(rsx! {
style { STYLE_SHEET },

View File

@@ -2,14 +2,11 @@ use std::str::FromStr;
use dioxus::prelude::*;
use fermi::*;
use matrix_sdk::ruma::user_id;
use tracing::{debug, error};
use tracing::debug;
use crate::base::{APP_SETTINGS, SESSION};
use crate::base::SESSION;
use crate::components::avatar_selector::AvatarSelector;
use crate::components::header::Header;
use crate::matrix_interface::client::Client;
use crate::matrix_interface::worker_tasks::LoginStyle;
turf::style_sheet!("src/components/login.scss");