import React, { useState, useEffect, useRef } from 'react'; import { Search, X, Loader2, PlayCircle, Download } from 'lucide-react'; import { Course } from '../types'; import { getCourses } from '../services/db'; import { CourseCoverImage } from './CourseCoverImage'; interface SearchModalProps { isOpen: boolean; onClose: () => void; onPlay: (course: Course) => void; } export const SearchModal: React.FC = ({ isOpen, onClose, onPlay }) => { const [query, setQuery] = useState(''); const [allCourses, setAllCourses] = useState([]); const [results, setResults] = useState([]); const [loading, setLoading] = useState(true); const inputRef = useRef(null); // Load courses on mount useEffect(() => { const loadData = async () => { const courses = await getCourses(); setAllCourses(courses); setLoading(false); }; loadData(); }, []); // Focus input when opened useEffect(() => { if (isOpen) { setTimeout(() => { inputRef.current?.focus(); }, 100); document.body.style.overflow = 'hidden'; } else { document.body.style.overflow = 'unset'; } return () => { document.body.style.overflow = 'unset'; }; }, [isOpen]); // Filter logic across Title, Category, Instructor and Materials useEffect(() => { if (!query.trim()) { setResults([]); return; } const lowerQuery = query.toLowerCase(); const filtered = allCourses.filter(c => { const matchesTitle = c.title.toLowerCase().includes(lowerQuery); const matchesCat = c.category.toLowerCase().includes(lowerQuery); const matchesInstructor = c.instructor?.toLowerCase().includes(lowerQuery); const matchesLessons = c.lessons.some(l => l.title.toLowerCase().includes(lowerQuery)); const matchesAttachments = c.attachments?.some(a => a.name.toLowerCase().includes(lowerQuery)); return matchesTitle || matchesCat || matchesInstructor || matchesLessons || matchesAttachments; }); setResults(filtered); }, [query, allCourses]); const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Escape') onClose(); }; if (!isOpen) return null; return (
{/* Header / Search Input */}
setQuery(e.target.value)} onKeyDown={handleKeyDown} placeholder="Buscar por cursos, aulas, instrutor ou materiais..." className="w-full bg-transparent font-display text-2xl md:text-heading font-bold text-white placeholder:text-gray-600 focus:outline-none tracking-heading leading-heading" />
{/* Results Area */}
{loading ? (
) : ( <> {!query && (

Digite um termo para pesquisar cursos ou arquivos

Ex: Meta Ads, ROAS, Planilha, Criativos, Funil

)} {query && results.length === 0 && (

Nenhum curso ou material encontrado para "{query}"

)} {results.length > 0 && (

{results.length} Curso{results.length !== 1 ? 's' : ''} Encontrado{results.length !== 1 ? 's' : ''}

{results.map(course => { const matCount = (course.attachments?.length || 0) + course.lessons.reduce((acc, l) => acc + (l.attachments?.length || 0), 0); return (
{ onPlay(course); onClose(); }} className="cursor-pointer group bg-zinc-900/60 rounded-[8px] p-3 border border-white/5 hover:border-orange-500/40 transition-all duration-300 shadow-xl" >
{matCount > 0 && (
{matCount}
)}

{course.title}

{course.category} {course.duration}
); })}
)} )}
); };