friends system (appears fully functional)
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user