import type { Shout } from '../../../graphql/schema/core.gen' import { createSignal, Show, For } from 'solid-js' import { useLocalize } from '../../../context/localize' import { Button } from '../../_shared/Button' import { Icon } from '../../_shared/Icon' import { FEED_PAGE_SIZE } from '../../Views/Feed/Feed' import { SearchResultItem } from './SearchResultItem' import styles from './SearchModal.module.scss' import { restoreScrollPosition, saveScrollPosition } from '../../../utils/scroll' import { loadShoutsSearch, useArticlesStore } from '../../../stores/zine/articles' import { byScore } from '../../../utils/sortby' // @@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.replaceAll( 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 { sortedArticles } = useArticlesStore() const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) const [offset, setOffset] = createSignal(0) const [inputValue, setInputValue] = createSignal('') //const [searchResultsList, setSearchResultsList] = createSignal<[] | null>([]) const [isLoading, setIsLoading] = createSignal(false) // const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) let searchEl: HTMLInputElement const handleQueryChange = async (_ev) => { setInputValue(searchEl.value) if (inputValue() && inputValue().length > 2) await loadMore() } const loadMore = async () => { setIsLoading(true) saveScrollPosition() if (inputValue() && inputValue().length > 2) { console.log(inputValue()) const { hasMore } = await loadShoutsSearch({ text: inputValue(), offset: offset(), limit: FEED_PAGE_SIZE, }) setIsLoadMoreButtonVisible(hasMore) setOffset(offset() + FEED_PAGE_SIZE) } else { console.warn('[SaerchView] no query found') } restoreScrollPosition() setIsLoading(false) } return (