import React from 'react' import { Shield, Trash2, Edit2, UserPlus, Link2, Copy, Plus } from 'lucide-react' import Modal from '../../components/shared/Modal' import PermissionsPanel from '../../components/Admin/PermissionsPanel' import type { TranslationFn } from '../../types' import type { useAdmin } from './useAdmin' interface AdminUsersTabProps { admin: ReturnType t: TranslationFn locale: string } // "Users" admin tab: user table, invite links, permissions panel + the // create-invite modal. Pure layout around the useAdmin hook — no logic of its own. export default function AdminUsersTab({ admin, t, locale }: AdminUsersTabProps): React.ReactElement { const { hour12, currentUser, users, isLoading, setShowCreateUser, invites, showCreateInvite, setShowCreateInvite, inviteForm, setInviteForm, copyInviteLink, handleCreateInvite, handleDeleteInvite, handleEditUser, handleDeleteUser, } = admin return ( <>

{t('admin.tabs.users')}

{users.length} {t('admin.stats.users')}

{isLoading ? (
) : (
{users.map(u => ( ))}
{t('admin.table.user')} {t('admin.table.email')} {t('admin.table.role')} {t('admin.table.created')} {t('admin.table.lastLogin')} {t('admin.table.actions')}
{u.avatar_url ? ( {u.username} ) : (
{u.username.charAt(0).toUpperCase()}
)}

{u.username}

{u.id === currentUser?.id && ( {t('admin.you')} )}
{u.email} {u.role === 'admin' && } {u.role === 'admin' ? t('settings.roleAdmin') : t('settings.roleUser')} {new Date(u.created_at).toLocaleDateString(locale)} {u.last_login ? new Date(u.last_login).toLocaleDateString(locale, { day: 'numeric', month: 'short', hour: '2-digit', minute: '2-digit', hour12 }) : '—'}
)}
{/* Invite Links (inside users tab) */}

{t('admin.invite.title')}

{t('admin.invite.subtitle')}

{invites.length === 0 ? (
{t('admin.invite.empty')}
) : (
{invites.map(inv => { const isExpired = inv.expires_at && new Date(inv.expires_at) < new Date() const isUsedUp = inv.max_uses > 0 && inv.used_count >= inv.max_uses const isActive = !isExpired && !isUsedUp return (
{inv.token.slice(0, 12)}... {isUsedUp ? t('admin.invite.usedUp') : isExpired ? t('admin.invite.expired') : t('admin.invite.active')}
{inv.used_count}/{inv.max_uses === 0 ? '∞' : inv.max_uses} {t('admin.invite.uses')} {inv.expires_at && ` · ${t('admin.invite.expiresAt')} ${new Date(inv.expires_at).toLocaleDateString(locale)}`} {` · ${t('admin.invite.createdBy')} ${inv.created_by_name}`}
{isActive && ( )}
) })}
)}
{/* Create Invite Modal */} setShowCreateInvite(false)} title={t('admin.invite.create')} size="sm">
{[1, 2, 3, 4, 5, 0].map(n => ( ))}
{[ { value: 1, label: '1d' }, { value: 3, label: '3d' }, { value: 7, label: '7d' }, { value: 14, label: '14d' }, { value: '', label: '∞' }, ].map(opt => ( ))}
) }