"use client"; import { useState, useRef } from "react"; import axios from "axios"; import { useSession } from "next-auth/react"; interface FileConverterProps { accessToken: string; } export default function FileConverter({ accessToken }: FileConverterProps) { const [files, setFiles] = useState([]); const [isUploading, setIsUploading] = useState(false); const [progress, setProgress] = useState(0); const [outputName, setOutputName] = useState("converted_document"); const fileInputRef = useRef(null); const handleFileChange = (e: React.ChangeEvent) => { if (e.target.files) { setFiles(prev => [...prev, ...Array.from(e.target.files!)]); } }; const handleDrop = (e: React.DragEvent) => { e.preventDefault(); if (e.dataTransfer.files) { setFiles(prev => [...prev, ...Array.from(e.dataTransfer.files)]); } }; const removeFile = (index: number) => { setFiles(prev => prev.filter((_, i) => i !== index)); }; const handleUpload = async () => { if (files.length === 0) return; setIsUploading(true); setProgress(10); const formData = new FormData(); formData.append("token", accessToken); formData.append("filename", outputName); files.forEach((file) => { formData.append("files", file); }); try { setProgress(30); const response = await axios.post("/py-api/convert-local-files", formData, { responseType: "blob", params: { combine: false }, // Explicitly separate onUploadProgress: (progressEvent) => { const percentCompleted = Math.round((progressEvent.loaded * 100) / (progressEvent.total || 1)); setProgress(30 + (percentCompleted * 0.6)); } }); setProgress(100); const url = window.URL.createObjectURL(new Blob([response.data])); const link = document.createElement("a"); link.href = url; link.setAttribute("download", `${outputName}.zip`); document.body.appendChild(link); link.click(); link.remove(); setTimeout(() => { setIsUploading(false); setProgress(0); }, 2000); } catch (error) { console.error("Conversion failed:", error); alert("Conversion failed. Please try again."); setIsUploading(false); setProgress(0); } }; return (

Quick Converter

fileInputRef.current?.click()} onDragOver={(e) => e.preventDefault()} onDrop={handleDrop} >

Click to upload or drag & drop

Supports DOCX, PPTX, IPYNB

{files.length > 0 && (

Selected Files ({files.length})

{files.map((file, index) => (
{file.name.endsWith('.docx') && DOC} {file.name.endsWith('.pptx') && PPT} {file.name.endsWith('.ipynb') && NB}
{file.name}
))}
setOutputName(e.target.value)} className="w-full px-4 py-2 bg-gray-50 border border-gray-200 rounded-lg focus:ring-2 focus:ring-blue-500 outline-none transition-all" placeholder="Name your file..." />
)} {isUploading && (
)}
); }