refactor: extract useInventoryFilter hook from inventory/page.tsx
This commit is contained in:
46
frontend/hooks/useInventoryFilter.ts
Normal file
46
frontend/hooks/useInventoryFilter.ts
Normal file
@@ -0,0 +1,46 @@
|
||||
import { useState, useMemo } from 'react';
|
||||
import { Item } from '@/lib/db';
|
||||
|
||||
export function useInventoryFilter(inventory: Item[]) {
|
||||
const [searchQuery, setSearchQuery] = useState('');
|
||||
const [expandedCategory, setExpandedCategory] = useState<string | null>(null);
|
||||
const [boxSearchQuery, setBoxSearchQuery] = useState('');
|
||||
|
||||
// Get unique categories from inventory
|
||||
const categories = useMemo(
|
||||
() => Array.from(new Set(inventory.map(i => i.category))),
|
||||
[inventory]
|
||||
);
|
||||
|
||||
// Filter categories based on search query
|
||||
const filteredCategories = useMemo(
|
||||
() => categories.filter(c =>
|
||||
c.toLowerCase().includes(searchQuery.toLowerCase()) ||
|
||||
inventory.some(i => i.category === c && i.name.toLowerCase().includes(searchQuery.toLowerCase()))
|
||||
),
|
||||
[categories, inventory, searchQuery]
|
||||
);
|
||||
|
||||
// Get filtered items within a specific category
|
||||
const getFilteredItems = (category: string) =>
|
||||
inventory
|
||||
.filter(i => i.category === category)
|
||||
.filter(i => i.name.toLowerCase().includes(searchQuery.toLowerCase()));
|
||||
|
||||
// Get filtered boxes based on search
|
||||
const getFilteredBoxes = (boxes: string[]) =>
|
||||
boxes.filter(b => b.toLowerCase().includes(boxSearchQuery.toLowerCase()));
|
||||
|
||||
return {
|
||||
searchQuery,
|
||||
setSearchQuery,
|
||||
expandedCategory,
|
||||
setExpandedCategory,
|
||||
boxSearchQuery,
|
||||
setBoxSearchQuery,
|
||||
categories,
|
||||
filteredCategories,
|
||||
getFilteredItems,
|
||||
getFilteredBoxes
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user