'use client'; import React, { useEffect, useState, useRef } from 'react'; import { useLHSession } from '@components/Contexts/LHSessionContext'; import { getUserCertificates } from '@services/courses/certifications'; import CertificatePreview from '@components/Dashboard/Pages/Course/EditCourseCertification/CertificatePreview'; import { ArrowLeft, Download } from 'lucide-react'; import Link from 'next/link'; import { getUriWithOrg } from '@services/config/config'; import html2canvas from 'html2canvas'; import jsPDF from 'jspdf'; import QRCode from 'qrcode'; interface CertificatePageProps { orgslug: string; courseid: string; qrCodeLink: string; } const CertificatePage: React.FC = ({ orgslug, courseid, qrCodeLink }) => { const session = useLHSession() as any; const [userCertificate, setUserCertificate] = useState(null); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); // Fetch user certificate useEffect(() => { const fetchCertificate = async () => { if (!session?.data?.tokens?.access_token) { setError('Authentication required to view certificate'); setIsLoading(false); return; } try { const cleanCourseId = courseid.replace('course_', ''); const result = await getUserCertificates( `course_${cleanCourseId}`, session.data.tokens.access_token ); if (result.success && result.data && result.data.length > 0) { setUserCertificate(result.data[0]); } else { setError('No certificate found for this course'); } } catch (error) { console.error('Error fetching certificate:', error); setError('Failed to load certificate. Please try again later.'); } finally { setIsLoading(false); } }; fetchCertificate(); }, [courseid, session?.data?.tokens?.access_token]); // Generate PDF using canvas const downloadCertificate = async () => { if (!userCertificate) return; try { // Create a temporary div for the certificate const certificateDiv = document.createElement('div'); certificateDiv.style.position = 'absolute'; certificateDiv.style.left = '-9999px'; certificateDiv.style.top = '0'; certificateDiv.style.width = '800px'; certificateDiv.style.height = '600px'; certificateDiv.style.background = 'white'; certificateDiv.style.padding = '40px'; certificateDiv.style.fontFamily = 'Arial, sans-serif'; certificateDiv.style.textAlign = 'center'; certificateDiv.style.display = 'flex'; certificateDiv.style.flexDirection = 'column'; certificateDiv.style.justifyContent = 'center'; certificateDiv.style.alignItems = 'center'; certificateDiv.style.position = 'relative'; certificateDiv.style.overflow = 'hidden'; // Get theme colors based on pattern const getPatternTheme = (pattern: string) => { switch (pattern) { case 'royal': return { primary: '#b45309', secondary: '#d97706', icon: '#d97706' }; case 'tech': return { primary: '#0e7490', secondary: '#0891b2', icon: '#0891b2' }; case 'nature': return { primary: '#15803d', secondary: '#16a34a', icon: '#16a34a' }; case 'geometric': return { primary: '#7c3aed', secondary: '#9333ea', icon: '#9333ea' }; case 'vintage': return { primary: '#c2410c', secondary: '#ea580c', icon: '#ea580c' }; case 'waves': return { primary: '#1d4ed8', secondary: '#2563eb', icon: '#2563eb' }; case 'minimal': return { primary: '#374151', secondary: '#4b5563', icon: '#4b5563' }; case 'professional': return { primary: '#334155', secondary: '#475569', icon: '#475569' }; case 'academic': return { primary: '#3730a3', secondary: '#4338ca', icon: '#4338ca' }; case 'modern': return { primary: '#1d4ed8', secondary: '#2563eb', icon: '#2563eb' }; default: return { primary: '#374151', secondary: '#4b5563', icon: '#4b5563' }; } }; const theme = getPatternTheme(userCertificate.certification.config.certificate_pattern); const certificateId = userCertificate.certificate_user.user_certification_uuid; const qrCodeData = qrCodeLink ; // Generate QR code const qrCodeDataUrl = await QRCode.toDataURL(qrCodeData, { width: 120, margin: 2, color: { dark: '#000000', light: '#FFFFFF' }, errorCorrectionLevel: 'M', type: 'image/png' }); // Create certificate content certificateDiv.innerHTML = `
ID: ${certificateId}
QR Code
Certificate
🏆
${userCertificate.certification.config.certification_name}
${userCertificate.certification.config.certification_description || 'This is to certify that the course has been successfully completed.'}
${userCertificate.certification.config.certification_type === 'completion' ? 'Course Completion' : userCertificate.certification.config.certification_type === 'achievement' ? 'Achievement Based' : userCertificate.certification.config.certification_type === 'assessment' ? 'Assessment Based' : userCertificate.certification.config.certification_type === 'participation' ? 'Participation' : userCertificate.certification.config.certification_type === 'mastery' ? 'Skill Mastery' : userCertificate.certification.config.certification_type === 'professional' ? 'Professional Development' : userCertificate.certification.config.certification_type === 'continuing' ? 'Continuing Education' : userCertificate.certification.config.certification_type === 'workshop' ? 'Workshop Attendance' : userCertificate.certification.config.certification_type === 'specialization' ? 'Specialization' : 'Course Completion'}
Certificate ID: ${certificateId}
Awarded: ${new Date(userCertificate.certificate_user.created_at).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' })}
${userCertificate.certification.config.certificate_instructor ? `
Instructor: ${userCertificate.certification.config.certificate_instructor}
` : '' }
This certificate can be verified at ${qrCodeData.replace('https://', '').replace('http://', '')}
`; // Add to document temporarily document.body.appendChild(certificateDiv); // Convert to canvas const canvas = await html2canvas(certificateDiv, { width: 800, height: 600, scale: 2, // Higher resolution useCORS: true, allowTaint: true, backgroundColor: '#ffffff' }); // Remove temporary div document.body.removeChild(certificateDiv); // Create PDF const imgData = canvas.toDataURL('image/png'); const pdf = new jsPDF('landscape', 'mm', 'a4'); // Calculate dimensions to center the certificate const pdfWidth = pdf.internal.pageSize.getWidth(); const pdfHeight = pdf.internal.pageSize.getHeight(); const imgWidth = 280; // mm const imgHeight = 210; // mm // Center the image const x = (pdfWidth - imgWidth) / 2; const y = (pdfHeight - imgHeight) / 2; pdf.addImage(imgData, 'PNG', x, y, imgWidth, imgHeight); // Save the PDF const fileName = `${userCertificate.certification.config.certification_name.replace(/[^a-zA-Z0-9]/g, '_')}_Certificate.pdf`; pdf.save(fileName); } catch (error) { console.error('Error generating PDF:', error); alert('Failed to generate PDF. Please try again.'); } }; if (isLoading) { return (

Loading certificate...

); } if (error) { return (

Certificate Not Available

{error}

Back to Course
); } if (!userCertificate) { return (

No Certificate Found

No certificate is available for this course. Please contact your instructor for more information.

Back to Course
); } return (
{/* Header */}
Back to Course
{/* Certificate Display */}
{/* Instructions */}

Click "Download PDF" to generate and download a high-quality certificate PDF.

The PDF includes a scannable QR code for certificate verification.

); }; export default CertificatePage;