diff --git a/apps/web/src/pages/HomePage.tsx b/apps/web/src/pages/HomePage.tsx index cfd48bc..4e3c25c 100644 --- a/apps/web/src/pages/HomePage.tsx +++ b/apps/web/src/pages/HomePage.tsx @@ -14,6 +14,7 @@ import { buildPublicObjectUrl, formatDuration } from '../lib/format'; type LibrarySort = 'date_desc' | 'name_asc' | 'duration_desc'; type LibraryFilter = 'all' | 'processing' | 'complete' | 'failed'; +type DateRange = 'all' | 'today' | 'week' | 'month' | 'quarter'; export function HomePage() { const [libraryItems, setLibraryItems] = useState([]); @@ -28,6 +29,8 @@ export function HomePage() { const [deleteError, setDeleteError] = useState(null); const [sortBy, setSortBy] = useState('date_desc'); const [filterBy, setFilterBy] = useState('all'); + const [searchQuery, setSearchQuery] = useState(''); + const [dateRange, setDateRange] = useState('all'); const [deletingVideoIds, setDeletingVideoIds] = useState([]); const loadingSkeletonCount = 8; @@ -142,9 +145,24 @@ export function HomePage() { } }; - const filteredItems = libraryItems.filter(item => - filterBy === 'all' ? true : phaseBucket(item.processingPhase) === filterBy - ); + const dateRangeStart = (() => { + const now = new Date(); + if (dateRange === 'today') { + const d = new Date(now); d.setHours(0, 0, 0, 0); return d; + } + if (dateRange === 'week') { const d = new Date(now); d.setDate(d.getDate() - 7); return d; } + if (dateRange === 'month') { const d = new Date(now); d.setMonth(d.getMonth() - 1); return d; } + if (dateRange === 'quarter') { const d = new Date(now); d.setMonth(d.getMonth() - 3); return d; } + return null; + })(); + + const q = searchQuery.trim().toLowerCase(); + const filteredItems = libraryItems.filter(item => { + if (filterBy !== 'all' && phaseBucket(item.processingPhase) !== filterBy) return false; + if (q && !item.displayTitle.toLowerCase().includes(q)) return false; + if (dateRangeStart && new Date(item.createdAt) < dateRangeStart) return false; + return true; + }); const visibleItems = [...filteredItems].sort((a, b) => { if (sortBy === 'name_asc') return a.displayTitle.localeCompare(b.displayTitle); if (sortBy === 'duration_desc') return (b.durationSeconds ?? -1) - (a.durationSeconds ?? -1); @@ -188,36 +206,77 @@ export function HomePage() { />
-
-

Library

-
- - - +
+
+
+ - {loadingLibrary ? 'Refreshing...' : 'Refresh'} - + + + setSearchQuery(event.target.value)} + className="input-control h-9 w-full pl-9 pr-4 text-sm" + /> + {searchQuery && ( + + )}
@@ -249,7 +308,7 @@ export function HomePage() { ) : visibleItems.length === 0 ? ( ) : (