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}