friends system (appears fully functional)

This commit is contained in:
2025-12-15 21:22:34 +08:00
parent a317235bce
commit 2eef22829d
2 changed files with 55 additions and 3 deletions

View File

@@ -11,6 +11,8 @@ pub enum RemoteError {
Http(#[from] reqwest::Error), Http(#[from] reqwest::Error),
#[error("JSON parse error: {0}")] #[error("JSON parse error: {0}")]
Json(#[from] serde_json::Error), Json(#[from] serde_json::Error),
#[error("{0}")]
Api(String),
} }
#[derive(Default, Serialize, Deserialize, Clone, Debug, TS)] #[derive(Default, Serialize, Deserialize, Clone, Debug, TS)]
@@ -175,6 +177,18 @@ impl FriendRemote {
"FriendRemote::send_friend_request - Received response with status: {}", "FriendRemote::send_friend_request - Received response with status: {}",
resp.status() resp.status()
); );
if resp.status() == reqwest::StatusCode::CONFLICT {
let text = resp.text().await.unwrap_or_default();
// try to parse the error message
let error_msg = serde_json::from_str::<serde_json::Value>(&text)
.ok()
.and_then(|v| v.get("message").and_then(|m| m.as_str().map(String::from)))
.unwrap_or_else(|| "Conflict error".to_string());
return Err(RemoteError::Api(error_msg));
}
let resp = resp.error_for_status().map_err(|e| { let resp = resp.error_for_status().map_err(|e| {
tracing::error!("FriendRemote::send_friend_request - HTTP error: {}", e); tracing::error!("FriendRemote::send_friend_request - HTTP error: {}", e);
e e

View File

@@ -1,5 +1,6 @@
<script lang="ts"> <script lang="ts">
import { onMount } from "svelte"; import { onMount, onDestroy } from "svelte";
import { listen } from "@tauri-apps/api/event";
import { invoke } from "@tauri-apps/api/core"; import { invoke } from "@tauri-apps/api/core";
import { appData } from "../../../events/app-data"; import { appData } from "../../../events/app-data";
import type { FriendRequestResponseDto } from "../../../types/bindings/FriendRequestResponseDto.js"; import type { FriendRequestResponseDto } from "../../../types/bindings/FriendRequestResponseDto.js";
@@ -42,9 +43,40 @@
})), })),
]; ];
onMount(() => { let unlisteners: (() => void)[] = [];
onMount(async () => {
refreshReceived(); refreshReceived();
refreshSent(); refreshSent();
unlisteners.push(
await listen("friend-request-received", () => {
refreshReceived();
}),
);
unlisteners.push(
await listen("friend-request-accepted", () => {
refreshSent();
invoke("refresh_app_data");
}),
);
unlisteners.push(
await listen("friend-request-denied", () => {
refreshSent();
}),
);
unlisteners.push(
await listen("unfriended", () => {
invoke("refresh_app_data");
}),
);
});
onDestroy(() => {
unlisteners.forEach((unlisten) => unlisten());
}); });
async function refreshReceived() { async function refreshReceived() {
@@ -153,7 +185,13 @@
}); });
await refreshSent(); await refreshSent();
} catch (e) { } catch (e) {
error = (e as Error)?.message ?? String(e); const msg = (e as Error)?.message ?? String(e);
// If the server returns a conflict error (already friends or request exists), show "User not found"
if (msg.toLowerCase().includes("already")) {
error = "User not found";
} else {
error = msg;
}
} finally { } finally {
loading.action = false; loading.action = false;
} }