File size: 2,176 Bytes
cb5d9d0 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | import { useCallback, useMemo, useState } from "react";
import useAppStore from "../../store/useAppStore";
import type { Product } from "../../types";
export function useRoomVisualizer(products: Product[]) {
const viewMode = useAppStore((store) => store.viewMode);
const setViewMode = useAppStore((store) => store.setViewMode);
const openProductId = useAppStore((store) => store.openProductId);
const setOpenProductId = useAppStore((store) => store.setOpenProductId);
const [isSearchOpen, setIsSearchOpen] = useState(false);
const [searchQuery, setSearchQuery] = useState("");
const filteredProducts = useMemo(() => {
const normalizedQuery = searchQuery.trim().toLowerCase();
return products.filter((product) => {
return (
normalizedQuery.length === 0 ||
product.brand.toLowerCase().includes(normalizedQuery) ||
product.name.toLowerCase().includes(normalizedQuery) ||
product.ref.toLowerCase().includes(normalizedQuery) ||
product.size.toLowerCase().includes(normalizedQuery)
);
});
}, [products, searchQuery]);
const handleSelectProduct = useCallback(
(id: string | number | null) => {
setOpenProductId(openProductId === id ? null : id);
},
[openProductId, setOpenProductId],
);
const closeSearch = useCallback(() => {
setIsSearchOpen(false);
setSearchQuery("");
}, []);
const showGrid = useCallback(() => setViewMode("grid"), [setViewMode]);
const showList = useCallback(() => setViewMode("list"), [setViewMode]);
const chunkArray = useCallback(<T>(arr: T[], size: number): T[][] => {
const chunks: T[][] = [];
for (let i = 0; i < arr.length; i += size) {
chunks.push(arr.slice(i, i + size));
}
return chunks;
}, []);
const selectedProduct = useMemo(
() => products.find((product) => product.id === openProductId) ?? null,
[products, openProductId],
);
return {
viewMode,
showGrid,
showList,
openProductId,
handleSelectProduct,
selectedProduct,
isSearchOpen,
setIsSearchOpen,
searchQuery,
setSearchQuery,
closeSearch,
filteredProducts,
chunkArray,
};
}
|