'use client'; 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 LibraryTable from './LibraryTable'; import SearchPanel from './SearchPanel'; 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 [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 }), [head, path, query, isEditor, isOwned, isSubscribed, isVisible, user] ); useLayoutEffect(() => { setItems(library.applyFilter(filter)); }, [library, filter, filter.query]); 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 resetFilter = useCallback(() => { setQuery(''); setPath(''); setHead(undefined); setIsVisible(true); setIsSubscribed(undefined); setIsOwned(undefined); setIsEditor(undefined); }, [setHead, setIsVisible, setIsSubscribed, setIsOwned, setIsEditor]); const view = useMemo( () => ( ), [resetFilter, items] ); return ( {view} ); } export default LibraryPage;