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