ConceptPortal-public/rsconcept/frontend/src/pages/LibraryPage/SearchPanel.tsx

78 lines
2.1 KiB
TypeScript
Raw Normal View History

'use client';
2023-08-26 19:39:49 +03:00
import clsx from 'clsx';
import { useCallback } from 'react';
2023-08-27 15:39:49 +03:00
import SearchBar from '@/components/Common/SearchBar';
2023-12-26 14:23:51 +03:00
import { useConceptNavigation } from '@/context/NavigationContext';
import { ILibraryFilter } from '@/models/miscellaneous';
import { LibraryFilterStrategy } from '@/models/miscellaneous';
2023-08-27 15:39:49 +03:00
import PickerStrategy from './PickerStrategy';
2023-08-26 19:39:49 +03:00
interface SearchPanelProps {
2023-12-28 14:04:44 +03:00
total: number;
filtered: number;
setFilter: React.Dispatch<React.SetStateAction<ILibraryFilter>>;
query: string;
setQuery: React.Dispatch<React.SetStateAction<string>>;
strategy: LibraryFilterStrategy;
2023-08-26 19:39:49 +03:00
}
function SearchPanel({ total, filtered, query, setQuery, strategy, setFilter }: SearchPanelProps) {
const router = useConceptNavigation();
2023-08-26 19:39:49 +03:00
2023-12-08 19:24:08 +03:00
function handleChangeQuery(newQuery: string) {
2023-08-27 00:19:19 +03:00
setQuery(newQuery);
setFilter(prev => ({
query: newQuery,
is_owned: prev.is_owned,
is_common: prev.is_common,
is_canonical: prev.is_canonical,
is_subscribed: prev.is_subscribed,
is_personal: prev.is_personal
}));
2023-08-27 00:19:19 +03:00
}
2023-08-26 19:39:49 +03:00
2023-08-27 15:39:49 +03:00
const handleChangeStrategy = useCallback(
2023-12-28 14:04:44 +03:00
(value: LibraryFilterStrategy) => {
if (value !== strategy) {
router.push(`/library?filter=${value}`);
}
},
[strategy, router]
);
2023-08-27 15:39:49 +03:00
2023-08-26 19:39:49 +03:00
return (
2023-12-30 19:43:24 +03:00
<div
className={clsx(
2024-01-04 14:35:46 +03:00
'sticky top-0', // prettier: split lines
2023-12-30 19:43:24 +03:00
'w-full max-h-[2.3rem]',
'pr-40 flex',
'border-b',
'clr-input'
)}
>
<div
className={clsx(
2024-01-04 14:35:46 +03:00
'min-w-[10rem]', // prettier: split lines
2023-12-30 19:43:24 +03:00
'px-2 self-center',
'select-none',
'whitespace-nowrap'
)}
>
2023-12-28 14:04:44 +03:00
Фильтр
<span className='ml-2'>
{filtered} из {total}
</span>
</div>
<div className={clsx('flex-grow', 'flex gap-1 justify-center items-center')}>
<SearchBar noBorder className='min-w-[10rem]' value={query} onChange={handleChangeQuery} />
2023-12-28 14:04:44 +03:00
<PickerStrategy value={strategy} onChange={handleChangeStrategy} />
</div>
</div>
2023-12-28 14:04:44 +03:00
);
2023-08-26 19:39:49 +03:00
}
2023-12-28 14:04:44 +03:00
export default SearchPanel;