import React, { useEffect, useMemo, useState } from 'react' import Modal from '../../ui/Modal' function SearchResultList({ items, loading, selectedId, onSelect }) { if (loading) { return
Searching group challenges…
} if (!Array.isArray(items) || items.length === 0) { return
Search by challenge title, slug, or group name to link a primary challenge.
} return (
{items.map((item) => ( ))}
) } export default function WorldLinkedChallengePickerModal({ open, onClose, onSave, initialChallenge, searchEntities }) { const [query, setQuery] = useState('') const [results, setResults] = useState([]) const [loading, setLoading] = useState(false) const [selected, setSelected] = useState(initialChallenge || null) useEffect(() => { if (!open) return setQuery(initialChallenge?.title || '') setSelected(initialChallenge || null) setResults([]) setLoading(false) }, [open, initialChallenge]) useEffect(() => { if (!open) { setResults([]) setLoading(false) return undefined } let cancelled = false const timeoutId = window.setTimeout(async () => { setLoading(true) try { const items = await searchEntities('challenge', 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}
) }