fedimint_gateway_ui/
connect_fed.rs1use std::fmt::Display;
2
3use axum::Form;
4use axum::extract::State;
5use axum::response::IntoResponse;
6use fedimint_gateway_common::ConnectFedPayload;
7use fedimint_ui_common::UiState;
8use fedimint_ui_common::auth::UserAuth;
9use maud::{Markup, html};
10
11use crate::{CONNECT_FEDERATION_ROUTE, DynGatewayApi, redirect_error, redirect_success};
12
13pub fn render() -> Markup {
14 html!(
15 div class="card h-100" {
16 div class="card-header dashboard-header" { "Connect a new Federation" }
17 div class="card-body" {
18 form method="post" action=(CONNECT_FEDERATION_ROUTE)
19 onsubmit="var btn = this.querySelector('button[type=submit]'); \
20 var isRecover = this.querySelector('#recover-checkbox').checked; \
21 btn.disabled = true; \
22 btn.innerHTML = '<span class=\"spinner-border spinner-border-sm\" role=\"status\"></span> ' + (isRecover ? 'Recovering...' : 'Connecting...');"
23 {
24 div class="mb-3" {
25 label class="form-label" { "Invite Code" }
26 input type="text" class="form-control" name="invite_code" required;
27 }
28 div class="mb-3 form-check" {
29 input type="checkbox" class="form-check-input" name="recover" value="true" id="recover-checkbox";
30 label class="form-check-label" for="recover-checkbox" { "Recover" }
31 }
32 button type="submit" class="btn btn-primary" { "Submit" }
33 }
34 }
35 }
36 )
37}
38
39pub async fn connect_federation_handler<E: Display>(
40 State(state): State<UiState<DynGatewayApi<E>>>,
41 _auth: UserAuth,
42 Form(payload): Form<ConnectFedPayload>,
43) -> impl IntoResponse {
44 match state.api.handle_connect_federation(payload).await {
45 Ok(info) => {
46 redirect_success(format!(
48 "Successfully joined {}",
49 info.federation_name
50 .unwrap_or("Unnamed Federation".to_string())
51 ))
52 .into_response()
53 }
54 Err(err) => redirect_error(format!("Failed to join federation: {err}")).into_response(),
55 }
56}