Can disconnect user from UI
This commit is contained in:
@@ -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())
|
||||||
|
}
|
||||||
|
|||||||
@@ -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)?
|
||||||
|
|||||||
@@ -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",
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user