eduardo4547's picture
Upload 150 files
cb5d9d0 verified
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,
};
}