webapp/src/components/Views/Search.tsx

93 lines
2.5 KiB
TypeScript
Raw Normal View History

2022-09-22 09:37:49 +00:00
import { Show, For, createSignal } from 'solid-js'
2022-09-09 11:53:35 +00:00
import '../../styles/Search.scss'
import type { Shout } from '../../graphql/types.gen'
import { ArticleCard } from '../Feed/Card'
import { t } from '../../utils/intl'
2022-11-15 14:24:50 +00:00
import { useArticlesStore, loadShoutsBy } from '../../stores/zine/articles'
2022-11-17 06:56:24 +00:00
import { useRouter } from '../../stores/router'
2022-09-22 09:37:49 +00:00
type SearchPageSearchParams = {
by: '' | 'relevance' | 'rating'
}
2022-09-09 11:53:35 +00:00
type Props = {
2022-09-22 09:37:49 +00:00
query: string
results: Shout[]
2022-09-09 11:53:35 +00:00
}
2022-09-22 09:37:49 +00:00
export const SearchView = (props: Props) => {
2022-11-15 14:24:50 +00:00
const { sortedArticles } = useArticlesStore({ shouts: props.results })
2022-09-13 09:59:04 +00:00
const [getQuery, setQuery] = createSignal(props.query)
2022-09-09 11:53:35 +00:00
2022-11-17 06:56:24 +00:00
const { searchParams, handleClientRouteLinkClick } = useRouter<SearchPageSearchParams>()
2022-09-22 09:37:49 +00:00
2022-09-13 09:59:04 +00:00
const handleQueryChange = (ev) => {
setQuery(ev.target.value)
}
2022-09-14 15:44:06 +00:00
const handleSubmit = (_ev) => {
2022-09-13 09:59:04 +00:00
// TODO page
// TODO sort
2022-11-15 14:24:50 +00:00
loadShoutsBy({ by: { title: getQuery(), body: getQuery() }, limit: 50 })
2022-09-13 09:59:04 +00:00
}
2022-09-09 11:53:35 +00:00
return (
<div class="search-page wide-container">
<form action="/search" class="search-form row">
<div class="col-sm-9">
2022-09-13 13:38:26 +00:00
{/*FIXME t*/}
2022-09-13 09:59:04 +00:00
<input type="search" name="q" onChange={handleQueryChange} placeholder="Введите текст..." />
2022-09-09 11:53:35 +00:00
</div>
<div class="col-sm-3">
2022-09-13 09:59:04 +00:00
<button class="button" type="submit" onClick={handleSubmit}>
{t('Search')}
</button>
2022-09-09 11:53:35 +00:00
</div>
</form>
<ul class="view-switcher">
2022-09-22 09:37:49 +00:00
<li
classList={{
2022-10-25 16:25:42 +00:00
selected: searchParams().by === 'relevance'
2022-09-22 09:37:49 +00:00
}}
>
<a href="?by=relevance">{t('By relevance')}</a>
2022-09-09 11:53:35 +00:00
</li>
2022-09-22 09:37:49 +00:00
<li
classList={{
2022-10-25 16:25:42 +00:00
selected: searchParams().by === 'rating'
2022-09-22 09:37:49 +00:00
}}
>
<a href="?by=rating">{t('Top rated')}</a>
2022-09-09 11:53:35 +00:00
</li>
</ul>
2022-09-28 20:16:44 +00:00
<Show when={sortedArticles().length > 0}>
2022-09-09 11:53:35 +00:00
<h3>{t('Publications')}</h3>
<div class="floor">
<div class="row">
2022-09-28 20:16:44 +00:00
<For each={sortedArticles()}>
2022-09-09 11:53:35 +00:00
{(article) => (
<div class="col-md-3">
<ArticleCard article={article} />
</div>
)}
</For>
<div class="col-md-3">
<a href="#" class="search__show-more">
<span class="search__show-more-inner">{t('Load more')}</span>
</a>
</div>
</div>
</div>
<h3>{t('Topics')}</h3>
<h3>{t('Authors')}</h3>
</Show>
</div>
)
}