'use client'; import { AnimatePresence } from 'framer-motion'; import { useCallback, useLayoutEffect, useMemo, useState } from 'react'; import { toast } from 'react-toastify'; import DataLoader from '@/components/wrap/DataLoader'; import { useAuth } from '@/context/AuthContext'; import { useLibrary } from '@/context/LibraryContext'; import DlgChangeLocation from '@/dialogs/DlgChangeLocation'; import useLocalStorage from '@/hooks/useLocalStorage'; import { ILibraryItem, IRenameLocationData, LocationHead } from '@/models/library'; import { ILibraryFilter } from '@/models/miscellaneous'; import { storage } from '@/utils/constants'; import { information } from '@/utils/labels'; 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 [subfolders, setSubfolders] = useLocalStorage(storage.librarySearchSubfolders, false); const [location, setLocation] = useLocalStorage(storage.librarySearchLocation, ''); const [isVisible, setIsVisible] = useLocalStorage(storage.librarySearchVisible, true); const [isOwned, setIsOwned] = useLocalStorage(storage.librarySearchEditor, undefined); const [isEditor, setIsEditor] = useLocalStorage(storage.librarySearchEditor, undefined); const [showRenameLocation, setShowRenameLocation] = useState(false); const filter: ILibraryFilter = useMemo( () => ({ head: head, path: path, query: query, isEditor: user ? isEditor : undefined, isOwned: user ? isOwned : undefined, isVisible: user ? isVisible : true, folderMode: folderMode, subfolders: subfolders, location: location }), [head, path, query, isEditor, isOwned, isVisible, user, folderMode, location, subfolders] ); 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 toggleSubfolders = useCallback(() => setSubfolders(prev => !prev), [setSubfolders]); const resetFilter = useCallback(() => { setQuery(''); setPath(''); setHead(undefined); setIsVisible(true); setIsOwned(undefined); setIsEditor(undefined); setLocation(''); }, [setHead, setIsVisible, setIsOwned, setIsEditor, setLocation]); const promptRenameLocation = useCallback(() => { setShowRenameLocation(true); }, []); const handleRenameLocation = useCallback( (newLocation: string) => { const data: IRenameLocationData = { target: location, new_location: newLocation }; library.renameLocation(data, () => { setLocation(newLocation); toast.success(information.locationRenamed); }); }, [location, library] ); const viewLibrary = useMemo( () => ( ), [resetFilter, items, folderMode, toggleFolderMode] ); const viewLocations = useMemo( () => ( ), [location, library.folders, setLocation, toggleFolderMode, subfolders] ); return ( {showRenameLocation ? ( setShowRenameLocation(false)} /> ) : null}
{folderMode ? viewLocations : null} {viewLibrary}
); } export default LibraryPage;