"use client"; import { useState } from "react"; import { createBrowserClient } from "@supabase/ssr"; import { toast } from "sonner"; import { FileDown, Upload, X, Loader2 } from "lucide-react"; interface FileUploadProps { lessonId: string; currentFileUrl?: string | null; onUploadComplete: (url: string) => void; onRemove?: () => void; accept?: string; label?: string; } const ALLOWED_MIMES = [ "application/pdf", "application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "application/vnd.openxmlformats-officedocument.presentationml.presentation", "text/plain" ].join(","); export default function FileUpload({ lessonId, currentFileUrl, onUploadComplete, onRemove, accept = ALLOWED_MIMES, label = "Documento / Material" }: FileUploadProps) { const [uploading, setUploading] = useState(false); const handleFileUpload = async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; setUploading(true); const supabase = createBrowserClient( process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY! ); // 1. Verify session const { data: { user }, error: authError } = await supabase.auth.getUser(); if (authError || !user) { toast.error("Error de autenticación: Por favor inicia sesión de nuevo."); setUploading(false); return; } // 2. Create a unique file path: lesson_id/timestamp_filename const filePath = `${lessonId}/${Date.now()}_${file.name.replace(/\s+/g, '_')}`; // 3. Upload to Supabase Storage (assets bucket) const { error } = await supabase.storage .from("assets") .upload(filePath, file, { upsert: true, }); if (error) { console.error("Storage upload error:", error); if (error.message.includes("row-level security policy")) { toast.error("Error de permisos: El bucket 'assets' no permite subidas para profesores."); } else { toast.error("Error al subir: " + error.message); } setUploading(false); return; } // 4. Get Public URL const { data: { publicUrl } } = supabase.storage .from("assets") .getPublicUrl(filePath); onUploadComplete(publicUrl); setUploading(false); toast.success("Archivo subido con éxito"); }; const fileName = currentFileUrl ? currentFileUrl.split('/').pop() : ""; return (
{currentFileUrl ? (

{decodeURIComponent(fileName || "Archivo adjunto")}

Ver archivo actual
) : (
{uploading ? ( ) : ( )}

{uploading ? "Subiendo archivo..." : "Haz clic o arrastra un archivo aquí"}

Formatos permitidos: PDF, Word, PowerPoint o Texto (.txt)

Máximo 50MB

)}
); }