import React, { memo } from 'react'; import type { FileSystemItem as FileSystemItemType } from '../types'; import FileItem from './FileItem'; import Spinner from './Spinner'; import { PathBar } from './PathBar'; interface FileListProps { items: FileSystemItemType[]; isLoading: boolean; onDownload: () => void; selectedIds: string[]; onSelectItem: (id: string) => void; onFolderDoubleClick?: (folder: FileSystemItemType) => void; onNavigateBack?: () => void; onNavigateForward?: () => void; canNavigateBack?: boolean; canNavigateForward?: boolean; currentPath?: string; currentMode?: 'api' | 'sharing' | null; isDownloadButtonLoading?: boolean; hasCustomPath?: boolean; isCustomPath?: boolean; onSaveCustomPath?: () => void; isSavingCustomPath?: boolean; initialSearchQuery?: string; // Auto-fill search input from parent } const FileList: React.FC = ({ items, isLoading, onDownload, selectedIds, onSelectItem, onFolderDoubleClick, onNavigateBack, onNavigateForward, canNavigateBack = false, canNavigateForward = false, currentPath = '', currentMode = null, isDownloadButtonLoading = false, hasCustomPath = false, isCustomPath = false, onSaveCustomPath, isSavingCustomPath = false, initialSearchQuery = '' }) => { // Search state const [searchQuery, setSearchQuery] = React.useState(initialSearchQuery); const [debouncedQuery, setDebouncedQuery] = React.useState(initialSearchQuery); // Update search query when initialSearchQuery changes (from parent) React.useEffect(() => { setSearchQuery(initialSearchQuery); setDebouncedQuery(initialSearchQuery); }, [initialSearchQuery]); // Debounce search query (300ms) React.useEffect(() => { const timer = setTimeout(() => { setDebouncedQuery(searchQuery); }, 300); return () => clearTimeout(timer); }, [searchQuery]); // Filter items based on search query const filteredItems = React.useMemo(() => { if (!debouncedQuery.trim()) { return items; } const query = debouncedQuery.toLowerCase(); return items.filter(item => item.name.toLowerCase().includes(query) ); }, [items, debouncedQuery]); const hasFilesOrFolders = filteredItems.length > 0; const selectedCount = selectedIds.length; const buttonText = selectedCount > 0 ? `Tải xuống ${selectedCount} mục` : 'Tải xuống tất cả'; const isDownloadDisabled = selectedCount === 0 && !hasFilesOrFolders; const renderContent = () => { if (isLoading) { return (

Đang tải danh sách tệp...

); } if (items.length > 0) { return ( <>
Tên
Ngày sửa đổi
Kích thước
{filteredItems.length > 0 ? ( filteredItems.map((item) => ( onFolderDoubleClick(item) : undefined} /> )) ) : (

Không tìm thấy kết quả cho "{debouncedQuery}"

)}
) } return (

Không có tệp hoặc thư mục nào. Vui lòng thực hiện tìm kiếm.

) }; return (
{/* Header */}

File & Folder

{/* Path Bar */} {(onNavigateBack || onNavigateForward) && currentPath && (
{ })} onNavigateForward={onNavigateForward || (() => { })} currentMode={currentMode} hasCustomPath={hasCustomPath} isCustomPath={isCustomPath} onSaveCustomPath={onSaveCustomPath} isSavingCustomPath={isSavingCustomPath} searchQuery={searchQuery} onSearchChange={setSearchQuery} />
)} {/* File List Content */}
{renderContent()}
); }; export default memo(FileList);