import { createSignal, Show, For } from 'solid-js' import { Button } from '../../_shared/Button' import { Icon } from '../../_shared/Icon' import { SearchResultItem } from './SearchResultItem' import { apiClient } from '../../../utils/apiClient' import type { Shout } from '../../../graphql/schema/core.gen' import { useLocalize } from '../../../context/localize' import styles from './SearchModal.module.scss' // @@TODO handle empty article options after backend support (subtitle, cover, etc.) // @@TODO implement load more // @@TODO implement FILTERS & TOPICS const getSearchCoincidences = ({ str, intersection }: { str: string; intersection: string }) => `${str.replace( new RegExp(intersection, 'gi'), (casePreservedMatch) => `${casePreservedMatch}`, )}` const prepareSearchResults = (list, searchValue) => list.map((article, index) => ({ ...article, body: '', cover: '', createdAt: '', id: index, slug: article.slug, authors: [], topics: [], title: article.title ? getSearchCoincidences({ str: article.title, intersection: searchValue, }) : '', subtitle: article.subtitle ? getSearchCoincidences({ str: article.subtitle, intersection: searchValue, }) : '', })) export const SearchModal = () => { const { t } = useLocalize() const [inputValue, setInputValue] = createSignal('') const [searchResultsList, setSearchResultsList] = createSignal<[] | null>([]) const [isLoading, setIsLoading] = createSignal(false) // const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) const handleSearch = async () => { const searchValue = inputValue() || '' if (Boolean(searchValue) && searchValue.length > 2) { setIsLoading(true) try { const response = await apiClient.getSearchResults(searchValue) const searchResult = await response.json() if (searchResult.length > 0) { const preparedSearchResultsList = prepareSearchResults(searchResult, searchValue) setSearchResultsList(preparedSearchResultsList) } else { setSearchResultsList(null) } } catch (error) { console.log('search request failed', error) } finally { setIsLoading(false) } } } return (