phase 1-6 implemented

This commit is contained in:
dimitar committed 2026-03-10 04:14:03 +01:00
1 parent 22c274bb83
commit 2c4927478a
73 files changed
+9702 -2354

No files matched your search

@@ -6,6 +6,8 @@ import { UserGrid } from "@/components/users/UserGrid";
import { Card, CardHeader, CardContent } from "@/components/ui/card";
import { Button } from "@/components/ui/button";
import { useUser } from "@clerk/nextjs";
import { getGymIdFromUser } from "@/lib/error-helpers";
import log from "@/lib/logger";
interface User {
id: string;
@@ -83,30 +85,27 @@ export function UserManagement() {
? `/api/users?ts=${ts}`
: `/api/users?role=${filter}&ts=${ts}`;
console.log("UserManagement.fetchUsers: fetching URL", url);
log.debug("Fetching users", { url });
const response = await fetch(url, { cache: "no-store" });
console.log(
"UserManagement.fetchUsers: response.ok",
response.ok,
"status",
response.status,
);
log.debug("Users fetch response", {
ok: response.ok,
status: response.status,
});
const data = await response.json();
console.log(
"UserManagement.fetchUsers: received users count",
Array.isArray(data.users) ? data.users.length : 0,
"sample",
data.users && data.users[0]
? {
id: data.users[0].id,
gymId: data.users[0].gymId,
role: data.users[0].role,
}
: null,
);
log.debug("Received users data", {
count: Array.isArray(data.users) ? data.users.length : 0,
sample:
data.users && data.users[0]
? {
id: data.users[0].id,
gymId: data.users[0].gymId,
role: data.users[0].role,
}
: null,
});
setUsers(data.users || []);
} catch (error) {
console.error("Failed to fetch users:", error);
log.error("Failed to fetch users", error);
} finally {
setLoading(false);
}
@@ -152,7 +151,7 @@ export function UserManagement() {
alert("Error deleting users");
}
} catch (error) {
console.error(error);
log.error("Failed to delete users", error);
}
};
@@ -201,37 +200,25 @@ export function UserManagement() {
try {
if (selectedUser) {
// Update existing user
console.log(
"UserManagement.handleSaveEdit: sending PUT /api/users payload",
{
id: selectedUser.id,
email: editForm.email,
firstName: editForm.firstName,
lastName: editForm.lastName,
role: editForm.role,
phone: editForm.phone,
gymId: editForm.gymId === "" ? null : editForm.gymId,
},
);
const payload = {
id: selectedUser.id,
email: editForm.email,
firstName: editForm.firstName,
lastName: editForm.lastName,
role: editForm.role,
phone: editForm.phone,
gymId: editForm.gymId === "" ? null : editForm.gymId,
};
log.debug("Updating user", payload);
const response = await fetch("/api/users", {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
id: selectedUser.id,
email: editForm.email,
firstName: editForm.firstName,
lastName: editForm.lastName,
role: editForm.role,
phone: editForm.phone,
gymId: editForm.gymId === "" ? null : editForm.gymId,
}),
body: JSON.stringify(payload),
});
log.debug("User update response", {
ok: response.ok,
status: response.status,
});
console.log(
"UserManagement.handleSaveEdit: PUT /api/users response.ok",
response.ok,
"status",
response.status,
);
if (response.ok) {
// Optimistically update local state so grid reflects changes immediately
setUsers((prev) =>
@@ -265,15 +252,12 @@ export function UserManagement() {
setIsEditing(false);
setEditForm(null);
// Still re-fetch from server to ensure consistency
console.log(
"UserManagement.handleSaveEdit: re-fetching users after successful edit",
);
log.debug("Re-fetching users after successful edit");
fetchUsers();
} else {
const errText = await response.text().catch(() => "");
console.error("UserManagement.handleSaveEdit: update failed", {
log.error("User update failed", new Error(errText), {
status: response.status,
body: errText,
});
alert("Error updating user");
}
@@ -320,7 +304,7 @@ export function UserManagement() {
alert("Error deleting user");
}
} catch (error) {
console.error(error);
log.error("Failed to delete user", error);
}
};
@@ -351,7 +335,7 @@ export function UserManagement() {
email: "",
role: "client",
phone: "",
gymId: String((user?.publicMetadata as any)?.gymId ?? ""),
gymId: user ? getGymIdFromUser(user) : "",
});
setSelectedUser(null);
setIsEditing(true);