feat: add storage status checks and verification conditions in UserDetailModal
This commit is contained in:
parent
352aba4c88
commit
11d0b546be
@ -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 user’s 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 user’s 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 user’s 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'
|
||||||
|
|||||||
@ -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> {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user