123 lines
3.4 KiB
TypeScript
123 lines
3.4 KiB
TypeScript
import { QueryClient } from '@tanstack/react-query';
|
||
|
||
// Создаем экземпляр QueryClient для использования в приложении
|
||
export const queryClient = new QueryClient({
|
||
defaultOptions: {
|
||
queries: {
|
||
// Настройки по умолчанию для всех запросов
|
||
staleTime: 5 * 60 * 1000, // 5 минут
|
||
cacheTime: 10 * 60 * 1000, // 10 минут
|
||
retry: 1, // Одна повторная попытка при ошибке
|
||
refetchOnWindowFocus: false, // Не обновлять данные при фокусе окна
|
||
refetchOnMount: true, // Обновлять данные при монтировании компонента
|
||
},
|
||
},
|
||
});
|
||
|
||
/**
|
||
* Ключи кэша для различных типов данных
|
||
*/
|
||
export const cacheKeys = {
|
||
// Дашборд
|
||
dashboardStats: 'dashboard-stats',
|
||
recentOrders: 'recent-orders',
|
||
popularProducts: 'popular-products',
|
||
|
||
// Каталог
|
||
products: 'products',
|
||
product: (id: number | string) => ['product', id.toString()],
|
||
categories: 'categories',
|
||
collections: 'collections',
|
||
sizes: 'sizes',
|
||
|
||
// Заказы
|
||
orders: 'orders',
|
||
order: (id: number | string) => ['order', id.toString()],
|
||
|
||
// Пользователи
|
||
customers: 'customers',
|
||
customer: (id: number | string) => ['customer', id.toString()],
|
||
};
|
||
|
||
/**
|
||
* Функция для инвалидации кэша при изменении данных
|
||
* @param keys Массив ключей кэша для инвалидации
|
||
*/
|
||
export function invalidateCache(keys: string | string[] | (string | string[])[]): void {
|
||
const keysArray = Array.isArray(keys) ? keys : [keys];
|
||
|
||
keysArray.forEach(key => {
|
||
if (Array.isArray(key)) {
|
||
queryClient.invalidateQueries({ queryKey: key });
|
||
} else {
|
||
queryClient.invalidateQueries({ queryKey: [key] });
|
||
}
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Функция для инвалидации кэша продуктов
|
||
*/
|
||
export function invalidateProductsCache(): void {
|
||
invalidateCache([
|
||
cacheKeys.products,
|
||
cacheKeys.popularProducts,
|
||
// Также инвалидируем связанные данные
|
||
cacheKeys.dashboardStats
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* Функция для инвалидации кэша заказов
|
||
*/
|
||
export function invalidateOrdersCache(): void {
|
||
invalidateCache([
|
||
cacheKeys.orders,
|
||
cacheKeys.recentOrders,
|
||
// Также инвалидируем связанные данные
|
||
cacheKeys.dashboardStats
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* Функция для инвалидации кэша категорий
|
||
*/
|
||
export function invalidateCategoriesCache(): void {
|
||
invalidateCache([
|
||
cacheKeys.categories,
|
||
// Также инвалидируем связанные данные
|
||
cacheKeys.products
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* Функция для инвалидации кэша коллекций
|
||
*/
|
||
export function invalidateCollectionsCache(): void {
|
||
invalidateCache([
|
||
cacheKeys.collections,
|
||
// Также инвалидируем связанные данные
|
||
cacheKeys.products
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* Функция для инвалидации кэша размеров
|
||
*/
|
||
export function invalidateSizesCache(): void {
|
||
invalidateCache([
|
||
cacheKeys.sizes
|
||
]);
|
||
}
|
||
|
||
export default {
|
||
queryClient,
|
||
cacheKeys,
|
||
invalidateCache,
|
||
invalidateProductsCache,
|
||
invalidateOrdersCache,
|
||
invalidateCategoriesCache,
|
||
invalidateCollectionsCache,
|
||
invalidateSizesCache
|
||
};
|