33import React , { useState , useEffect } from "react" ;
44import { useSession } from "@/app/hooks/useSession" ;
55import { listUserAdminAction } from "@/lib/auth/actions/list-users" ;
6+ import { updateUserAdminStatusAction } from "@/lib/auth/actions/update-admin-status" ;
67import { UserAdmin } from "@/lib/types/user" ;
7- import { ArrowUpDown , Loader2 , Shield , FolderKanban } from "lucide-react" ;
8+ import { ArrowUpDown , Loader2 , Shield , FolderKanban , X , Check } from "lucide-react" ;
89import Image from "next/image" ;
910import Link from "next/link" ;
1011
@@ -21,6 +22,7 @@ export default function UsersPage() {
2122 const [ sortField , setSortField ] = useState < SortField > ( "lastActive" ) ;
2223 const [ sortDirection , setSortDirection ] = useState < SortDirection > ( "desc" ) ;
2324 const [ loading , setLoading ] = useState ( true ) ;
25+ const [ confirmDialog , setConfirmDialog ] = useState < { open : boolean ; userId : string ; newStatus : boolean } | null > ( null ) ;
2426
2527 // Load users and workspace counts
2628 useEffect ( ( ) => {
@@ -51,6 +53,33 @@ export default function UsersPage() {
5153 setSortDirection ( "asc" ) ;
5254 }
5355 } ;
56+
57+ // Handle admin status toggle
58+ const handleAdminToggle = async ( userId : string , newStatus : boolean ) => {
59+ setConfirmDialog ( { open : true , userId, newStatus } ) ;
60+ } ;
61+
62+ // Handle confirmation of admin status change
63+ const handleConfirmAdminChange = async ( ) => {
64+ if ( ! confirmDialog || ! session ) return ;
65+
66+ try {
67+ const success = await updateUserAdminStatusAction ( session , confirmDialog . userId , confirmDialog . newStatus ) ;
68+ if ( success ) {
69+ setUsers ( prevUsers =>
70+ prevUsers . map ( user =>
71+ user . id === confirmDialog . userId
72+ ? { ...user , isAdmin : confirmDialog . newStatus }
73+ : user
74+ )
75+ ) ;
76+ }
77+ } catch ( error ) {
78+ console . error ( "Failed to update admin status:" , error ) ;
79+ } finally {
80+ setConfirmDialog ( null ) ;
81+ }
82+ } ;
5483
5584 // Sort users
5685 const sortedUsers = [ ...users ] . sort ( ( a , b ) => {
@@ -199,14 +228,22 @@ export default function UsersPage() {
199228 { formatDate ( user . lastActiveAt ) }
200229 </ td >
201230 < td className = "px-4 py-3 text-sm text-text" >
202- { user . isAdmin ? (
203- < div className = "flex items-center text-primary" >
204- < Shield className = "w-4 h-4 mr-1" />
205- Admin
206- </ div >
207- ) : (
208- "User"
209- ) }
231+ < div className = "flex items-center" >
232+ < input
233+ type = "checkbox"
234+ checked = { user . isAdmin || false }
235+ onChange = { ( ) => handleAdminToggle ( user . id , ! user . isAdmin ) }
236+ className = "mr-2 h-4 w-4 rounded border-border text-primary focus:ring-primary"
237+ />
238+ { user . isAdmin ? (
239+ < div className = "flex items-center text-primary" >
240+ < Shield className = "w-4 h-4 mr-1" />
241+ Admin
242+ </ div >
243+ ) : (
244+ "User"
245+ ) }
246+ </ div >
210247 </ td >
211248 </ tr >
212249 ) ) }
@@ -215,6 +252,40 @@ export default function UsersPage() {
215252 </ div >
216253 ) }
217254 </ div >
255+
256+ { /* Confirmation Dialog */ }
257+ { confirmDialog && confirmDialog . open && (
258+ < div className = "fixed inset-0 bg-black/50 flex items-center justify-center z-50" >
259+ < div className = "bg-surface p-6 rounded-lg border border-border max-w-md w-full" >
260+ < div className = "flex justify-between items-center mb-4" >
261+ < h3 className = "text-lg font-medium" > Confirm Admin Status Change</ h3 >
262+ < button
263+ onClick = { ( ) => setConfirmDialog ( null ) }
264+ className = "text-text/50 hover:text-text"
265+ >
266+ < X className = "w-5 h-5" />
267+ </ button >
268+ </ div >
269+ < p className = "mb-6" >
270+ Are you sure you want to { confirmDialog . newStatus ? "grant" : "revoke" } admin privileges for this user?
271+ </ p >
272+ < div className = "flex justify-end space-x-4" >
273+ < button
274+ onClick = { ( ) => setConfirmDialog ( null ) }
275+ className = "px-4 py-2 border border-border rounded-md"
276+ >
277+ Cancel
278+ </ button >
279+ < button
280+ onClick = { handleConfirmAdminChange }
281+ className = "px-4 py-2 bg-primary text-white rounded-md flex items-center"
282+ >
283+ < Check className = "w-4 h-4 mr-2" /> Confirm
284+ </ button >
285+ </ div >
286+ </ div >
287+ </ div >
288+ ) }
218289 </ div >
219290 ) ;
220- }
291+ }
0 commit comments