import React, { useState, useRef, useEffect } from "react"; import { useDebounce } from "../../../hooks/useDebounce"; import { useInfiniteScroll } from "../../../hooks/useInfiniteScroll"; import { useWikimedia } from "../../../hooks/useWikimedia"; import { useGenerator } from "../../../context/GeneratorContext"; import { SearchBar, ImageCard, ImageGrid, ImageList, ImageSkeleton, EmptyState, ErrorMessage, } from "../../shared"; import { initialsAvatar } from "../../../utils/helpers"; const PROVIDER_ID = "wikimedia"; export default function WikimediaGallery() { const [query, setQuery] = useState(""); const debouncedQuery = useDebounce(query, 500); const { viewMode, itemsPerPage, loadMoreMode, getFilters, selectAll, setPreviewImageList } = useGenerator(); const filters = getFilters(PROVIDER_ID); const hasMoreRef = useRef(true); const loadingRef = useRef(false); const { page, loadMore, resetPage, observerTarget } = useInfiniteScroll(1, { hasMoreRef, loadingRef, }); const { images, loading, scrollLoading, error, hasMore } = useWikimedia( debouncedQuery, page, filters, itemsPerPage ); useEffect(() => { hasMoreRef.current = loadMoreMode === "auto" ? hasMore : false; loadingRef.current = scrollLoading; }, [hasMore, scrollLoading, loadMoreMode]); useEffect(() => { resetPage(1); }, [itemsPerPage, filters.mediaType, filters.sort, resetPage]); useEffect(() => { const handleBulkSelect = (e) => { if (e.detail.providerId === PROVIDER_ID && images.length > 0) { const imageData = {}; images.forEach((img) => { const key = `${PROVIDER_ID}:${img.id}`; imageData[key] = { importUrl: img.url, imageSrc: img.thumbnail || img.url, imageAlt: img.title || img.description || "Wikimedia image", author: { url: img.page_url, avatar: initialsAvatar(img.author || "Wikimedia"), name: img.author || "Wikimedia contributor", }, previewUrl: img.page_url, }; }); selectAll(PROVIDER_ID, images.map((img) => String(img.id)), imageData); } }; window.addEventListener("bulkSelectAll", handleBulkSelect); return () => window.removeEventListener("bulkSelectAll", handleBulkSelect); }, [images, selectAll]); useEffect(() => { if (images.length > 0) { const list = images.map((img, idx) => ({ imageSrc: img.url, imageAlt: img.title || img.description || "Wikimedia image", previewUrl: img.page_url, author: { url: img.page_url, avatar: initialsAvatar(img.author || "Wikimedia"), name: img.author || "Wikimedia contributor", }, importUrl: img.url, downloadOptions: [ { label: "Original", type: "original", url: img.url }, { label: "Preview", type: "preview", url: img.thumbnail }, ].filter((o) => o.url), providerId: PROVIDER_ID, imageId: String(img.id), providerBadge: "Wikimedia", index: idx, })); setPreviewImageList(list); } }, [images, setPreviewImageList]); const handleSearchChange = (value) => { setQuery(value); resetPage(1); }; const isEmpty = !loading && !error && images.length === 0; return (
0} /> {loading ? ( ) : isEmpty ? ( ) : viewMode === "list" ? ( {images.map((image, index) => ( o.url)} variant="list" providerBadge="Wikimedia" /> ))} ) : ( {images.map((image, index) => ( o.url)} providerBadge="Wikimedia" /> ))} )} {loadMoreMode === "auto" && ); }