|
diff --git a/src/routes/admin/users/index.tsx b/src/routes/admin/users/index.tsx
index d0a1a58..d0f376b 100644
--- a/src/routes/admin/users/index.tsx
+++ b/src/routes/admin/users/index.tsx
@@ -91,19 +91,26 @@ export default function UsersManagementPage() {
const [filterOpen, setFilterOpen] = createSignal(false);
const [openMenuId, setOpenMenuId] = createSignal(null);
const [selectedUser, setSelectedUser] = createSignal(null);
+ const [loadError, setLoadError] = createSignal("");
+ const [actionError, setActionError] = createSignal("");
const currentUser = createMemo(() => selectedUser());
+ const authHeaders = (): Record => {
+ const accessToken =
+ typeof sessionStorage !== "undefined"
+ ? sessionStorage.getItem("nxtgauge_admin_access_token") || ""
+ : "";
+ return accessToken ? { Authorization: `Bearer ${accessToken}` } : {};
+ };
+
const load = async () => {
try {
- const accessToken =
- typeof sessionStorage !== "undefined"
- ? sessionStorage.getItem("nxtgauge_admin_access_token") || ""
- : "";
+ setLoadError("");
const r = await fetch("/api/admin/users", {
headers: {
Accept: "application/json",
- ...(accessToken ? { Authorization: `Bearer ${accessToken}` } : {}),
+ ...authHeaders(),
},
credentials: "include",
});
@@ -149,6 +156,7 @@ export default function UsersManagementPage() {
} catch (e) {
console.error(e);
setRows([]);
+ setLoadError("Failed to load users. Please refresh or try again.");
}
};
@@ -273,22 +281,46 @@ export default function UsersManagementPage() {
setOpenMenuId(null);
};
- const toggleSuspend = (user: ExternalUserRecord) => {
- const nextStatus = user.accountStatus === "SUSPENDED" ? "ACTIVE" : "SUSPENDED";
- setRows((prev) =>
- prev.map((r) => (r.id === user.id ? { ...r, accountStatus: nextStatus } : r))
- );
- if (selectedUser()?.id === user.id) setSelectedUser({ ...user, accountStatus: nextStatus });
+ const applyAccountStatus = async (user: ExternalUserRecord, nextStatus: string) => {
+ const previousStatus = user.accountStatus;
+ setActionError("");
setOpenMenuId(null);
+
+ setRows((prev) =>
+ prev.map((r) => (r.id === user.id ? { ...r, accountStatus: nextStatus as any } : r))
+ );
+ if (selectedUser()?.id === user.id)
+ setSelectedUser({ ...user, accountStatus: nextStatus as any });
+
+ try {
+ const r = await fetch(`/api/admin/users/${user.id}/status`, {
+ method: "PATCH",
+ headers: {
+ "Content-Type": "application/json",
+ Accept: "application/json",
+ ...authHeaders(),
+ },
+ credentials: "include",
+ body: JSON.stringify({ status: nextStatus }),
+ });
+ if (!r.ok) throw new Error("Failed to update user status");
+ } catch (e) {
+ console.error(e);
+ setRows((prev) =>
+ prev.map((r) => (r.id === user.id ? { ...r, accountStatus: previousStatus } : r))
+ );
+ if (selectedUser()?.id === user.id)
+ setSelectedUser({ ...user, accountStatus: previousStatus });
+ setActionError(`Failed to update status for ${user.name}. Please try again.`);
+ }
+ };
+
+ const toggleSuspend = (user: ExternalUserRecord) => {
+ void applyAccountStatus(user, user.accountStatus === "SUSPENDED" ? "ACTIVE" : "SUSPENDED");
};
const toggleBlock = (user: ExternalUserRecord) => {
- const nextStatus = user.accountStatus === "BLOCKED" ? "ACTIVE" : "BLOCKED";
- setRows((prev) =>
- prev.map((r) => (r.id === user.id ? { ...r, accountStatus: nextStatus } : r))
- );
- if (selectedUser()?.id === user.id) setSelectedUser({ ...user, accountStatus: nextStatus });
- setOpenMenuId(null);
+ void applyAccountStatus(user, user.accountStatus === "BLOCKED" ? "ACTIVE" : "BLOCKED");
};
return (
@@ -301,6 +333,17 @@ export default function UsersManagementPage() {
+
+
+ {loadError()}
+
+
+
+
+ {actionError()}
+
+
+
{[
@@ -839,9 +882,13 @@ export default function UsersManagementPage() {
fallback={
|
- No users found
+
+ {loadError() ? "Unable to load users" : "No users found"}
+
- Try changing filters or search.
+ {loadError()
+ ? "There was a problem contacting the server. Try refreshing the page."
+ : "Try changing filters or search."}
|
|