'use client'; import { AnimatePresence } from 'framer-motion'; import { useCallback, useLayoutEffect, useMemo, useState } from 'react'; import DataLoader from '@/components/wrap/DataLoader'; import { useAuth } from '@/context/AuthContext'; import { useLibrary } from '@/context/LibraryContext'; import useLocalStorage from '@/hooks/useLocalStorage'; import { ILibraryItem, LocationHead } from '@/models/library'; import { ILibraryFilter } from '@/models/miscellaneous'; import { storage } from '@/utils/constants'; import { toggleTristateFlag } from '@/utils/utils'; import TableLibraryItems from './TableLibraryItems'; import ToolbarSearch from './ToolbarSearch'; import ViewSideLocation from './ViewSideLocation'; function LibraryPage() { const library = useLibrary(); const { user } = useAuth(); const [items, setItems] = useState([]); const [query, setQuery] = useState(''); const [path, setPath] = useState(''); const [head, setHead] = useLocalStorage(storage.librarySearchHead, undefined); const [folderMode, setFolderMode] = useLocalStorage(storage.librarySearchFolderMode, true); const [location, setLocation] = useLocalStorage(storage.librarySearchLocation, ''); const [isVisible, setIsVisible] = useLocalStorage(storage.librarySearchVisible, true); const [isSubscribed, setIsSubscribed] = useLocalStorage( storage.librarySearchSubscribed, undefined ); const [isOwned, setIsOwned] = useLocalStorage(storage.librarySearchEditor, undefined); const [isEditor, setIsEditor] = useLocalStorage(storage.librarySearchEditor, undefined); const filter: ILibraryFilter = useMemo( () => ({ head: head, path: path, query: query, isEditor: user ? isEditor : undefined, isOwned: user ? isOwned : undefined, isSubscribed: user ? isSubscribed : undefined, isVisible: user ? isVisible : true, folderMode: folderMode, location: location }), [head, path, query, isEditor, isOwned, isSubscribed, isVisible, user, folderMode, location] ); const hasCustomFilter = useMemo( () => !!filter.path || !!filter.query || filter.head !== undefined || filter.isEditor !== undefined || filter.isOwned !== undefined || filter.isVisible !== true || !!filter.location, [filter] ); useLayoutEffect(() => { setItems(library.applyFilter(filter)); }, [library, library.items.length, filter]); const toggleVisible = useCallback(() => setIsVisible(prev => toggleTristateFlag(prev)), [setIsVisible]); const toggleOwned = useCallback(() => setIsOwned(prev => toggleTristateFlag(prev)), [setIsOwned]); const toggleEditor = useCallback(() => setIsEditor(prev => toggleTristateFlag(prev)), [setIsEditor]); const toggleFolderMode = useCallback(() => setFolderMode(prev => !prev), [setFolderMode]); const resetFilter = useCallback(() => { setQuery(''); setPath(''); setHead(undefined); setIsVisible(true); setIsSubscribed(undefined); setIsOwned(undefined); setIsEditor(undefined); setLocation(''); }, [setHead, setIsVisible, setIsSubscribed, setIsOwned, setIsEditor, setLocation]); const viewLibrary = useMemo( () => ( ), [resetFilter, items, folderMode, toggleFolderMode] ); const viewLocations = useMemo( () => ( ), [location, library.folders, setLocation, toggleFolderMode] ); return (
{folderMode ? viewLocations : null} {viewLibrary}
); } export default LibraryPage;