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

90 lines
2.6 KiB
TypeScript
Raw Normal View History

'use client';
import { useCallback, useLayoutEffect, useState } from 'react';
2024-03-20 15:27:32 +03:00
import DataLoader from '@/components/wrap/DataLoader';
import { useAuth } from '@/context/AuthContext';
import { useLibrary } from '@/context/LibraryContext';
2023-12-26 14:23:51 +03:00
import { useConceptNavigation } from '@/context/NavigationContext';
import { useConceptTheme } from '@/context/ThemeContext';
import useLocalStorage from '@/hooks/useLocalStorage';
import useQueryStrings from '@/hooks/useQueryStrings';
import { ILibraryItem } from '@/models/library';
2023-12-26 14:23:51 +03:00
import { ILibraryFilter, LibraryFilterStrategy } from '@/models/miscellaneous';
import { filterFromStrategy } from '@/models/miscellaneousAPI';
import SearchPanel from './SearchPanel';
import ViewLibrary from './ViewLibrary';
function LibraryPage() {
const router = useConceptNavigation();
const urlParams = useQueryStrings();
const searchFilter = (urlParams.get('filter') || null) as LibraryFilterStrategy | null;
2023-12-28 14:04:44 +03:00
const { user } = useAuth();
const library = useLibrary();
const { setShowScroll } = useConceptTheme();
2023-12-28 14:04:44 +03:00
const [filter, setFilter] = useState<ILibraryFilter>({});
const [items, setItems] = useState<ILibraryItem[]>([]);
const [query, setQuery] = useState('');
2023-12-28 14:04:44 +03:00
const [strategy, setStrategy] = useLocalStorage<LibraryFilterStrategy>(
'search_strategy',
LibraryFilterStrategy.MANUAL
);
useLayoutEffect(() => {
if (searchFilter === null) {
router.replace(`/library?filter=${strategy}`);
return;
}
2023-12-28 14:04:44 +03:00
const inputStrategy =
searchFilter && Object.values(LibraryFilterStrategy).includes(searchFilter)
? searchFilter
: LibraryFilterStrategy.MANUAL;
setQuery('');
setStrategy(inputStrategy);
setFilter(filterFromStrategy(inputStrategy));
}, [user, router, setQuery, setFilter, setStrategy, strategy, searchFilter]);
2023-12-28 14:04:44 +03:00
useLayoutEffect(() => {
setShowScroll(true);
return () => setShowScroll(false);
}, [setShowScroll]);
2023-12-28 14:04:44 +03:00
useLayoutEffect(() => {
setItems(library.applyFilter(filter));
}, [library, filter, filter.query]);
2023-12-28 14:04:44 +03:00
const resetQuery = useCallback(() => {
setQuery('');
setFilter({});
2023-12-28 14:04:44 +03:00
}, []);
return (
2024-01-07 03:29:16 +03:00
<DataLoader
id='library-page' //
isLoading={library.loading}
error={library.error}
hasNoData={library.items.length === 0}
>
<SearchPanel
query={query}
setQuery={setQuery}
strategy={strategy}
total={library.items.length ?? 0}
filtered={items.length}
setFilter={setFilter}
/>
<ViewLibrary
resetQuery={resetQuery} //
items={items}
/>
</DataLoader>
2023-12-28 14:04:44 +03:00
);
}
export default LibraryPage;