Can disconnect user from UI

This commit is contained in:
2025-11-06 21:33:09 +01:00
parent 8bbbe7022f
commit 70a246355b
4 changed files with 62 additions and 2 deletions

View File

@@ -1,7 +1,10 @@
use crate::controllers::HttpResult; use crate::controllers::HttpResult;
use crate::extractors::auth_extractor::AuthExtractor;
use crate::extractors::matrix_client_extractor::MatrixClientExtractor; use crate::extractors::matrix_client_extractor::MatrixClientExtractor;
use crate::matrix_connection::matrix_client::FinishMatrixAuth; use crate::matrix_connection::matrix_client::FinishMatrixAuth;
use actix_web::HttpResponse; use crate::matrix_connection::matrix_manager::MatrixManagerMsg;
use actix_web::{HttpResponse, web};
use ractor::ActorRef;
#[derive(serde::Serialize)] #[derive(serde::Serialize)]
struct StartAuthResponse { struct StartAuthResponse {
@@ -28,3 +31,15 @@ pub async fn finish_auth(client: MatrixClientExtractor) -> HttpResult {
} }
} }
} }
/// Logout user from Matrix server
pub async fn logout(
auth: AuthExtractor,
manager: web::Data<ActorRef<MatrixManagerMsg>>,
) -> HttpResult {
manager
.cast(MatrixManagerMsg::DisconnectClient(auth.user.email))
.expect("Failed to communicate with matrix manager!");
Ok(HttpResponse::Ok().finish())
}

View File

@@ -102,6 +102,10 @@ async fn main() -> std::io::Result<()> {
"/api/matrix_link/finish_auth", "/api/matrix_link/finish_auth",
web::post().to(matrix_link_controller::finish_auth), web::post().to(matrix_link_controller::finish_auth),
) )
.route(
"/api/matrix_link/logout",
web::post().to(matrix_link_controller::logout),
)
}) })
.workers(4) .workers(4)
.bind(&AppConfig::get().listen_address)? .bind(&AppConfig::get().listen_address)?

View File

@@ -23,4 +23,14 @@ export class MatrixLinkApi {
jsonData: { code, state }, jsonData: { code, state },
}); });
} }
/**
* Disconnect from Matrix Account
*/
static async Disconnect(): Promise<void> {
await APIClient.exec({
uri: "/matrix_link/logout",
method: "POST",
});
}
} }

View File

@@ -9,7 +9,9 @@ import {
} from "@mui/material"; } from "@mui/material";
import { MatrixLinkApi } from "../api/MatrixLinkApi"; import { MatrixLinkApi } from "../api/MatrixLinkApi";
import { useAlert } from "../hooks/contexts_provider/AlertDialogProvider"; import { useAlert } from "../hooks/contexts_provider/AlertDialogProvider";
import { useConfirm } from "../hooks/contexts_provider/ConfirmDialogProvider";
import { useLoadingMessage } from "../hooks/contexts_provider/LoadingMessageProvider"; import { useLoadingMessage } from "../hooks/contexts_provider/LoadingMessageProvider";
import { useSnackbar } from "../hooks/contexts_provider/SnackbarProvider";
import { useUserInfo } from "../widgets/dashboard/BaseAuthenticatedPage"; import { useUserInfo } from "../widgets/dashboard/BaseAuthenticatedPage";
import { MatrixGWRouteContainer } from "../widgets/MatrixGWRouteContainer"; import { MatrixGWRouteContainer } from "../widgets/MatrixGWRouteContainer";
@@ -68,8 +70,32 @@ function ConnectCard(): React.ReactElement {
} }
function ConnectedCard(): React.ReactElement { function ConnectedCard(): React.ReactElement {
const snackbar = useSnackbar();
const confirm = useConfirm();
const alert = useAlert();
const loadingMessage = useLoadingMessage();
const info = useUserInfo();
const user = useUserInfo(); const user = useUserInfo();
const handleDisconnect = async () => {
if (!(await confirm("Do you really want to unlink your Matrix account?")))
return;
try {
loadingMessage.show("Unlinking Matrix account...");
await MatrixLinkApi.Disconnect();
snackbar("Successfully unlinked Matrix account!");
} catch (e) {
console.error(`Failed to unlink user account! ${e}`);
alert(`Failed to unlink your account! ${e}`);
} finally {
info.reloadUserInfo();
loadingMessage.hide();
}
};
return ( return (
<Card> <Card>
<CardContent> <CardContent>
@@ -97,7 +123,12 @@ function ConnectedCard(): React.ReactElement {
</Typography> </Typography>
</CardContent> </CardContent>
<CardActions> <CardActions>
<Button size="small" variant="outlined" startIcon={<LinkOffIcon />}> <Button
size="small"
variant="outlined"
startIcon={<LinkOffIcon />}
onClick={handleDisconnect}
>
Disconnect Disconnect
</Button> </Button>
</CardActions> </CardActions>