[fractal] Set language through matrix-sdk



commit 8552d90d6bf9e2493e77018779238dafd7c5a3f5
Author: Alejandro Domínguez <adomu net-c com>
Date:   Sun Sep 6 01:29:59 2020 +0200

    Set language through matrix-sdk

 fractal-gtk/src/app/connect/language.rs            | 13 +++---
 fractal-gtk/src/backend/room.rs                    | 49 ++++++++++++----------
 fractal-matrix-api/src/meson.build                 |  2 -
 fractal-matrix-api/src/r0.rs                       |  1 -
 fractal-matrix-api/src/r0/config.rs                |  1 -
 .../src/r0/config/set_room_account_data.rs         | 31 --------------
 fractal-matrix-api/src/r0/sync/sync_events.rs      |  5 ---
 7 files changed, 31 insertions(+), 71 deletions(-)
---
diff --git a/fractal-gtk/src/app/connect/language.rs b/fractal-gtk/src/app/connect/language.rs
index d2f91412..0a54e88f 100644
--- a/fractal-gtk/src/app/connect/language.rs
+++ b/fractal-gtk/src/app/connect/language.rs
@@ -1,8 +1,7 @@
-use crate::app::App;
+use crate::app::{App, RUNTIME};
 use crate::backend::{room, HandleError};
 use glib::object::Cast;
 use gtk::prelude::*;
-use std::thread;
 
 // The TextBufferExt alias is necessary to avoid conflict with gtk's TextBufferExt
 use gspell::{CheckerExt, TextBuffer, TextBufferExt as GspellTextBufferExt};
