"use client" import { useState, useCallback } from "react" import { Upload, ArrowRight, FileCheck, X, ShieldCheck, Clock, Loader2, } from "lucide-react" import { Button } from "@/components/ui/button" import { Card, CardContent, } from "@/components/ui/card" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { Progress } from "@/components/ui/progress" import { cn } from "@/lib/utils" const LANGUAGES = [ "English", "Spanish", "French", "German", "Italian", "Portuguese", "Chinese (Simplified)", "Chinese (Traditional)", "Japanese", "Korean", "Arabic", "Russian", "Dutch", "Swedish", "Turkish", ] type Engine = "classic" | "pro" export function TranslationCard() { const [file, setFile] = useState(null) const [isDragOver, setIsDragOver] = useState(false) const [sourceLang, setSourceLang] = useState("") const [targetLang, setTargetLang] = useState("") const [engine, setEngine] = useState("classic") const [isProcessing, setIsProcessing] = useState(false) const [progress, setProgress] = useState(0) const [currentStep, setCurrentStep] = useState("") const acceptedTypes = [ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "application/vnd.openxmlformats-officedocument.presentationml.presentation", ] const handleDragOver = useCallback((e: React.DragEvent) => { e.preventDefault() setIsDragOver(true) }, []) const handleDragLeave = useCallback((e: React.DragEvent) => { e.preventDefault() setIsDragOver(false) }, []) const handleDrop = useCallback((e: React.DragEvent) => { e.preventDefault() setIsDragOver(false) const droppedFile = e.dataTransfer.files[0] if (droppedFile) { setFile(droppedFile) } }, []) const handleFileSelect = useCallback((e: React.ChangeEvent) => { const selected = e.target.files?.[0] if (selected) { setFile(selected) } }, []) const removeFile = useCallback(() => { setFile(null) setIsProcessing(false) setProgress(0) setCurrentStep("") }, []) const handleTranslate = useCallback(() => { if (!file || !sourceLang || !targetLang) return setIsProcessing(true) setProgress(0) const steps = [ "Parsing document structure...", "Extracting translatable content...", "Processing... 3/15 slides", "Processing... 7/15 slides", "Processing... 11/15 slides", "Processing... 14/15 slides", "Rebuilding document formatting...", "Finalizing output...", ] let stepIndex = 0 setCurrentStep(steps[0]) const interval = setInterval(() => { stepIndex++ if (stepIndex < steps.length) { setCurrentStep(steps[stepIndex]) setProgress(Math.round(((stepIndex + 1) / steps.length) * 100)) } else { clearInterval(interval) setCurrentStep("Complete!") setProgress(100) setTimeout(() => { setIsProcessing(false) setProgress(0) setCurrentStep("") }, 2000) } }, 1200) }, [file, sourceLang, targetLang]) const fileExtension = file?.name.split(".").pop()?.toLowerCase() return (
{/* Drop Zone */}
{file ? (
{file.name} {(file.size / 1024).toFixed(1)} KB · .{fileExtension}
) : ( <>

Drag & drop your .xlsx, .docx, or .pptx file here

or click to browse

)}
{/* Language Selectors */}
{/* Engine Toggle */}
{/* Translate Button */} {/* Progress Bar */} {isProcessing && (
{currentStep} {progress}%
)}
{/* Trust Badge */}
Privacy First: Zero Data Retention
Files deleted after 60 min
) }