Initial commit

This commit is contained in:
2025-10-04 18:22:24 +03:00
commit 2852c2c054
291 changed files with 38109 additions and 0 deletions

65
src/redux/hooks.ts Normal file
View File

@@ -0,0 +1,65 @@
import { useDispatch, useSelector } from "react-redux";
import type { TypedUseSelectorHook } from "react-redux";
import { ItemType, OrderType } from "pages/pos/orders/types";
import { TableType } from "pages/pos/tables/types";
import { useEffect, useMemo, useState } from "react";
import { parseTranslations } from "utils/helpers";
import type { AppDispatch, RootState } from "./store";
// Use throughout your app instead of plain `useDispatch` and `useSelector`
export const useAppDispatch: () => AppDispatch = useDispatch;
export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector;
export const useDebouncedValue = (value: any, delay: number = 500) => {
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(() => {
const handler: NodeJS.Timeout = setTimeout(() => {
setDebouncedValue(value);
}, delay);
return () => {
clearTimeout(handler);
};
}, [value, delay]);
return debouncedValue;
};
export const useExtractTableItems = (table?: TableType) => {
return useMemo(() => {
let items: Array<ItemType> = [];
let quantity: number = 0;
table?.active_reservation?.orders?.forEach((order: OrderType) => {
items = [...items, ...(order?.items || [])];
quantity += Number(order?.quantities) || 0;
});
items = items.filter((i) => i.quantity > 0);
items = [...removeDuplicatesAndIncreaseQuantity(items)];
items = items.map((i: any) => ({ ...i, ...parseTranslations(i.product) }));
return { items, quantity };
}, [table]);
};
export function removeDuplicatesAndIncreaseQuantity(items: any[]) {
const result: any[] = [];
// Group objects by ID
const grouped = items.reduce((acc, item) => {
if (!acc[item.product.id]) {
acc[item.product.id] = { ...item };
} else {
acc[item.product.id].quantity += item.quantity;
acc[item.product.id].total_amount =
acc[item.product.id]?.quantity * acc[item.product.id]?.unit_price;
}
return acc;
}, {});
// Convert grouped objects back to array
Object.values(grouped).forEach((item) => result.push(item));
return result;
}