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}
)
}