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

87 lines
2.5 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';
2024-04-01 19:07:20 +03:00
import { useConceptOptions } from '@/context/OptionsContext';
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 { storage } from '@/utils/constants';
import SearchPanel from './SearchPanel';
import ViewLibrary from './ViewLibrary';
function LibraryPage() {
const router = useConceptNavigation();
const urlParams = useQueryStrings();
const queryFilter = (urlParams.get('filter') || null) as LibraryFilterStrategy | null;
2023-12-28 14:04:44 +03:00
const { user } = useAuth();
const library = useLibrary();
2024-04-01 19:07:20 +03:00
const { setShowScroll } = useConceptOptions();
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>(
storage.librarySearchStrategy,
2023-12-28 14:04:44 +03:00
LibraryFilterStrategy.MANUAL
);
useLayoutEffect(() => {
if (!queryFilter || !Object.values(LibraryFilterStrategy).includes(queryFilter)) {
router.replace(`/library?filter=${strategy}`);
return;
}
setQuery('');
setStrategy(queryFilter);
setFilter(filterFromStrategy(queryFilter));
}, [user, router, setQuery, setFilter, setStrategy, strategy, queryFilter]);
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;