import React, { useEffect, useMemo, useState } from 'react' import Modal from '../../ui/Modal' function SearchResultList({ items, loading, selectedId, onSelect }) { if (loading) { return
Searching recap articles…
} if (!Array.isArray(items) || items.length === 0) { return
Search published news by title, slug, or category to link a recap article.
} return (
{items.map((item) => ( ))}
) } export default function WorldRecapArticlePickerModal({ open, onClose, onSave, initialArticle, searchEntities }) { const [query, setQuery] = useState('') const [results, setResults] = useState([]) const [loading, setLoading] = useState(false) const [selected, setSelected] = useState(initialArticle || null) useEffect(() => { if (!open) return setQuery(initialArticle?.title || '') setSelected(initialArticle || null) setResults([]) setLoading(false) }, [open, initialArticle]) useEffect(() => { if (!open) { setResults([]) setLoading(false) return undefined } let cancelled = false const timeoutId = window.setTimeout(async () => { setLoading(true) try { const items = await searchEntities('news', query || '') if (!cancelled) { setResults(Array.isArray(items) ? items : []) } } finally { if (!cancelled) { setLoading(false) } } }, query ? 220 : 0) return () => { cancelled = true window.clearTimeout(timeoutId) } }, [open, query, searchEntities]) const selectedPreview = useMemo(() => selected || null, [selected]) const footer = ( <> ) return (
{ setSelected(item) setQuery(item.title) }} /> {selectedPreview ? (
Selected: {selectedPreview.title}
{selectedPreview.subtitle ?
{selectedPreview.subtitle}
: null} {Array.isArray(selectedPreview.meta) && selectedPreview.meta.length > 0 ?
{selectedPreview.meta.map((entry) => {entry})}
: null}
) : null}
) }