search-wip, bio fix
This commit is contained in:
parent
a8247bafd6
commit
e39414d975
|
@ -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'
|
||||||
|
|
|
@ -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>
|
||||||
)
|
)
|
||||||
|
|
|
@ -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": "Введите текст"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user