[fractal] API: Remove join_to_room from BackendData



commit aa56bd4cc52c100cda6efba27fbfc6af68dab629
Author: Alejandro Domínguez <adomu net-c com>
Date:   Tue Jun 2 02:01:50 2020 +0200

    API: Remove join_to_room from BackendData

 fractal-gtk/src/app/backend_loop.rs     |  7 +++---
 fractal-gtk/src/appop/invite.rs         | 24 ++++++++++++++-------
 fractal-gtk/src/appop/mod.rs            |  2 ++
 fractal-gtk/src/appop/room.rs           | 38 ++++++++++++++++++---------------
 fractal-gtk/src/appop/sync.rs           |  1 +
 fractal-gtk/src/widgets/room.rs         | 34 +++++++++++++++++++++--------
 fractal-matrix-api/src/backend/mod.rs   | 10 ++-------
 fractal-matrix-api/src/backend/room.rs  | 23 ++++----------------
 fractal-matrix-api/src/backend/sync.rs  | 20 ++++++++---------
 fractal-matrix-api/src/backend/types.rs | 15 ++++++++-----
 10 files changed, 93 insertions(+), 81 deletions(-)
---
diff --git a/fractal-gtk/src/app/backend_loop.rs b/fractal-gtk/src/app/backend_loop.rs
index 47b39c20..07a4b95e 100644
--- a/fractal-gtk/src/app/backend_loop.rs
+++ b/fractal-gtk/src/app/backend_loop.rs
@@ -32,6 +32,8 @@ pub fn backend_loop(rx: Receiver<BKResponse>) {
                     let clear_room_list = true;
                     APPOP!(set_rooms, (rooms, clear_room_list));
                     // Open the newly joined room
+                    let jtr = default.as_ref().map(|r| r.id.clone());
+                    APPOP!(set_join_to_room, (jtr));
                     if let Some(room) = default {
                         let room_id = room.id;
                         APPOP!(set_active_room_by_id, (room_id));
@@ -61,9 +63,6 @@ pub fn backend_loop(rx: Receiver<BKResponse>) {
                     APPOP!(append_directory_rooms, (rooms));
                 }
 
-                BKResponse::JoinRoom(Ok(_)) => {
-                    APPOP!(reload_rooms);
-                }
                 BKResponse::RemoveMessage(Ok((room, msg))) => {
                     APPOP!(remove_message, (room, msg));
                 }
@@ -168,7 +167,7 @@ pub fn backend_loop(rx: Receiver<BKResponse>) {
                     APPOP!(show_error, (error));
                     APPOP!(set_state, (state));
                 }
-                BKResponse::JoinRoom(Err(err)) => {
+                BKResponse::JoinRoomError(err) => {
                     let err_str = format!("{:?}", err);
                     error!(
                         "{}",
diff --git a/fractal-gtk/src/appop/invite.rs b/fractal-gtk/src/appop/invite.rs
index 550184db..5ead6d6b 100644
--- a/fractal-gtk/src/appop/invite.rs
+++ b/fractal-gtk/src/appop/invite.rs
@@ -7,6 +7,7 @@ use gtk;
 use gtk::prelude::*;
 use std::thread;
 
+use crate::app::App;
 use crate::appop::member::SearchType;
 use crate::appop::AppOp;
 
@@ -225,16 +226,23 @@ impl AppOp {
     pub fn accept_inv(&mut self, accept: bool) {
         let login_data = unwrap_or_unit_return!(self.login_data.clone());
         if let Some(rid) = self.invitation_roomid.take() {
+            let room_id = rid.clone();
             if accept {
-                self.backend
-                    .send(BKCommand::AcceptInv(
-                        login_data.server_url,
-                        login_data.access_token,
-                        rid.clone(),
-                    ))
-                    .unwrap();
+                let tx = self.backend.clone();
+                thread::spawn(move || {
+                    match room::join_room(login_data.server_url, login_data.access_token, room_id) {
+                        Ok(jtr) => {
+                            let jtr = Some(jtr);
+                            APPOP!(set_join_to_room, (jtr));
+                            APPOP!(reload_rooms);
+                        }
+                        Err(err) => {
+                            tx.send(BKCommand::SendBKResponse(BKResponse::JoinRoomError(err)))
+                                .expect_log("Connection closed");
+                        }
+                    }
+                });
             } else {
-                let room_id = rid.clone();
                 let tx = self.backend.clone();
                 thread::spawn(move || {
                     let query =
diff --git a/fractal-gtk/src/appop/mod.rs b/fractal-gtk/src/appop/mod.rs
index 740520f1..3d48cecf 100644
--- a/fractal-gtk/src/appop/mod.rs
+++ b/fractal-gtk/src/appop/mod.rs
@@ -71,6 +71,7 @@ pub struct AppOp {
     pub device_id: Option<String>,
 
     pub active_room: Option<RoomId>,
+    pub join_to_room: Option<RoomId>,
     pub rooms: RoomList,
     pub room_settings: Option<widgets::RoomSettings>,
     pub history: Option<widgets::RoomHistory>,
@@ -107,6 +108,7 @@ impl AppOp {
             ui: ui,
             backend: tx,
             active_room: None,
+            join_to_room: None,
             rooms: HashMap::new(),
             room_settings: None,
             history: None,
diff --git a/fractal-gtk/src/appop/room.rs b/fractal-gtk/src/appop/room.rs
index e58add62..057eb210 100644
--- a/fractal-gtk/src/appop/room.rs
+++ b/fractal-gtk/src/appop/room.rs
@@ -180,6 +180,10 @@ impl AppOp {
         self.set_state(AppState::NoRoom);
     }
 
+    pub fn set_join_to_room(&mut self, jtr: Option<RoomId>) {
+        self.join_to_room = jtr;
+    }
+
     pub fn set_active_room_by_id(&mut self, id: RoomId) {
         let login_data = unwrap_or_unit_return!(self.login_data.clone());
         if let Some(room) = self.rooms.get(&id) {
@@ -541,24 +545,24 @@ impl AppOp {
             .get_text()
             .map_or(String::new(), |gstr| gstr.to_string());
 
-        match RoomId::try_from(name.trim()) {
-            Ok(room_id) => {
-                self.backend
-                    .send(BKCommand::JoinRoom(
-                        login_data.server_url,
-                        login_data.access_token,
-                        room_id,
-                    ))
-                    .unwrap();
-            }
-            Err(err) => {
-                self.backend
-                    .send(BKCommand::SendBKResponse(BKResponse::JoinRoom(Err(
-                        err.into()
-                    ))))
-                    .unwrap();
+        let tx = self.backend.clone();
+        thread::spawn(move || {
+            match RoomId::try_from(name.trim())
+                .map_err(Into::into)
+                .and_then(|room_id| {
+                    room::join_room(login_data.server_url, login_data.access_token, room_id)
+                }) {
+                Ok(jtr) => {
+                    let jtr = Some(jtr);
+                    APPOP!(set_join_to_room, (jtr));
+                    APPOP!(reload_rooms);
+                }
+                Err(err) => {
+                    tx.send(BKCommand::SendBKResponse(BKResponse::JoinRoomError(err)))
+                        .expect_log("Connection closed");
+                }
             }
-        }
+        });
     }
 
     pub fn new_room(&mut self, r: Room, internal_id: Option<RoomId>) {
diff --git a/fractal-gtk/src/appop/sync.rs b/fractal-gtk/src/appop/sync.rs
index ed6b0d56..80730dc0 100644
--- a/fractal-gtk/src/appop/sync.rs
+++ b/fractal-gtk/src/appop/sync.rs
@@ -26,6 +26,7 @@ impl AppOp {
                     login_data.server_url,
                     login_data.access_token,
                     login_data.uid,
+                    self.join_to_room.clone(),
                     since,
                     initial,
                     number_tries,
diff --git a/fractal-gtk/src/widgets/room.rs b/fractal-gtk/src/widgets/room.rs
index daac0982..1dfb8f8f 100644
--- a/fractal-gtk/src/widgets/room.rs
+++ b/fractal-gtk/src/widgets/room.rs
@@ -1,15 +1,19 @@
 use crate::i18n::i18n;
 
+use fractal_api::backend::room;
+use fractal_api::util::ResultExpectLog;
 use gtk;
 use gtk::prelude::*;
 use pango;
+use std::thread;
 
 use crate::types::Room;
 
-use crate::backend::BKCommand;
+use crate::backend::{BKCommand, BKResponse};
 
 use crate::util::markup_text;
 
+use crate::app::App;
 use crate::appop::AppOp;
 
 use crate::widgets;
@@ -125,15 +129,27 @@ impl<'a> RoomBox<'a> {
 
             let join_button = gtk::Button::new_with_label(i18n("Join").as_str());
             let room_id = room.id.clone();
-            let backend = self.op.backend.clone();
+            let tx = self.op.backend.clone();
             join_button.connect_clicked(move |_| {
-                backend
-                    .send(BKCommand::JoinRoom(
-                        login_data.server_url.clone(),
-                        login_data.access_token.clone(),
-                        room_id.clone(),
-                    ))
-                    .unwrap();
+                let server_url = login_data.server_url.clone();
+                let access_token = login_data.access_token.clone();
+                let room_id = room_id.clone();
+                let tx = tx.clone();
+                thread::spawn(move || {
+                    match room::join_room(server_url, access_token, room_id.clone()) {
+                        Ok(jtr) => {
+                            let jtr = Some(jtr);
+                            APPOP!(set_join_to_room, (jtr));
+                            APPOP!(reload_rooms);
+                        }
+                        Err(err) => {
+                            tx.send(BKCommand::SendBKResponse(BKResponse::JoinRoomError(
+                                err.into(),
+                            )))
+                            .expect_log("Connection closed");
+                        }
+                    }
+                });
             });
             join_button.set_property_width_request(JOIN_BUTTON_WIDTH);
 
diff --git a/fractal-matrix-api/src/backend/mod.rs b/fractal-matrix-api/src/backend/mod.rs
index 4ca9df3f..a3c84aa7 100644
--- a/fractal-matrix-api/src/backend/mod.rs
+++ b/fractal-matrix-api/src/backend/mod.rs
@@ -29,7 +29,6 @@ impl Backend {
     pub fn new(tx: Sender<BKResponse>) -> Backend {
         let data = BackendData {
             rooms_since: String::new(),
-            join_to_room: None,
             m_direct: HashMap::new(),
         };
         Backend {
@@ -75,12 +74,13 @@ impl Backend {
             }
 
             // Sync module
-            Ok(BKCommand::Sync(server, access_token, uid, since, initial, number_tries)) => {
+            Ok(BKCommand::Sync(server, access_token, uid, jtr, since, initial, number_tries)) => {
                 sync::sync(
                     self,
                     server,
                     access_token,
                     uid,
+                    jtr,
                     since,
                     initial,
                     number_tries,
@@ -91,9 +91,6 @@ impl Backend {
             Ok(BKCommand::SetRoom(server, access_token, room_id)) => {
                 room::set_room(self, server, access_token, room_id)
             }
-            Ok(BKCommand::JoinRoom(server, access_token, room_id)) => {
-                room::join_room(self, server, access_token, room_id)
-            }
             Ok(BKCommand::AttachFile(server, access_token, msg)) => {
                 let r = room::attach_file(self, server, access_token, msg);
                 bkerror!(r, tx, BKResponse::AttachedFile);
@@ -107,9 +104,6 @@ impl Backend {
                         .expect_log("Connection closed");
                 });
             }
-            Ok(BKCommand::AcceptInv(server, access_token, room_id)) => {
-                room::join_room(self, server, access_token, room_id)
-            }
 
             // Media module
             Ok(BKCommand::GetThumbAsync(server, media, ctx)) => {
diff --git a/fractal-matrix-api/src/backend/room.rs b/fractal-matrix-api/src/backend/room.rs
index f6193d86..2d2a98bf 100644
--- a/fractal-matrix-api/src/backend/room.rs
+++ b/fractal-matrix-api/src/backend/room.rs
@@ -311,10 +311,7 @@ pub fn redact_msg(
         .or(Err(Error::SendMsgRedactionError(event_id)))
 }
 
-pub fn join_room(bk: &Backend, base: Url, access_token: AccessToken, room_id: RoomId) {
-    let tx = bk.tx.clone();
-    let data = bk.data.clone();
-
+pub fn join_room(base: Url, access_token: AccessToken, room_id: RoomId) -> Result<RoomId, Error> {
     let room_id_or_alias_id = room_id.clone().into();
 
     let params = JoinRoomParameters {
@@ -322,22 +319,10 @@ pub fn join_room(bk: &Backend, base: Url, access_token: AccessToken, room_id: Ro
         server_name: Default::default(),
     };
 
-    thread::spawn(move || {
-        let query = join_room_req(base, &room_id_or_alias_id, &params)
-            .map_err(Into::into)
-            .and_then(|request| {
-                let _ = HTTP_CLIENT.get_client()?.execute(request)?;
-
-                Ok(())
-            });
-
-        if let Ok(_) = query {
-            data.lock().unwrap().join_to_room = Some(room_id);
-        }
+    let request = join_room_req(base, &room_id_or_alias_id, &params)?;
+    HTTP_CLIENT.get_client()?.execute(request)?;
 
-        tx.send(BKResponse::JoinRoom(query))
-            .expect_log("Connection closed");
-    });
+    Ok(room_id)
 }
 
 pub fn leave_room(base: Url, access_token: AccessToken, room_id: RoomId) -> Result<(), Error> {
diff --git a/fractal-matrix-api/src/backend/sync.rs b/fractal-matrix-api/src/backend/sync.rs
index 3077c226..5dccccec 100644
--- a/fractal-matrix-api/src/backend/sync.rs
+++ b/fractal-matrix-api/src/backend/sync.rs
@@ -25,7 +25,7 @@ use crate::util::ResultExpectLog;
 
 use log::error;
 use reqwest::blocking::Client;
-use ruma_identifiers::UserId;
+use ruma_identifiers::{RoomId, UserId};
 use serde_json::value::from_value;
 use std::{
     convert::{TryFrom, TryInto},
@@ -39,6 +39,7 @@ pub fn sync(
     base: Url,
     access_token: AccessToken,
     user_id: UserId,
+    join_to_room: Option<RoomId>,
     since: Option<String>,
     initial: bool,
     number_tries: u64,
@@ -247,16 +248,13 @@ pub fn sync(
                 } else {
                     data.lock().unwrap().m_direct = parse_m_direct(&response.account_data.events);
 
-                    let rooms_def =
-                        Room::from_sync_response(&response, user_id, base)
-                            .map(|rooms| {
-                                let def =
-                                    data.lock().unwrap().join_to_room.as_ref().and_then(|jtr| {
-                                        rooms.iter().find(|x| x.id == *jtr).cloned()
-                                    });
-                                (rooms, def)
-                            })
-                            .map_err(Into::into);
+                    let rooms_def = Room::from_sync_response(&response, user_id, base)
+                        .map(|rooms| {
+                            let def = join_to_room
+                                .and_then(|jtr| rooms.iter().find(|x| x.id == jtr).cloned());
+                            (rooms, def)
+                        })
+                        .map_err(Into::into);
                     tx.send(BKResponse::Rooms(rooms_def))
                         .expect_log("Connection closed");
                 }
diff --git a/fractal-matrix-api/src/backend/types.rs b/fractal-matrix-api/src/backend/types.rs
index f47ce1b4..3f3993f6 100644
--- a/fractal-matrix-api/src/backend/types.rs
+++ b/fractal-matrix-api/src/backend/types.rs
@@ -20,7 +20,15 @@ pub enum BKCommand {
     Login(String, String, Url, Url),
     Register(String, String, Url, Url),
     Guest(Url, Url),
-    Sync(Url, AccessToken, UserId, Option<String>, bool, u64),
+    Sync(
+        Url,
+        AccessToken,
+        UserId,
+        Option<RoomId>,
+        Option<String>,
+        bool,
+        u64,
+    ),
     GetThumbAsync(Url, String, Sender<Result<String, Error>>),
     GetMediaAsync(Url, String, Sender<Result<String, Error>>),
     GetMediaListAsync(
@@ -36,10 +44,8 @@ pub enum BKCommand {
     SetRoom(Url, AccessToken, RoomId),
     ShutDown,
     DirectorySearch(Url, AccessToken, String, String, String, bool),
-    JoinRoom(Url, AccessToken, RoomId),
     AttachFile(Url, AccessToken, Message),
     DirectChat(Url, AccessToken, UserId, Member, RoomId),
-    AcceptInv(Url, AccessToken, RoomId),
     SendBKResponse(BKResponse),
 }
 
@@ -58,7 +64,6 @@ pub enum BKResponse {
     RoomMessagesInit(Vec<Message>),
     SentMsg(Result<(String, Option<EventId>), Error>),
     DirectorySearch(Result<Vec<Room>, Error>),
-    JoinRoom(Result<(), Error>),
     RemoveMessage(Result<(RoomId, EventId), Error>),
     RoomName(RoomId, String),
     RoomTopic(RoomId, String),
@@ -99,6 +104,7 @@ pub enum BKResponse {
     RoomMessagesToError(Error),
     MediaError(Error),
     SentMsgRedactionError(Error),
+    JoinRoomError(Error),
 }
 
 #[derive(Debug, Clone, Copy)]
@@ -151,7 +157,6 @@ impl ThreadPool {
 
 pub struct BackendData {
     pub rooms_since: String,
-    pub join_to_room: Option<RoomId>,
     pub m_direct: HashMap<UserId, Vec<RoomId>>,
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]