2023-12-13 14:32:57 +03:00
|
|
|
'use client';
|
|
|
|
|
2023-11-26 02:24:16 +03:00
|
|
|
import { useCallback, useLayoutEffect, useState } from 'react';
|
|
|
|
|
2024-03-20 15:27:32 +03:00
|
|
|
import DataLoader from '@/components/wrap/DataLoader';
|
2023-12-13 14:32:57 +03:00
|
|
|
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';
|
2023-12-13 14:32:57 +03:00
|
|
|
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';
|
2024-03-18 16:21:39 +03:00
|
|
|
import { filterFromStrategy } from '@/models/miscellaneousAPI';
|
2024-03-27 15:32:59 +03:00
|
|
|
import { storage } from '@/utils/constants';
|
2023-12-13 14:32:57 +03:00
|
|
|
|
2023-11-26 02:24:16 +03:00
|
|
|
import SearchPanel from './SearchPanel';
|
|
|
|
import ViewLibrary from './ViewLibrary';
|
|
|
|
|
|
|
|
function LibraryPage() {
|
2023-12-13 14:32:57 +03:00
|
|
|
const router = useConceptNavigation();
|
|
|
|
const urlParams = useQueryStrings();
|
2024-03-27 15:32:59 +03:00
|
|
|
const queryFilter = (urlParams.get('filter') || null) as LibraryFilterStrategy | null;
|
2023-12-28 14:04:44 +03:00
|
|
|
|
2023-12-13 14:32:57 +03:00
|
|
|
const { user } = useAuth();
|
|
|
|
|
2023-11-26 02:24:16 +03:00
|
|
|
const library = useLibrary();
|
2024-04-01 19:07:20 +03:00
|
|
|
const { setShowScroll } = useConceptOptions();
|
2023-12-28 14:04:44 +03:00
|
|
|
|
2023-12-05 01:22:44 +03:00
|
|
|
const [filter, setFilter] = useState<ILibraryFilter>({});
|
|
|
|
const [items, setItems] = useState<ILibraryItem[]>([]);
|
2023-11-26 02:24:16 +03:00
|
|
|
|
|
|
|
const [query, setQuery] = useState('');
|
2023-12-28 14:04:44 +03:00
|
|
|
const [strategy, setStrategy] = useLocalStorage<LibraryFilterStrategy>(
|
2024-03-27 15:32:59 +03:00
|
|
|
storage.librarySearchStrategy,
|
2023-12-28 14:04:44 +03:00
|
|
|
LibraryFilterStrategy.MANUAL
|
|
|
|
);
|
2023-11-26 02:24:16 +03:00
|
|
|
|
2023-12-13 14:32:57 +03:00
|
|
|
useLayoutEffect(() => {
|
2024-03-27 15:32:59 +03:00
|
|
|
if (!queryFilter || !Object.values(LibraryFilterStrategy).includes(queryFilter)) {
|
2023-12-13 14:32:57 +03:00
|
|
|
router.replace(`/library?filter=${strategy}`);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
setQuery('');
|
2024-03-27 15:32:59 +03:00
|
|
|
setStrategy(queryFilter);
|
|
|
|
setFilter(filterFromStrategy(queryFilter));
|
|
|
|
}, [user, router, setQuery, setFilter, setStrategy, strategy, queryFilter]);
|
2023-12-13 14:32:57 +03:00
|
|
|
|
2023-12-28 14:04:44 +03:00
|
|
|
useLayoutEffect(() => {
|
2023-11-26 02:24:16 +03:00
|
|
|
setShowScroll(true);
|
|
|
|
return () => setShowScroll(false);
|
|
|
|
}, [setShowScroll]);
|
|
|
|
|
2023-12-28 14:04:44 +03:00
|
|
|
useLayoutEffect(() => {
|
2023-11-26 02:24:16 +03:00
|
|
|
setItems(library.applyFilter(filter));
|
|
|
|
}, [library, filter, filter.query]);
|
|
|
|
|
2023-12-28 14:04:44 +03:00
|
|
|
const resetQuery = useCallback(() => {
|
2023-11-26 02:24:16 +03:00
|
|
|
setQuery('');
|
|
|
|
setFilter({});
|
2023-12-28 14:04:44 +03:00
|
|
|
}, []);
|
2023-11-26 02:24:16 +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
|
|
|
);
|
2023-11-26 02:24:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
export default LibraryPage;
|