dressed_for_succes_store/frontend/lib/api-cache.ts

123 lines
3.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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