fedimint_gateway_ui/
connect_fed.rs

1use 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 back to dashboard on success
47            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}