2023-09-11 21:06:51 +03:00
|
|
|
import { useCallback, useLayoutEffect, useState } from 'react';
|
2023-07-25 20:27:29 +03:00
|
|
|
|
2023-07-15 17:46:19 +03:00
|
|
|
import BackendError from '../../components/BackendError'
|
2023-09-03 18:26:50 +03:00
|
|
|
import { ConceptLoader } from '../../components/Common/ConceptLoader'
|
2023-08-01 20:14:03 +03:00
|
|
|
import { useLibrary } from '../../context/LibraryContext';
|
2023-09-05 00:23:53 +03:00
|
|
|
import { useConceptTheme } from '../../context/ThemeContext';
|
2023-09-11 21:06:51 +03:00
|
|
|
import useLocalStorage from '../../hooks/useLocalStorage';
|
2023-09-11 20:31:54 +03:00
|
|
|
import { ILibraryItem } from '../../models/library';
|
2023-09-11 21:06:51 +03:00
|
|
|
import { ILibraryFilter, LibraryFilterStrategy } from '../../models/miscelanious';
|
2023-08-26 19:39:49 +03:00
|
|
|
import SearchPanel from './SearchPanel';
|
2023-07-28 00:03:37 +03:00
|
|
|
import ViewLibrary from './ViewLibrary';
|
2023-07-15 17:46:19 +03:00
|
|
|
|
2023-07-28 00:03:37 +03:00
|
|
|
function LibraryPage() {
|
2023-08-01 20:14:03 +03:00
|
|
|
const library = useLibrary();
|
2023-09-05 00:23:53 +03:00
|
|
|
const { setShowScroll } = useConceptTheme();
|
2023-08-01 20:14:03 +03:00
|
|
|
|
2023-08-27 00:19:19 +03:00
|
|
|
const [ filter, setFilter ] = useState<ILibraryFilter>({});
|
2023-08-25 22:51:20 +03:00
|
|
|
const [ items, setItems ] = useState<ILibraryItem[]>([]);
|
2023-09-05 00:23:53 +03:00
|
|
|
|
2023-09-11 21:06:51 +03:00
|
|
|
const [query, setQuery] = useState('');
|
|
|
|
const [strategy, setStrategy] = useLocalStorage<LibraryFilterStrategy>('search_strategy', LibraryFilterStrategy.MANUAL);
|
|
|
|
|
2023-09-05 00:23:53 +03:00
|
|
|
useLayoutEffect(
|
|
|
|
() => {
|
|
|
|
setShowScroll(true);
|
|
|
|
return () => setShowScroll(false);
|
|
|
|
}, [setShowScroll]);
|
|
|
|
|
2023-08-27 00:19:19 +03:00
|
|
|
useLayoutEffect(
|
|
|
|
() => {
|
2023-08-01 20:14:03 +03:00
|
|
|
setItems(library.filter(filter));
|
2023-08-27 00:19:19 +03:00
|
|
|
}, [library, filter, filter.query]);
|
2023-07-25 20:27:29 +03:00
|
|
|
|
2023-09-11 21:06:51 +03:00
|
|
|
const resetQuery = useCallback(
|
|
|
|
() => {
|
|
|
|
setQuery('');
|
|
|
|
setFilter({});
|
2023-09-11 21:13:12 +03:00
|
|
|
}, [])
|
2023-09-11 21:06:51 +03:00
|
|
|
|
2023-07-15 17:46:19 +03:00
|
|
|
return (
|
2023-07-20 17:11:03 +03:00
|
|
|
<div className='w-full'>
|
2023-09-03 18:26:50 +03:00
|
|
|
{ library.loading && <ConceptLoader /> }
|
2023-08-01 20:14:03 +03:00
|
|
|
{ library.error && <BackendError error={library.error} />}
|
2023-08-26 19:39:49 +03:00
|
|
|
{ !library.loading && library.items &&
|
|
|
|
<div className='flex flex-col w-full'>
|
2023-08-27 15:39:49 +03:00
|
|
|
<SearchPanel
|
2023-09-11 21:06:51 +03:00
|
|
|
query={query}
|
|
|
|
setQuery={setQuery}
|
|
|
|
strategy={strategy}
|
|
|
|
setStrategy={setStrategy}
|
2023-08-27 15:39:49 +03:00
|
|
|
total={library.items.length ?? 0}
|
|
|
|
filtered={items.length}
|
2023-08-27 00:19:19 +03:00
|
|
|
setFilter={setFilter}
|
2023-08-26 19:39:49 +03:00
|
|
|
/>
|
|
|
|
<ViewLibrary
|
2023-09-11 21:06:51 +03:00
|
|
|
resetQuery={resetQuery}
|
2023-08-26 19:39:49 +03:00
|
|
|
items={items}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
}
|
2023-07-15 17:46:19 +03:00
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2023-07-28 00:03:37 +03:00
|
|
|
export default LibraryPage;
|