diff --git a/src/app/admin/families/page.tsx b/src/app/admin/families/page.tsx
index 16a035b..80c93f5 100644
--- a/src/app/admin/families/page.tsx
+++ b/src/app/admin/families/page.tsx
@@ -47,6 +47,9 @@ export default function AdminFamilies() {
headers: { Authorization: `Bearer ${localStorage.getItem("admin_token")}` },
});
const data = await res.json();
+ if (data.error) {
+ console.error("API error:", data.error);
+ }
setFamilies(data.families || []);
} catch (err) {
console.error("Failed to fetch families:", err);
@@ -54,6 +57,24 @@ export default function AdminFamilies() {
setLoading(false);
};
+ const handleCreateFamily = async () => {
+ const name = prompt("Family name:");
+ if (!name) return;
+ try {
+ const res = await fetch("/api/admin/families", {
+ method: "POST",
+ headers: {
+ Authorization: `Bearer ${localStorage.getItem("admin_token")}`,
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({ name }),
+ });
+ if (res.ok) fetchFamilies();
+ } catch (err) {
+ console.error("Failed to create:", err);
+ }
+ };
+
const handleAddMember = async () => {
if (!addMember?.email || !addMember?.familyId) return;
try {
@@ -126,12 +147,20 @@ export default function AdminFamilies() {
Families
{families.length} total families
-
+
+
+
+
{/* Filters */}
diff --git a/src/app/admin/users/page.tsx b/src/app/admin/users/page.tsx
index 76f5ba3..eace868 100644
--- a/src/app/admin/users/page.tsx
+++ b/src/app/admin/users/page.tsx
@@ -10,13 +10,22 @@ interface User {
familyId: string;
familyName: string;
createdAt: string;
+ memberId?: string;
+}
+
+interface Family {
+ id: string;
+ name: string;
}
export default function AdminUsers() {
const router = useRouter();
const [users, setUsers] = useState([]);
+ const [families, setFamilies] = useState([]);
const [loading, setLoading] = useState(true);
const [search, setSearch] = useState("");
+ const [showAdd, setShowAdd] = useState(false);
+ const [newUser, setNewUser] = useState({ email: "", name: "", familyId: "", role: "caregiver" });
useEffect(() => {
const token = localStorage.getItem("admin_token");
@@ -25,6 +34,7 @@ export default function AdminUsers() {
return;
}
fetchUsers();
+ fetchFamilies();
}, []);
const fetchUsers = async () => {
@@ -40,9 +50,56 @@ export default function AdminUsers() {
setLoading(false);
};
+ const fetchFamilies = async () => {
+ try {
+ const res = await fetch("/api/admin/families", {
+ headers: { Authorization: `Bearer ${localStorage.getItem("admin_token")}` },
+ });
+ const data = await res.json();
+ setFamilies(data.families || []);
+ } catch (err) {
+ console.error("Failed to fetch families:", err);
+ }
+ };
+
+ const handleAddUser = async () => {
+ if (!newUser.email) return;
+ try {
+ const res = await fetch("/api/admin/users", {
+ method: "POST",
+ headers: {
+ Authorization: `Bearer ${localStorage.getItem("admin_token")}`,
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(newUser),
+ });
+ if (res.ok) {
+ fetchUsers();
+ setShowAdd(false);
+ setNewUser({ email: "", name: "", familyId: "", role: "caregiver" });
+ }
+ } catch (err) {
+ console.error("Failed to create user:", err);
+ }
+ };
+
+ const handleRemoveUser = async (userId: string, memberId?: string) => {
+ if (!confirm("Delete this user?")) return;
+ try {
+ const params = memberId ? `memberId=${memberId}` : `userId=${userId}`;
+ const res = await fetch(`/api/admin/users?${params}`, {
+ method: "DELETE",
+ headers: { Authorization: `Bearer ${localStorage.getItem("admin_token")}` },
+ });
+ if (res.ok) fetchUsers();
+ } catch (err) {
+ console.error("Failed to delete:", err);
+ }
+ };
+
const filteredUsers = users.filter((u) =>
u.email.toLowerCase().includes(search.toLowerCase()) ||
- u.name.toLowerCase().includes(search.toLowerCase())
+ (u.name || "").toLowerCase().includes(search.toLowerCase())
);
const exportCSV = () => {
@@ -68,11 +125,41 @@ export default function AdminUsers() {
Users
{users.length} total users
-