feat: add storage status checks and verification conditions in UserDetailModal

This commit is contained in:
seaznCode 2026-01-19 23:31:06 +01:00
parent 352aba4c88
commit 11d0b546be
2 changed files with 40 additions and 3 deletions

View File

@ -53,6 +53,21 @@ export default function UserDetailModal({ isOpen, onClose, userId, onUserUpdated
gdpr: { loading: false, html: null as string | null, error: null as string | null, warning: null as string | null }, gdpr: { loading: false, html: null as string | null, error: null as string | null, warning: null as string | null },
}) })
const missingIdOrContract = !!userDetails?.userStatus && (
userDetails.userStatus.documents_uploaded !== 1 ||
userDetails.userStatus.contract_signed !== 1
)
const storageMissing = !!userDetails?.storageStatus && (
userDetails.storageStatus.idDocumentsPresent === false ||
userDetails.storageStatus.contractPresent === false
)
const canVerifyByStatus = !!(userDetails?.userStatus
&& userDetails.userStatus.email_verified === 1
&& userDetails.userStatus.profile_completed === 1
&& userDetails.userStatus.documents_uploaded === 1
&& userDetails.userStatus.contract_signed === 1)
const canVerify = storageMissing ? (canVerifyByStatus && !storageMissing) : canVerifyByStatus
useEffect(() => { useEffect(() => {
if (isOpen && userId && token) { if (isOpen && userId && token) {
fetchUserDetails() fetchUserDetails()
@ -320,6 +335,24 @@ export default function UserDetailModal({ isOpen, onClose, userId, onUserUpdated
Admin Controls Admin Controls
</h3> </h3>
{missingIdOrContract && (
<div className="rounded-md border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-800 mb-4">
ID documents or a signed contract are missing for this user. The users verification status should be checked.
</div>
)}
{storageMissing && (
<div className="rounded-md border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-800 mb-4">
ID documents or a signed contract are missing from object storage. The users verification status should be checked.
</div>
)}
{missingIdOrContract && (
<div className="rounded-md border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-800 mb-4">
ID documents or a signed contract are missing for this user. The users verification status should be checked.
</div>
)}
<div className="grid grid-cols-1 md:grid-cols-2 gap-4"> <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
{/* Status Dropdown */} {/* Status Dropdown */}
<div> <div>
@ -380,7 +413,7 @@ export default function UserDetailModal({ isOpen, onClose, userId, onUserUpdated
</label> </label>
{userDetails?.userStatus && ( {userDetails?.userStatus && (
<p className="text-xs text-gray-500 mb-2"> <p className="text-xs text-gray-500 mb-2">
{userDetails.userStatus.email_verified === 1 && userDetails.userStatus.profile_completed === 1 && userDetails.userStatus.documents_uploaded === 1 && userDetails.userStatus.contract_signed === 1 {canVerify
? 'All steps completed. You can verify this user.' ? 'All steps completed. You can verify this user.'
: 'User has not yet completed all required steps.'} : 'User has not yet completed all required steps.'}
</p> </p>
@ -388,8 +421,8 @@ export default function UserDetailModal({ isOpen, onClose, userId, onUserUpdated
<button <button
type="button" type="button"
onClick={handleToggleAdminVerification} onClick={handleToggleAdminVerification}
disabled={saving || !(userDetails?.userStatus && userDetails.userStatus.email_verified === 1 && userDetails.userStatus.profile_completed === 1 && userDetails.userStatus.documents_uploaded === 1 && userDetails.userStatus.contract_signed === 1)} disabled={saving || !canVerify}
title={!(userDetails?.userStatus && userDetails.userStatus.email_verified === 1 && userDetails.userStatus.profile_completed === 1 && userDetails.userStatus.documents_uploaded === 1 && userDetails.userStatus.contract_signed === 1) ? 'Complete all steps before admin verification' : undefined} title={!canVerify ? 'Complete all steps and ensure files are present in object storage before admin verification' : undefined}
className={`w-full inline-flex items-center justify-center gap-2 rounded-lg px-4 py-2.5 text-sm font-semibold shadow-sm focus-visible:outline focus-visible:outline-offset-2 disabled:opacity-50 disabled:cursor-not-allowed ${ className={`w-full inline-flex items-center justify-center gap-2 rounded-lg px-4 py-2.5 text-sm font-semibold shadow-sm focus-visible:outline focus-visible:outline-offset-2 disabled:opacity-50 disabled:cursor-not-allowed ${
userDetails.userStatus?.is_admin_verified === 1 userDetails.userStatus?.is_admin_verified === 1
? 'bg-amber-600 hover:bg-amber-500 text-white focus-visible:outline-amber-600' ? 'bg-amber-600 hover:bg-amber-500 text-white focus-visible:outline-amber-600'

View File

@ -571,6 +571,10 @@ export interface DetailedUserInfo {
backUrl?: string backUrl?: string
uploaded_at: string uploaded_at: string
}> }>
storageStatus?: {
idDocumentsPresent?: boolean
contractPresent?: boolean
}
} }
export interface ApiResponse<T = any> { export interface ApiResponse<T = any> {