45 lines
1.3 KiB
TypeScript
45 lines
1.3 KiB
TypeScript
import type { MenuCategory, MenuFilter, MenuItem } from '@/domain/menu/entities';
|
|
|
|
export function filterMenuCategories(
|
|
categories: MenuCategory[],
|
|
filter: MenuFilter
|
|
): MenuCategory[] {
|
|
const query = filter.searchQuery?.toLowerCase().trim() ?? '';
|
|
|
|
return categories
|
|
.map((category) => {
|
|
if (filter.categoryId && filter.categoryId !== 'All' && category.id !== filter.categoryId) {
|
|
return { ...category, items: [] };
|
|
}
|
|
|
|
let items = category.items;
|
|
|
|
if (query) {
|
|
items = items.filter(
|
|
(item) =>
|
|
item.name.toLowerCase().includes(query) ||
|
|
(item.description?.toLowerCase().includes(query) ?? false)
|
|
);
|
|
}
|
|
|
|
if (filter.vegetarianOnly) {
|
|
items = items.filter((item) => item.isVegetarian);
|
|
}
|
|
|
|
return { ...category, items };
|
|
})
|
|
.filter((category) => category.items.length > 0);
|
|
}
|
|
|
|
export function filterMenuItems(items: MenuItem[], filter: MenuFilter): MenuItem[] {
|
|
const query = filter.searchQuery?.toLowerCase().trim() ?? '';
|
|
|
|
return items.filter((item) => {
|
|
if (filter.vegetarianOnly && !item.isVegetarian) return false;
|
|
if (!query) return true;
|
|
return (
|
|
item.name.toLowerCase().includes(query) ||
|
|
(item.description?.toLowerCase().includes(query) ?? false)
|
|
);
|
|
});
|
|
} |