'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 ViewSideFolders from './ViewSideFolders'; 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 [folder, setFolder] = useLocalStorage(storage.librarySearchFolder, ''); 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, folder: folder }), [head, path, query, isEditor, isOwned, isSubscribed, isVisible, user, folderMode, folder] ); const hasCustomFilter = useMemo( () => !!filter.path || !!filter.query || filter.head !== undefined || filter.isEditor !== undefined || filter.isOwned !== undefined || filter.isSubscribed !== undefined || filter.isVisible !== true || !!filter.folder, [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 toggleSubscribed = useCallback(() => setIsSubscribed(prev => toggleTristateFlag(prev)), [setIsSubscribed]); 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); setFolder(''); }, [setHead, setIsVisible, setIsSubscribed, setIsOwned, setIsEditor, setFolder]); const view = useMemo( () => ( ), [resetFilter, items, folderMode, toggleFolderMode] ); return (
{folderMode ? ( ) : null} {view}
); } export default LibraryPage;