80 lines
2.4 KiB
TypeScript
80 lines
2.4 KiB
TypeScript
import { useMemo } from 'react';
|
||
import { useOrders } from './useAdminApi';
|
||
import { format } from 'date-fns';
|
||
import { ru } from 'date-fns/locale';
|
||
import { Order } from '@/lib/orders';
|
||
|
||
interface UseOrdersCacheParams {
|
||
page?: number;
|
||
pageSize?: number;
|
||
status?: string;
|
||
search?: string;
|
||
dateRange?: [Date | null, Date | null];
|
||
}
|
||
|
||
export default function useOrdersCache({
|
||
page = 1,
|
||
pageSize = 10,
|
||
status = '',
|
||
search = '',
|
||
dateRange = [null, null],
|
||
}: UseOrdersCacheParams = {}) {
|
||
const params: Record<string, any> = {
|
||
skip: (page - 1) * pageSize,
|
||
limit: pageSize,
|
||
search: search || undefined,
|
||
status: status || undefined,
|
||
};
|
||
if (dateRange[0] && dateRange[1]) {
|
||
params.date_from = format(dateRange[0], 'yyyy-MM-dd');
|
||
params.date_to = format(dateRange[1], 'yyyy-MM-dd');
|
||
}
|
||
const { data, isLoading, error, refetch } = useOrders(params) as { data?: { orders: Order[]; total: number }, isLoading: boolean, error: any, refetch: () => void };
|
||
const orders: Order[] = data?.orders || [];
|
||
const totalOrders: number = data?.total || 0;
|
||
const totalPages: number = pageSize > 0 ? Math.ceil(totalOrders / pageSize) : 1;
|
||
|
||
// Вспомогательные функции для UI
|
||
const getStatusLabel = (status: string) => {
|
||
switch (status) {
|
||
case 'pending': return 'Ожидает оплаты';
|
||
case 'paid': return 'Оплачен';
|
||
case 'processing': return 'В обработке';
|
||
case 'shipped': return 'Отправлен';
|
||
case 'delivered': return 'Доставлен';
|
||
case 'cancelled': return 'Отменен';
|
||
default: return status;
|
||
}
|
||
};
|
||
const getStatusClass = (status: string) => {
|
||
switch (status) {
|
||
case 'pending': return 'secondary';
|
||
case 'paid': return 'default';
|
||
case 'processing': return 'outline';
|
||
case 'shipped': return 'default';
|
||
case 'delivered': return 'default';
|
||
case 'cancelled': return 'destructive';
|
||
default: return 'default';
|
||
}
|
||
};
|
||
const formatDate = (date: string | Date) => {
|
||
if (!date) return '';
|
||
return format(new Date(date), 'dd.MM.yyyy', { locale: ru });
|
||
};
|
||
const formatAmount = (amount: number) => {
|
||
return new Intl.NumberFormat('ru-RU', { style: 'currency', currency: 'RUB' }).format(amount);
|
||
};
|
||
|
||
return {
|
||
orders,
|
||
totalOrders,
|
||
totalPages,
|
||
isLoading,
|
||
error,
|
||
refetch,
|
||
getStatusLabel,
|
||
getStatusClass,
|
||
formatDate,
|
||
formatAmount,
|
||
};
|
||
}
|