import React, { useState, useEffect, useRef } from 'react'; import { Search } from 'lucide-react'; import { searchOrgCourses } from '@services/courses/courses'; import { useLHSession } from '@components/Contexts/LHSessionContext'; import Link from 'next/link'; import { getCourseThumbnailMediaDirectory } from '@services/media/media'; import { useDebounce } from '@/hooks/useDebounce'; import { useOrg } from '@components/Contexts/OrgContext'; import { getUriWithOrg } from '@services/config/config'; import { removeCoursePrefix } from '../Thumbnails/CourseThumbnail'; interface Course { name: string; description: string; thumbnail_image: string; course_uuid: string; authors: Array<{ first_name: string; last_name: string; avatar_image: string; }>; } interface SearchBarProps { orgslug: string; className?: string; isMobile?: boolean; } export const SearchBar: React.FC = ({ orgslug, className = '', isMobile = false }) => { const org = useOrg() as any; const [searchQuery, setSearchQuery] = useState(''); const [courses, setCourses] = useState([]); const [isLoading, setIsLoading] = useState(false); const [showResults, setShowResults] = useState(false); const searchRef = useRef(null); const session = useLHSession() as any; const debouncedSearchFunction = useDebounce(async (query: string) => { if (query.trim().length === 0) { setCourses([]); return; } setIsLoading(true); try { const results = await searchOrgCourses( orgslug, query, 1, 5, null, session?.data?.tokens?.access_token ); setCourses(results); } catch (error) { console.error('Error searching courses:', error); setCourses([]); } setIsLoading(false); }, 300); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (searchRef.current && !searchRef.current.contains(event.target as Node)) { setShowResults(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, []); useEffect(() => { debouncedSearchFunction(searchQuery); }, [searchQuery, debouncedSearchFunction]); const handleSearchFocus = () => { if (searchQuery.trim().length > 0) { setShowResults(true); } }; return (
{ setSearchQuery(e.target.value); setShowResults(true); }} onFocus={handleSearchFocus} placeholder="Search courses..." className="w-full h-9 pl-10 pr-4 rounded-lg border border-gray-200 bg-white/50 focus:outline-hidden focus:ring-2 focus:ring-gray-200 focus:border-transparent text-sm placeholder:text-gray-400" />
{showResults && (searchQuery.trim().length > 0 || isLoading) && (
{isLoading ? (
Searching...
) : courses.length > 0 ? (
{courses.map((course) => ( setShowResults(false)} >
{course.thumbnail_image && ( {course.name} )}

{course.name}

{course.description}

{course.authors && course.authors[0] && (

by {course.authors[0].first_name} {course.authors[0].last_name}

)}
))}
) : (
No courses found
)}
)}
); };