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,
  };
}