import React, { useState } from 'react' import { Search, Shield, UserX, UserCheck } from 'lucide-react' import axios from 'axios' import { useAuthStore } from '../../store/authStore' import { useUIStore } from '../../store/uiStore' import { User, UserRole } from '../../types' import { Avatar } from '../ui/Avatar' import { RoleBadge } from '../ui/Badge' import { Button } from '../ui/Button' import { Modal } from '../ui/Modal' const API = 'https://localhost:7125/api' export const UserTable: React.FC = () => { const { allUsers, updateUserRole, currentUser, token } = useAuthStore() const { addToast } = useUIStore() const [search, setSearch] = useState('') const [confirmUser, setConfirmUser] = useState(null) const [confirmAction, setConfirmAction] = useState<'promote' | 'demote' | null>(null) const [loading, setLoading] = useState(false) const authHeaders = token ? { Authorization: `Bearer ${token}` } : {} const filtered = allUsers.filter( u => u.username.toLowerCase().includes(search.toLowerCase()) || u.email.toLowerCase().includes(search.toLowerCase()) || u.name.toLowerCase().includes(search.toLowerCase()) ) const handlePromote = async (user: User) => { setLoading(true) try { await axios.post(`${API}/admins`, { userId: user.user_id }, { headers: authHeaders }) updateUserRole(user.user_id, 'admin') addToast(`${user.username} promoted to admin`) } catch (err: any) { addToast(err?.response?.data?.message || 'Failed to promote user.', 'error') } finally { setLoading(false) setConfirmUser(null) } } const handleDemote = async (user: User) => { setLoading(true) try { await axios.delete(`${API}/admins/${user.user_id}`, { headers: authHeaders }) updateUserRole(user.user_id, 'writer') addToast(`${user.username} removed from admin`, 'info') } catch (err: any) { addToast(err?.response?.data?.message || 'Failed to demote user.', 'error') } finally { setLoading(false) setConfirmUser(null) } } const formatDate = (str: string) => new Date(str).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }) return (
{/* Search */}
setSearch(e.target.value)} placeholder="Search users..." className="w-full pl-9 pr-4 py-2.5 bg-slate-800 border border-slate-700 rounded-xl text-sm text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500" />
{/* Table */}
{filtered.map(user => ( ))}
User Email Role Joined Actions

{user.name} {user.surname}

@{user.username}

{user.email} {formatDate(user.created_at)}
{user.user_id !== currentUser?.user_id && user.role !== 'admin' && ( )} {user.user_id !== currentUser?.user_id && user.role !== 'regular' && ( )}
{filtered.length === 0 && (
No users found.
)}
{/* Confirm modal */} { setConfirmUser(null); setConfirmAction(null) }} title={confirmAction === 'promote' ? 'Promote User' : 'Demote User'} size="sm" > {confirmUser && (

{confirmAction === 'promote' ? `Promote @${confirmUser.username} to the next role tier?` : `Demote @${confirmUser.username} to a lower role?`}

)}
) }