stacker.news/components/search.js

148 lines
5.3 KiB
JavaScript
Raw Normal View History

2023-07-24 18:35:05 +00:00
import Button from 'react-bootstrap/Button'
import Container from 'react-bootstrap/Container'
2022-01-26 21:43:18 +00:00
import styles from './search.module.css'
2022-09-22 15:26:02 +00:00
import SearchIcon from '../svgs/search-line.svg'
2022-01-26 21:43:18 +00:00
import CloseIcon from '../svgs/close-line.svg'
2022-01-27 19:18:48 +00:00
import { useEffect, useState } from 'react'
2022-10-20 22:44:44 +00:00
import { Form, Input, Select, SubmitButton } from './form'
2022-01-27 19:18:48 +00:00
import { useRouter } from 'next/router'
2022-01-26 21:43:18 +00:00
2022-02-17 17:23:43 +00:00
export default function Search ({ sub }) {
2022-01-27 19:18:48 +00:00
const router = useRouter()
const [searching, setSearching] = useState(router.query.q)
2022-10-20 22:44:44 +00:00
const [q, setQ] = useState(router.query.q || '')
2022-01-27 19:18:48 +00:00
const [atBottom, setAtBottom] = useState()
useEffect(() => {
setAtBottom(Math.ceil(window.innerHeight + window.pageYOffset) >= document.body.offsetHeight)
2022-01-27 19:18:48 +00:00
window.onscroll = function (ev) {
if (Math.ceil(window.innerHeight + window.pageYOffset) >= document.body.offsetHeight) {
2022-01-27 19:18:48 +00:00
setAtBottom(true)
} else {
setAtBottom(false)
}
}
}, [])
2022-10-20 22:44:44 +00:00
const search = async values => {
let prefix = ''
if (sub) {
prefix = `/~${sub}`
}
2022-10-25 17:13:06 +00:00
2022-10-20 22:44:44 +00:00
if (values.q?.trim() !== '') {
2023-07-09 17:37:12 +00:00
if (values.what === 'stackers') {
2022-10-25 17:13:06 +00:00
await router.push({
2023-07-09 17:37:12 +00:00
pathname: '/stackers/search',
query: { q, what: 'stackers' }
}, {
pathname: '/stackers/search',
query: { q }
2022-10-25 17:13:06 +00:00
})
return
}
if (values.what === '' || values.what === 'all') delete values.what
if (values.sort === '' || values.sort === 'match') delete values.sort
if (values.when === '' || values.when === 'forever') delete values.when
2022-10-20 22:44:44 +00:00
await router.push({
pathname: prefix + '/search',
query: values
})
}
}
2022-01-27 19:18:48 +00:00
const showSearch = atBottom || searching || router.query.q
2023-05-01 20:58:30 +00:00
const filter = sub !== 'jobs'
const what = router.pathname.startsWith('/stackers') ? 'stackers' : router.query.what || 'all'
const sort = router.query.sort || 'match'
const when = router.query.when || 'forever'
2022-01-26 21:43:18 +00:00
return (
<>
2022-01-27 19:18:48 +00:00
<div className={`${styles.searchSection} ${showSearch ? styles.solid : styles.hidden}`}>
2023-07-24 18:35:05 +00:00
<Container className={`px-md-0 ${styles.searchContainer} ${filter ? styles.leaveRoom : ''}`}>
2022-01-27 19:18:48 +00:00
{showSearch
2022-01-26 21:43:18 +00:00
? (
<Form
2022-10-20 22:44:44 +00:00
className={styles.formActive}
initial={{ q, what, sort, when }}
2022-10-20 22:44:44 +00:00
onSubmit={search}
2022-01-26 21:43:18 +00:00
>
2022-10-20 22:44:44 +00:00
{filter &&
2023-07-24 18:35:05 +00:00
<div className='text-muted fw-bold my-3 d-flex align-items-center'>
2022-10-20 22:44:44 +00:00
<Select
2023-07-24 18:35:05 +00:00
groupClassName='me-2 mb-0'
2022-10-20 22:44:44 +00:00
onChange={(formik, e) => search({ ...formik?.values, what: e.target.value })}
name='what'
size='sm'
overrideValue={what}
2023-07-09 17:37:12 +00:00
items={['all', 'posts', 'comments', 'stackers']}
2022-10-20 22:44:44 +00:00
/>
{what !== 'stackers' &&
2022-10-25 17:13:06 +00:00
<>
by
<Select
groupClassName='mx-2 mb-0'
onChange={(formik, e) => search({ ...formik?.values, sort: e.target.value })}
name='sort'
size='sm'
overrideValue={sort}
2022-10-25 17:13:06 +00:00
items={['match', 'recent', 'comments', 'sats', 'votes']}
/>
for
<Select
2023-07-24 18:35:05 +00:00
groupClassName='mb-0 ms-2'
2022-10-25 17:13:06 +00:00
onChange={(formik, e) => search({ ...formik?.values, when: e.target.value })}
name='when'
size='sm'
overrideValue={when}
2022-10-25 17:13:06 +00:00
items={['forever', 'day', 'week', 'month', 'year']}
/>
</>}
2022-10-20 22:44:44 +00:00
</div>}
2023-07-25 14:14:45 +00:00
<div className={styles.active}>
2022-10-20 22:44:44 +00:00
<Input
name='q'
required
2023-05-01 20:58:30 +00:00
autoFocus
2023-07-24 18:35:05 +00:00
groupClassName='me-3 mb-0 flex-grow-1'
2022-10-20 22:44:44 +00:00
className='flex-grow-1'
clear
overrideValue={q}
2022-10-20 22:44:44 +00:00
onChange={async (formik, e) => {
setSearching(true)
setQ(e.target.value?.trim())
}}
/>
{q || atBottom || router.query.q
? (
<SubmitButton variant='primary' className={styles.search}>
<SearchIcon width={22} height={22} />
</SubmitButton>
)
: (
<Button
className={styles.search} onClick={() => {
setSearching(false)
}}
>
<CloseIcon width={26} height={26} />
</Button>)}
</div>
2022-01-26 21:43:18 +00:00
</Form>
)
: (
2022-10-20 22:44:44 +00:00
<Button className={`${styles.search} ${styles.formActive}`} onClick={() => setSearching(true)}>
2022-01-26 21:43:18 +00:00
<SearchIcon width={22} height={22} />
</Button>
)}
</Container>
</div>
2022-10-20 22:44:44 +00:00
<div className={`${styles.searchPadding} ${filter ? styles.leaveRoom : ''}`} />
2022-01-26 21:43:18 +00:00
</>
)
}