diff --git a/src/components/Feed/ArticleCard/ArticleCard.tsx b/src/components/Feed/ArticleCard/ArticleCard.tsx index a6a9939d..d2c15c13 100644 --- a/src/components/Feed/ArticleCard/ArticleCard.tsx +++ b/src/components/Feed/ArticleCard/ArticleCard.tsx @@ -2,6 +2,7 @@ import type { Author, Shout, Topic } from '../../../graphql/schema/core.gen' import { getPagePath, openPage } from '@nanostores/router' import { clsx } from 'clsx' +import { createMemo, createSignal, For, Show } from 'solid-js' import { useLocalize } from '../../../context/localize' import { useSession } from '../../../context/session' diff --git a/src/components/Nav/Header/Header.tsx b/src/components/Nav/Header/Header.tsx index 0b6a75ee..fb597f05 100644 --- a/src/components/Nav/Header/Header.tsx +++ b/src/components/Nav/Header/Header.tsx @@ -4,8 +4,6 @@ import { getPagePath, redirectPage } from '@nanostores/router' import { clsx } from 'clsx' import { Show, createSignal, createEffect, onMount, onCleanup, For } from 'solid-js' -import { apiClient } from '../../../utils/apiClient' - import { useLocalize } from '../../../context/localize' import { useSession } from '../../../context/session' import { apiClient } from '../../../graphql/client/core' @@ -22,7 +20,6 @@ import { HeaderAuth } from '../HeaderAuth' import { Modal } from '../Modal' import { SearchModal } from '../SearchModal/SearchModal' import { Snackbar } from '../Snackbar' -import { SearchModal } from '../SearchModal/SearchModal' import { Link } from './Link' diff --git a/src/components/Nav/HeaderAuth.tsx b/src/components/Nav/HeaderAuth.tsx index fb8ee22a..d8ca5f6b 100644 --- a/src/components/Nav/HeaderAuth.tsx +++ b/src/components/Nav/HeaderAuth.tsx @@ -128,7 +128,7 @@ export const HeaderAuth = (props: Props) => {
- + diff --git a/src/components/Nav/SearchModal/SearchModal.tsx b/src/components/Nav/SearchModal/SearchModal.tsx index 85176702..781dea50 100644 --- a/src/components/Nav/SearchModal/SearchModal.tsx +++ b/src/components/Nav/SearchModal/SearchModal.tsx @@ -1,6 +1,6 @@ import type { Shout } from '../../../graphql/schema/core.gen' -import { createResource, createSignal, For, Show } from 'solid-js' +import { createEffect, createResource, createSignal, For, onCleanup, Show } from 'solid-js' import { debounce } from 'throttle-debounce' import { useLocalize } from '../../../context/localize' @@ -55,6 +55,7 @@ export const SearchModal = () => { const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) const [inputValue, setInputValue] = createSignal('') const [isLoading, setIsLoading] = createSignal(false) + const [offset, setOffset] = createSignal(0) const [searchResultsList, { refetch: loadSearchResults, mutate: setSearchResultsList }] = createResource< Shout[] >( @@ -63,8 +64,10 @@ export const SearchModal = () => { const { hasMore, newShouts } = await loadShoutsSearch({ limit: FEED_PAGE_SIZE, text: inputValue(), - offset: searchResultsList().length, + offset: offset(), }) + setIsLoading(false) + setOffset(newShouts.length) setIsLoadMoreButtonVisible(hasMore) return newShouts }, @@ -76,13 +79,33 @@ export const SearchModal = () => { let searchEl: HTMLInputElement const debouncedLoadMore = debounce(500, loadSearchResults) - const handleQueryInput = () => { - const inp = searchEl.value - setInputValue(inp) - if (inp?.length > 2) debouncedLoadMore() - else setSearchResultsList([]) + + const handleQueryInput = async () => { + setInputValue(searchEl.value) + if (searchEl.value?.length > 2) { + await debouncedLoadMore() + } else { + setIsLoading(false) + setSearchResultsList([]) + } } + const enterQuery = async (ev: KeyboardEvent) => { + setIsLoading(true) + if (ev.key === 'Enter' && inputValue().length > 2) { + await debouncedLoadMore() + } else { + setIsLoading(false) + setSearchResultsList([]) + } + } + + // Cleanup the debounce timer when the component unmounts + onCleanup(() => { + debouncedLoadMore.cancel() + console.log('cleanup search') + }) + return (
{ placeholder={t('Site search')} class={styles.searchInput} onInput={handleQueryInput} - onChange={debouncedLoadMore} + onKeyDown={enterQuery} ref={searchEl} />