+
+
+ setNameVal(e.target.value)}
+ style={inputStyle}
+ {...focusHandlers}
+ />
+
+
+
+ setEmailVal(e.target.value)}
+ style={inputStyle}
+ {...focusHandlers}
+ />
+
@@ -91,8 +123,7 @@ export function UserContactEditor({ userId, phone, birthday }: Props) {
value={birthdayVal}
onChange={(e) => setBirthdayVal(e.target.value)}
style={inputStyle}
- onFocus={(e) => (e.currentTarget.style.borderColor = "var(--foreground)")}
- onBlur={(e) => (e.currentTarget.style.borderColor = "var(--border)")}
+ {...focusHandlers}
/>
diff --git a/src/components/admin/user-enrollment-manager.tsx b/src/components/admin/user-enrollment-manager.tsx
index ed5edd0..eb87398 100644
--- a/src/components/admin/user-enrollment-manager.tsx
+++ b/src/components/admin/user-enrollment-manager.tsx
@@ -1,8 +1,6 @@
"use client";
import { useState, useTransition } from "react";
-import { Button } from "@/components/ui/button";
-import { Input } from "@/components/ui/input";
import { bulkGrantAccess, revokeUserAccess } from "@/lib/actions/user-actions";
interface Course {
@@ -28,7 +26,7 @@ export function UserEnrollmentManager({ userId, allCourses, enrollments }: Props
() => new Map(enrollments.map((e) => [e.courseId, e.expiresAt]))
);
const [selected, setSelected] = useState
>(new Set());
- const [expiryDate, setExpiryDate] = useState("");
+ const [days, setDays] = useState("");
const [pending, startTransition] = useTransition();
const unenrolled = allCourses.filter((c) => !enrolledMap.has(c.id));
@@ -44,12 +42,16 @@ export function UserEnrollmentManager({ userId, allCourses, enrollments }: Props
function handleBulkGrant() {
if (selected.size === 0) return;
const ids = [...selected];
- const expiry = expiryDate || null;
+ const daysNum = parseInt(days, 10);
+ const expiresAt = !isNaN(daysNum) && daysNum > 0
+ ? new Date(Date.now() + daysNum * 86_400_000).toISOString()
+ : null;
const newMap = new Map(enrolledMap);
- ids.forEach((id) => newMap.set(id, expiry ? new Date(expiry) : null));
+ ids.forEach((id) => newMap.set(id, expiresAt ? new Date(expiresAt) : null));
setEnrolledMap(newMap);
setSelected(new Set());
- startTransition(() => bulkGrantAccess(userId, ids, expiry));
+ setDays("");
+ startTransition(() => bulkGrantAccess(userId, ids, expiresAt));
}
function handleRevoke(courseId: string) {
@@ -119,9 +121,26 @@ export function UserEnrollmentManager({ userId, allCourses, enrollments }: Props