import React from 'react' import { adminApi } from '../../api/client' import Modal from '../../components/shared/Modal' import CustomSelect from '../../components/shared/CustomSelect' import { CheckCircle, ArrowUpCircle, ExternalLink, RefreshCw, AlertTriangle, Fingerprint, Eye, EyeOff } from 'lucide-react' import type { TranslationFn } from '../../types' import type { useAdmin } from './useAdmin' interface AdminUserModalsProps { admin: ReturnType t: TranslationFn } // The admin page's modal layer: create-user, edit-user, the "how to update" // popup and the rotate-JWT confirmation. Pure layout around the useAdmin hook. export default function AdminUserModals({ admin, t }: AdminUserModalsProps): React.ReactElement { const { logout, navigate, toast, editingUser, setEditingUser, editForm, setEditForm, showCreateUser, setShowCreateUser, createForm, setCreateForm, updateInfo, showUpdateModal, setShowUpdateModal, showRotateJwtModal, setShowRotateJwtModal, rotatingJwt, setRotatingJwt, handleCreateUser, handleSaveUser, } = admin const [showCreatePw, setShowCreatePw] = React.useState(false) const [showEditPw, setShowEditPw] = React.useState(false) return ( <> {/* Create user modal */} setShowCreateUser(false)} title={t('admin.createUser')} size="sm" footer={
} >
setCreateForm(f => ({ ...f, username: e.target.value }))} placeholder={t('settings.username')} className="w-full px-3 py-2.5 border border-slate-300 rounded-lg text-slate-900 focus:ring-2 focus:ring-slate-400 focus:border-transparent text-sm" />
setCreateForm(f => ({ ...f, email: e.target.value }))} placeholder={t('common.email')} className="w-full px-3 py-2.5 border border-slate-300 rounded-lg text-slate-900 focus:ring-2 focus:ring-slate-400 focus:border-transparent text-sm" />
setCreateForm(f => ({ ...f, password: e.target.value }))} placeholder={t('common.password')} className="w-full px-3 py-2.5 pr-10 border border-slate-300 rounded-lg text-slate-900 focus:ring-2 focus:ring-slate-400 focus:border-transparent text-sm" />
setCreateForm(f => ({ ...f, role: String(value) }))} options={[ { value: 'user', label: t('settings.roleUser') }, { value: 'admin', label: t('settings.roleAdmin') }, ]} />
{/* Edit user modal */} setEditingUser(null)} title={t('admin.editUser')} size="sm" footer={
} > {editingUser && (
setEditForm(f => ({ ...f, username: e.target.value }))} className="w-full px-3 py-2.5 border border-slate-300 rounded-lg text-slate-900 focus:ring-2 focus:ring-slate-400 focus:border-transparent text-sm" />
setEditForm(f => ({ ...f, email: e.target.value }))} className="w-full px-3 py-2.5 border border-slate-300 rounded-lg text-slate-900 focus:ring-2 focus:ring-slate-400 focus:border-transparent text-sm" />
setEditForm(f => ({ ...f, password: e.target.value }))} placeholder={t('admin.newPasswordPlaceholder')} className="w-full px-3 py-2.5 pr-10 border border-slate-300 rounded-lg text-slate-900 focus:ring-2 focus:ring-slate-400 focus:border-transparent text-sm" />
setEditForm(f => ({ ...f, role: String(value) }))} options={[ { value: 'user', label: t('settings.roleUser') }, { value: 'admin', label: t('settings.roleAdmin') }, ]} />

{t('admin.passkey.resetHint')}

)}
{/* Update instructions popup */} {showUpdateModal && (
setShowUpdateModal(false)} >
e.stopPropagation()} style={{ width: '100%', maxWidth: 440, borderRadius: 16, overflow: 'hidden' }} className="bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700" >

{t('admin.update.howTo')}

v{updateInfo?.current} → v{updateInfo?.latest}

{t('admin.update.dockerText').replace('{version}', `v${updateInfo?.latest ?? ''}`)}

{`docker pull mauriceboe/trek:latest docker stop trek && docker rm trek docker run -d --name trek \\ -p 3000:3000 \\ -v /opt/trek/data:/app/data \\ -v /opt/trek/uploads:/app/uploads \\ --restart unless-stopped \\ mauriceboe/trek:latest`}
{t('admin.update.dataInfo')}
{updateInfo?.release_url && (
)}
)} {/* Rotate JWT Secret confirmation modal */} setShowRotateJwtModal(false)} title="Rotate JWT Secret" size="sm" footer={
} >

Warning, this will invalidate all sessions and log you out.

A new JWT secret will be generated immediately. Every logged-in user — including you — will be signed out and will need to log in again.

) }