'use client'; import React, { useState, useEffect } from 'react' import { useAuth } from '@/components/providers/MockAuthProvider' import { useLanguage } from '@/components/providers/LanguageProvider' import { useRouter } from 'next/navigation' import { Upload, Image as ImageIcon, CheckCircle, XCircle, AlertCircle, Eye, LogOut, Languages, ArrowLeft } from 'lucide-react' import Link from 'next/link' interface AccessibilityAudit { id: string altText: string wcagScore: number issues: string[] suggestions: string[] } export default function AccessibilityPage() { const { user, userProfile, logout } = useAuth() const { t, language, setLanguage } = useLanguage() const router = useRouter() const [selectedFile, setSelectedFile] = useState(null) const [preview, setPreview] = useState(null) const [audit, setAudit] = useState(null) const [isAnalyzing, setIsAnalyzing] = useState(false) const [recentAudits, setRecentAudits] = useState([]) useEffect(() => { if (!user) { router.push('/') } }, [user, router]) useEffect(() => { fetchRecentAudits() }, []) const fetchRecentAudits = async () => { try { const response = await fetch('/api/accessibility') if (response.ok) { const data = await response.json() setRecentAudits(data.audits || []) } } catch (error) { console.error('Error fetching audits:', error) } } const handleFileSelect = (event: React.ChangeEvent) => { const file = event.target.files?.[0] if (file) { setSelectedFile(file) // Create preview const reader = new FileReader() reader.onload = (e) => { setPreview(e.target?.result as string) } reader.readAsDataURL(file) } } const handleAnalyze = async () => { if (!selectedFile) return setIsAnalyzing(true) try { const formData = new FormData() formData.append('file', selectedFile) const response = await fetch('/api/accessibility', { method: 'POST', body: formData, }) if (response.ok) { const data = await response.json() setAudit(data.audit) fetchRecentAudits() } else { console.error('Failed to analyze image') } } catch (error) { console.error('Error analyzing image:', error) } finally { setIsAnalyzing(false) } } const handleLogout = async () => { await logout() } const toggleLanguage = () => { setLanguage(language === 'en' ? 'ar' : 'en') } const getScoreColor = (score: number) => { if (score >= 0.9) return 'text-green-600' if (score >= 0.7) return 'text-yellow-600' return 'text-red-600' } const getScoreBackground = (score: number) => { if (score >= 0.9) return 'bg-green-50 border-green-200' if (score >= 0.7) return 'bg-yellow-50 border-yellow-200' return 'bg-red-50 border-red-200' } if (!user || !userProfile) { return (

Loading accessibility tools...

) } return (
{/* Header */}
Back to Dashboard
|

{t('accessibility')} Tools

{userProfile.name.charAt(0)}

{userProfile.name}

{userProfile.role}

{/* Main Content */}
{/* Upload Section */}

Image Accessibility Analyzer

Upload an image to automatically generate alt text and check WCAG 2.2 compliance. Our AI-powered tool helps ensure your content is accessible to everyone.

{/* Upload Area */}
{selectedFile && (

Selected: {selectedFile.name}

)}
{/* Preview */} {preview && (

Image Preview

{/* eslint-disable-next-line @next/next/no-img-element */} Preview
)}
{/* Analysis Results */} {audit && (

Analysis Results

{/* Alt Text */}

{t('alt_text_suggestion')}

{audit.altText}

{/* WCAG Score */}

{t('wcag_score')}

{Math.round(audit.wcagScore * 100)}% {audit.wcagScore >= 0.9 ? ( ) : audit.wcagScore >= 0.7 ? ( ) : ( )}
{/* Issues and Suggestions */}
{audit.issues.length > 0 && (

Issues Found

    {audit.issues.map((issue, index) => (
  • {issue}
  • ))}
)} {audit.suggestions.length > 0 && (

Suggestions

    {audit.suggestions.map((suggestion, index) => (
  • {suggestion}
  • ))}
)}
)} {/* Recent Audits */} {recentAudits.length > 0 && (

Recent Audits

{recentAudits.slice(0, 5).map((recentAudit, index) => (

{recentAudit.altText.substring(0, 50)}...

Score: {Math.round(recentAudit.wcagScore * 100)}%

View Details
))}
)} {/* Guidelines */}

Accessibility Guidelines

Alt Text Best Practices

  • • Be concise but descriptive
  • • Focus on important details
  • • Avoid redundant phrases like "image of"
  • • Keep under 125 characters when possible

WCAG 2.2 Compliance

  • • Color contrast ratio of 4.5:1 minimum
  • • Keyboard navigation support
  • • Screen reader compatibility
  • • Clear focus indicators
) }