import React, { useState, useEffect, useCallback } from 'react'; import { createApi } from 'unsplash-js'; import { Search, X, Cpu, Briefcase, GraduationCap, Heart, Palette, Plane, Utensils, Dumbbell, Music, Shirt, Book, Building, Bike, Camera, Microscope, Coins, Coffee, Gamepad, Flower} from 'lucide-react'; import Modal from '@components/Objects/StyledElements/Modal/Modal'; const unsplash = createApi({ accessKey: process.env.NEXT_PUBLIC_UNSPLASH_ACCESS_KEY as string, }); const IMAGES_PER_PAGE = 20; const predefinedLabels = [ { name: 'Nature', icon: Flower }, { name: 'Technology', icon: Cpu }, { name: 'Business', icon: Briefcase }, { name: 'Education', icon: GraduationCap }, { name: 'Health', icon: Heart }, { name: 'Art', icon: Palette }, { name: 'Science', icon: Microscope }, { name: 'Travel', icon: Plane }, { name: 'Food', icon: Utensils }, { name: 'Sports', icon: Dumbbell }, { name: 'Music', icon: Music }, { name: 'Fashion', icon: Shirt }, { name: 'History', icon: Book }, { name: 'Architecture', icon: Building }, { name: 'Fitness', icon: Bike }, { name: 'Photography', icon: Camera }, { name: 'Biology', icon: Microscope }, { name: 'Finance', icon: Coins }, { name: 'Lifestyle', icon: Coffee }, { name: 'Gaming', icon: Gamepad }, ]; interface UnsplashImagePickerProps { onSelect: (imageUrl: string) => void; onClose: () => void; isOpen?: boolean; } const UnsplashImagePicker: React.FC = ({ onSelect, onClose, isOpen = true }) => { const [query, setQuery] = useState(''); const [images, setImages] = useState([]); const [page, setPage] = useState(1); const [loading, setLoading] = useState(false); const fetchImages = useCallback(async (searchQuery: string, pageNum: number) => { setLoading(true); try { const result = await unsplash.search.getPhotos({ query: searchQuery, page: pageNum, perPage: IMAGES_PER_PAGE, }); if (result && result.response) { setImages(prevImages => pageNum === 1 ? result.response.results : [...prevImages, ...result.response.results]); } } catch (error) { console.error('Error fetching images:', error); } finally { setLoading(false); } }, []); const debouncedFetchImages = useCallback( debounce((searchQuery: string) => { setPage(1); fetchImages(searchQuery, 1); }, 300), [fetchImages] ); useEffect(() => { if (query) { debouncedFetchImages(query); } }, [query, debouncedFetchImages]); const handleSearch = (e: React.ChangeEvent) => { setQuery(e.target.value); }; const handleLabelClick = (label: string) => { setQuery(label); }; const handleLoadMore = () => { const nextPage = page + 1; setPage(nextPage); fetchImages(query, nextPage); }; const handleImageSelect = (imageUrl: string) => { onSelect(imageUrl); onClose(); }; const modalContent = (
{predefinedLabels.map(label => ( ))}
{images.map(image => (
{image.alt_description} handleImageSelect(image.urls.regular)} />
))}
{loading &&

Loading...

} {!loading && images.length > 0 && ( )}
); return ( ); }; // Custom debounce function const debounce = (func: Function, delay: number) => { let timeoutId: NodeJS.Timeout; return (...args: any[]) => { clearTimeout(timeoutId); timeoutId = setTimeout(() => func(...args), delay); }; }; export default UnsplashImagePicker;