'use client' import { useCallback, useEffect, useState } from 'react' import Button from '@/components/formElements/Button' import Input from '@/components/formElements/Input' import Modal from '@/components/modals/Modal' import { formatPersonName } from '@/helpers' import { formatIranianMobile } from '@/lib/formatters' import { getAdminUsers } from '@/api/generated/admin-users/admin-users' import type { AdminUserListItemDto } from '@/api/generated/models' import { unwrapApiPayload } from '@/helpers/listResponse' import { texts } from '@/texts' export interface VerifiedHostOption { id: string firstName: string | null lastName: string | null mobile: string } interface VerifiedHostPickerProps { selected: VerifiedHostOption | null onSelect: (host: VerifiedHostOption) => void } const adminUsersApi = getAdminUsers() function toHostOption(row: AdminUserListItemDto): VerifiedHostOption { return { id: row.id, firstName: row.firstName, lastName: row.lastName, mobile: row.mobile, } } async function searchVerifiedHosts(query: string): Promise { const trimmed = query.trim() const filters: Record = { userType: 'host', identityStatus: 'verified' } if (trimmed) { if (/^\d+$/.test(trimmed)) { filters.mobile = trimmed } else if (trimmed.includes(' ')) { const [first, ...rest] = trimmed.split(/\s+/) filters.firstName = first filters.lastName = rest.join(' ') } else { filters.firstName = trimmed } } const response = await adminUsersApi.adminUsersControllerList({ page: 1, pageSize: 20, sort: '-createdAt', filters, }) const payload = unwrapApiPayload<{ items?: AdminUserListItemDto[] }>(response.data) const items = Array.isArray(payload.items) ? payload.items : [] return items.map(toHostOption) } const VerifiedHostPicker = ({ selected, onSelect }: VerifiedHostPickerProps) => { const [isOpen, setIsOpen] = useState(false) const [query, setQuery] = useState('') const [results, setResults] = useState([]) const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState(null) const load = useCallback(async (nextQuery: string) => { try { setIsLoading(true) setError(null) setResults(await searchVerifiedHosts(nextQuery)) } catch { setResults([]) setError(texts.events.createEventHostSearchFailed) } finally { setIsLoading(false) } }, []) useEffect(() => { if (!isOpen) return const timer = window.setTimeout(() => { void load(query) }, 250) return () => { window.clearTimeout(timer) } }, [isOpen, load, query]) const selectedLabel = selected ? `${formatPersonName(selected.firstName, selected.lastName)} ยท ${formatIranianMobile(selected.mobile)}` : texts.events.createEventHostPickerPlaceholder return ( <> { setIsOpen(false) }} onOpenChange={setIsOpen} >
{ setQuery(typeof value === 'string' ? value : '') }} /> {error ?

{error}

: null} {isLoading ?

{texts.common.loadingList}

: null} {!isLoading && !error && results.length === 0 ? (

{texts.events.createEventHostSearchEmpty}

) : null}
    {results.map((host) => (
  • ))}
) } export default VerifiedHostPicker