'use client'; import React, { useEffect, useState } from 'react'; import { getCertificateByUuid } from '@services/courses/certifications'; import CertificatePreview from '@components/Dashboard/Pages/Course/EditCourseCertification/CertificatePreview'; import { Shield, CheckCircle, XCircle, AlertTriangle, ArrowLeft } from 'lucide-react'; import Link from 'next/link'; import { getUriWithOrg } from '@services/config/config'; import { useOrg } from '@components/Contexts/OrgContext'; interface CertificateVerificationPageProps { certificateUuid: string; } const CertificateVerificationPage: React.FC = ({ certificateUuid }) => { const [certificateData, setCertificateData] = useState(null); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [verificationStatus, setVerificationStatus] = useState<'valid' | 'invalid' | 'loading'>('loading'); const org = useOrg() as any; // Fetch certificate data useEffect(() => { const fetchCertificate = async () => { try { const result = await getCertificateByUuid(certificateUuid); if (result.success && result.data) { setCertificateData(result.data); setVerificationStatus('valid'); } else { setError('Certificate not found'); setVerificationStatus('invalid'); } } catch (error) { console.error('Error fetching certificate:', error); setError('Failed to verify certificate. Please try again later.'); setVerificationStatus('invalid'); } finally { setIsLoading(false); } }; fetchCertificate(); }, [certificateUuid]); const getVerificationStatusIcon = () => { switch (verificationStatus) { case 'valid': return ; case 'invalid': return ; case 'loading': return ; default: return ; } }; const getVerificationStatusText = () => { switch (verificationStatus) { case 'valid': return 'Certificate Verified'; case 'invalid': return 'Certificate Not Found'; case 'loading': return 'Verifying Certificate...'; default: return 'Verification Status Unknown'; } }; const getVerificationStatusColor = () => { switch (verificationStatus) { case 'valid': return 'text-green-600 bg-green-50 border-green-200'; case 'invalid': return 'text-red-600 bg-red-50 border-red-200'; case 'loading': return 'text-yellow-600 bg-yellow-50 border-yellow-200'; default: return 'text-yellow-600 bg-yellow-50 border-yellow-200'; } }; if (isLoading) { return (

Verifying Certificate

Please wait while we verify the certificate...

); } if (error || verificationStatus === 'invalid') { return (

Certificate Not Found

The certificate with ID {certificateUuid} could not be found in our system.

This could mean:

  • The certificate ID is incorrect
  • The certificate has been revoked
  • The certificate has expired
  • The certificate was issued by a different organization
Go Home
); } if (!certificateData) { return null; } const qrCodeLink = getUriWithOrg(org?.org_slug || '', `/certificates/${certificateData.certificate_user.user_certification_uuid}/verify`); return (
{/* Header */}

Certificate Verification

Verify the authenticity of this certificate

{getVerificationStatusIcon()} {getVerificationStatusText()}
{/* Certificate Details */}
{/* Certificate Preview */}

Certificate Preview

{/* Certificate Details */}

Certificate Information

{certificateData.certificate_user.user_certification_uuid}
{certificateData.course.name}
{certificateData.certification.config.certification_type.replace('_', ' ')}
{new Date(certificateData.certificate_user.created_at).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' })}
{certificateData.certification.config.certificate_instructor && (
{certificateData.certification.config.certificate_instructor}
)}

Security Information

  • • Certificate verified against our secure database
  • • QR code contains verification link
  • • Certificate ID is cryptographically secure
  • • Timestamp verified and authenticated
{/* Footer */}
Go Home
); }; export default CertificateVerificationPage;