search-wip, bio fix

This commit is contained in:
tonyrewin 2022-11-18 02:20:40 +03:00
parent a8247bafd6
commit e39414d975
3 changed files with 50 additions and 18 deletions

View File

@ -30,7 +30,11 @@ export const AuthorCard = (props: AuthorCardProps) => {
() => session()?.news?.authors?.some((u) => u === props.author.slug) || false () => session()?.news?.authors?.some((u) => u === props.author.slug) || false
) )
const canFollow = createMemo(() => !props.hideFollow && session()?.user?.slug !== props.author.slug) const canFollow = createMemo(() => !props.hideFollow && session()?.user?.slug !== props.author.slug)
const bio = () => props.author.bio || t('Our regular contributor') const bio = () => {
const d = document.createElement('div')
d.innerHTML = props.author.bio
return d.innerText || t('Our regular contributor')
}
const name = () => { const name = () => {
return props.author.name === 'Дискурс' && locale() !== 'ru' return props.author.name === 'Дискурс' && locale() !== 'ru'
? 'Discours' ? 'Discours'

View File

@ -4,6 +4,7 @@ import type { Shout } from '../../graphql/types.gen'
import { ArticleCard } from '../Feed/Card' import { ArticleCard } from '../Feed/Card'
import { t } from '../../utils/intl' import { t } from '../../utils/intl'
import { useArticlesStore, loadShoutsBy } from '../../stores/zine/articles' import { useArticlesStore, loadShoutsBy } from '../../stores/zine/articles'
import { restoreScrollPosition, saveScrollPosition } from '../../utils/scroll'
import { useRouter } from '../../stores/router' import { useRouter } from '../../stores/router'
type SearchPageSearchParams = { type SearchPageSearchParams = {
@ -15,31 +16,49 @@ type Props = {
results: Shout[] results: Shout[]
} }
const LOAD_MORE_PAGE_SIZE = 50
export const SearchView = (props: Props) => { export const SearchView = (props: Props) => {
const { sortedArticles } = useArticlesStore({ shouts: props.results }) const { sortedArticles } = useArticlesStore({ shouts: props.results })
const [getQuery, setQuery] = createSignal(props.query) const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false)
const [query, setQuery] = createSignal(props.query)
const [offset, setOffset] = createSignal(0)
const { searchParams, handleClientRouteLinkClick } = useRouter<SearchPageSearchParams>() const { searchParams, handleClientRouteLinkClick } = useRouter<SearchPageSearchParams>()
let searchEl: HTMLInputElement
const handleQueryChange = (ev) => { const handleQueryChange = (_ev) => {
setQuery(ev.target.value) setQuery(searchEl.value)
} }
const handleSubmit = (_ev) => { const loadMore = async () => {
// TODO page saveScrollPosition()
// TODO sort const { hasMore } = await loadShoutsBy({
loadShoutsBy({ by: { title: getQuery(), body: getQuery() }, limit: 50 }) by: {
title: query(),
body: query()
},
offset: offset(),
limit: LOAD_MORE_PAGE_SIZE
})
setIsLoadMoreButtonVisible(hasMore)
setOffset(offset() + LOAD_MORE_PAGE_SIZE)
restoreScrollPosition()
} }
return ( return (
<div class="search-page wide-container"> <div class="search-page wide-container">
<form action="/search" class="search-form row"> <form action="/search" class="search-form row">
<div class="col-sm-9"> <div class="col-sm-9">
{/*FIXME t*/} <input
<input type="search" name="q" onChange={handleQueryChange} placeholder="Введите текст..." /> type="search"
name="q"
ref={searchEl}
onInput={handleQueryChange}
placeholder={t('Enter text') + '...'}
/>
</div> </div>
<div class="col-sm-3"> <div class="col-sm-3">
<button class="button" type="submit" onClick={handleSubmit}> <button class="button" type="submit" onClick={loadMore}>
{t('Search')} {t('Search')}
</button> </button>
</div> </div>
@ -51,14 +70,18 @@ export const SearchView = (props: Props) => {
selected: searchParams().by === 'relevance' selected: searchParams().by === 'relevance'
}} }}
> >
<a href="?by=relevance">{t('By relevance')}</a> <a href="?by=relevance" onClick={handleClientRouteLinkClick}>
{t('By relevance')}
</a>
</li> </li>
<li <li
classList={{ classList={{
selected: searchParams().by === 'rating' selected: searchParams().by === 'rating'
}} }}
> >
<a href="?by=rating">{t('Top rated')}</a> <a href="?by=rating" onClick={handleClientRouteLinkClick}>
{t('Top rated')}
</a>
</li> </li>
</ul> </ul>
@ -83,9 +106,13 @@ export const SearchView = (props: Props) => {
</div> </div>
</div> </div>
<h3>{t('Topics')}</h3> <Show when={isLoadMoreButtonVisible()}>
<p class="load-more-container">
<h3>{t('Authors')}</h3> <button class="button" onClick={loadMore}>
{t('Load more')}
</button>
</p>
</Show>
</Show> </Show>
</div> </div>
) )

View File

@ -176,5 +176,6 @@
"Video": "Видео", "Video": "Видео",
"Literature": "Литература", "Literature": "Литература",
"We can't find you, check email or": "Не можем вас найти, проверьте адрес электронной почты или", "We can't find you, check email or": "Не можем вас найти, проверьте адрес электронной почты или",
"register": "зарегистрируйтесь" "register": "зарегистрируйтесь",
"Enter text": "Введите текст"
} }