@@ -26,13 +25,11 @@ impl App {
                     due to the user switching rooms, the op mutex is locked already.
                     If the checker is modified by gtk due to the user switching the language, the op mutex 
is unlocked. */
                     if let Ok(op) = op.try_lock() {
-                        if let (Some(active_room), Some(login_data)) = (op.active_room.as_ref(), 
op.login_data.as_ref()) {
-                            let server = login_data.session_client.homeserver().clone();
-                            let access_token = login_data.access_token.clone();
+                        if let (Some(active_room), Some(login_data)) = (op.active_room.clone(), 
op.login_data.as_ref()) {
+                            let session_client = login_data.session_client.clone();
                             let uid = login_data.uid.clone();
-                            let room_id = active_room.clone();
-                            thread::spawn(move || {
-                                let query = room::set_language(access_token, server, uid, room_id, 
lang_code);
+                            RUNTIME.spawn(async move {
+                                let query = room::set_language(session_client, &uid, &active_room, 
lang_code).await;
                                 if let Err(err) = query {
                                     err.handle_error();
                                 }
diff --git a/fractal-gtk/src/backend/room.rs b/fractal-gtk/src/backend/room.rs
index 33eff4a6..57ecd3cf 100644
--- a/fractal-gtk/src/backend/room.rs
+++ b/fractal-gtk/src/backend/room.rs
@@ -8,6 +8,7 @@ use fractal_api::{
     Client as MatrixClient, Error as MatrixError, FromHttpResponseError as RumaResponseError,
     ServerError,
 };
+use serde::Serialize;
 use std::io::Error as IoError;
 use std::path::Path;
 
@@ -28,6 +29,7 @@ use crate::model::{
 };
 use fractal_api::api::r0::config::get_global_account_data::Request as GetGlobalAccountDataRequest;
 use fractal_api::api::r0::config::set_global_account_data::Request as SetGlobalAccountDataRequest;
+use fractal_api::api::r0::config::set_room_account_data::Request as SetRoomAccountDataRequest;
 use fractal_api::api::r0::filter::RoomEventFilter;
 use fractal_api::api::r0::media::create_content::Request as CreateContentRequest;
 use fractal_api::api::r0::media::create_content::Response as CreateContentResponse;
@@ -49,8 +51,6 @@ use fractal_api::events::AnyStateEventContent;
 use fractal_api::events::EventContent;
 use fractal_api::events::EventType;
 use fractal_api::events::InitialStateEvent;
-use fractal_api::r0::config::set_room_account_data::request as set_room_account_data;
-use fractal_api::r0::config::set_room_account_data::Parameters as SetRoomAccountDataParameters;
 use fractal_api::r0::pushrules::delete_room_rules::request as delete_room_rules;
 use fractal_api::r0::pushrules::delete_room_rules::Parameters as DelRoomRulesParams;
 use fractal_api::r0::pushrules::get_room_rules::request as get_room_rules;
@@ -68,7 +68,6 @@ use fractal_api::r0::state::get_state_events_for_key::Parameters as GetStateEven
 use fractal_api::r0::sync::get_joined_members::request as get_joined_members;
 use fractal_api::r0::sync::get_joined_members::Parameters as JoinedMembersParameters;
 use fractal_api::r0::sync::get_joined_members::Response as JoinedMembersResponse;
-use fractal_api::r0::sync::sync_events::Language;
 use fractal_api::r0::tag::create_tag::request as create_tag;
 use fractal_api::r0::tag::create_tag::Body as CreateTagBody;
 use fractal_api::r0::tag::create_tag::Parameters as CreateTagParameters;
@@ -845,14 +844,20 @@ pub async fn invite(
 }
 
 #[derive(Debug)]
-pub struct ChangeLanguageError(ReqwestError);
+pub struct ChangeLanguageError(MatrixError);
 
-impl From<ReqwestError> for ChangeLanguageError {
-    fn from(err: ReqwestError) -> Self {
+impl From<MatrixError> for ChangeLanguageError {
+    fn from(err: MatrixError) -> Self {
         Self(err)
     }
 }
 
+impl From<ParseJsonError> for ChangeLanguageError {
+    fn from(err: ParseJsonError) -> Self {
+        Self(err.into())
+    }
+}
+
 impl HandleError for ChangeLanguageError {
     fn handle_error(&self) {
         let err_str = format!("{:?}", self);
@@ -863,27 +868,25 @@ impl HandleError for ChangeLanguageError {
     }
 }
 
-pub fn set_language(
-    access_token: AccessToken,
-    base: Url,
-    user_id: UserId,
-    room_id: RoomId,
+#[derive(Clone, Debug, Serialize)]
+pub struct Language {
+    pub input_language: String,
+}
+
+pub async fn set_language(
+    session_client: MatrixClient,
+    user_id: &UserId,
+    room_id: &RoomId,
     input_language: String,
 ) -> Result<(), ChangeLanguageError> {
-    let params = SetRoomAccountDataParameters { access_token };
-
-    let body = json!(Language { input_language });
-
-    let request = set_room_account_data(
-        base,
-        &params,
-        &body,
-        &user_id,
-        &room_id,
+    let request = SetRoomAccountDataRequest::new(
+        to_raw_value(&Language { input_language })?,
         "org.gnome.fractal.language",
-    )?;
+        room_id,
+        user_id,
+    );
 
-    HTTP_CLIENT.get_client().execute(request)?;
+    session_client.send(request).await?;
 
     Ok(())
 }
diff --git a/fractal-matrix-api/src/meson.build b/fractal-matrix-api/src/meson.build
index f074fdea..68c1beda 100644
--- a/fractal-matrix-api/src/meson.build
+++ b/fractal-matrix-api/src/meson.build
@@ -8,7 +8,6 @@ api_sources = files(
   'r0/account/login.rs',
   'r0/account/logout.rs',
   'r0/account/register.rs',
-  'r0/config/set_room_account_data.rs',
   'r0/contact/create.rs',
   'r0/contact/delete.rs',
   'r0/contact/get_identifiers.rs',
@@ -29,7 +28,6 @@ api_sources = files(
   'r0/tag/delete_tag.rs',
   'r0/thirdparty/get_supported_protocols.rs',
   'r0/account.rs',
-  'r0/config.rs',
   'r0/contact.rs',
   'r0/filter.rs',
   'r0/media.rs',
diff --git a/fractal-matrix-api/src/r0.rs b/fractal-matrix-api/src/r0.rs
index 9a941d22..ae62186a 100644
--- a/fractal-matrix-api/src/r0.rs
+++ b/fractal-matrix-api/src/r0.rs
@@ -1,5 +1,4 @@
 pub mod account;
-pub mod config;
 pub mod contact;
 pub mod filter;
 pub mod media;
diff --git a/fractal-matrix-api/src/r0/sync/sync_events.rs b/fractal-matrix-api/src/r0/sync/sync_events.rs
index 05a1ae68..c91cbb71 100644
--- a/fractal-matrix-api/src/r0/sync/sync_events.rs
+++ b/fractal-matrix-api/src/r0/sync/sync_events.rs
@@ -202,11 +202,6 @@ pub struct AccountData {
     pub events: Vec<JsonValue>,
 }
 
-#[derive(Clone, Debug, Serialize)]
-pub struct Language {
-    pub input_language: String,
-}
-
 #[derive(Clone, Debug, Deserialize)]
 pub struct ToDevice {
     // TODO: Implement Event


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