Skip to main content

quorum_lib/
common.rs

1use tauri::{AppHandle, Emitter};
2
3static CLIENT: std::sync::OnceLock<reqwest::Client> = std::sync::OnceLock::new();
4
5#[allow(clippy::redundant_closure)]
6fn get_client() -> &'static reqwest::Client {
7    CLIENT.get_or_init(|| reqwest::Client::new())
8}
9
10pub async fn make_auth_request(
11    app: &AppHandle,
12    endpoint: &str,
13    payload: &serde_json::Value,
14    expected_status: u16,
15) -> Result<serde_json::Value, String> {
16    let client = get_client();
17    let server_url = "http://127.0.0.1:3000";
18
19    let response = client
20        .post(format!("{}{}", server_url, endpoint))
21        .json(payload)
22        .send()
23        .await
24        .map_err(|e| format!("Request failed: {}", e))?;
25
26    let status = response.status().as_u16();
27    let body: serde_json::Value = response
28        .json()
29        .await
30        .map_err(|e| format!("Failed to parse response: {}", e))?;
31
32    if status == 401 {
33        if endpoint == "/auth/refresh" {
34            let _ = app.emit("auth:refresh-failed", ());
35        } else {
36            let _ = app.emit("auth:token-expired", ());
37        }
38    }
39
40    if status != expected_status {
41        let error_msg = body["message"].as_str().unwrap_or("Unknown error");
42        return Err(error_msg.to_string());
43    }
44
45    if body["success"] != true {
46        return Err(format!("Request failed: {}", body["message"]));
47    }
48
49    Ok(body)
50}