@react-pakistan/util-functions 1.25.8 → 1.25.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/api/stellar-solutions/bank/cache.d.ts +0 -104
  2. package/api/stellar-solutions/bank/cache.js +237 -295
  3. package/api/stellar-solutions/bank/index.d.ts +1 -1
  4. package/api/stellar-solutions/bank/index.js +0 -15
  5. package/api/stellar-solutions/branch/cache.d.ts +0 -102
  6. package/api/stellar-solutions/branch/cache.js +241 -295
  7. package/api/stellar-solutions/branch/index.d.ts +1 -1
  8. package/api/stellar-solutions/branch/index.js +0 -15
  9. package/api/stellar-solutions/company/cache.d.ts +0 -106
  10. package/api/stellar-solutions/company/cache.js +247 -307
  11. package/api/stellar-solutions/company/index.d.ts +1 -1
  12. package/api/stellar-solutions/company/index.js +0 -15
  13. package/api/stellar-solutions/constants.d.ts +0 -2
  14. package/api/stellar-solutions/constants.js +1 -3
  15. package/api/stellar-solutions/contact/cache.d.ts +0 -108
  16. package/api/stellar-solutions/contact/cache.js +247 -307
  17. package/api/stellar-solutions/contact/index.d.ts +1 -1
  18. package/api/stellar-solutions/contact/index.js +0 -15
  19. package/api/stellar-solutions/currency/cache.d.ts +0 -104
  20. package/api/stellar-solutions/currency/cache.js +243 -295
  21. package/api/stellar-solutions/currency/index.d.ts +1 -1
  22. package/api/stellar-solutions/currency/index.js +0 -15
  23. package/api/stellar-solutions/customer/cache.d.ts +0 -108
  24. package/api/stellar-solutions/customer/cache.js +249 -307
  25. package/api/stellar-solutions/customer/index.d.ts +1 -1
  26. package/api/stellar-solutions/customer/index.js +0 -15
  27. package/api/stellar-solutions/expense/cache.d.ts +0 -106
  28. package/api/stellar-solutions/expense/cache.js +247 -307
  29. package/api/stellar-solutions/expense/index.d.ts +1 -1
  30. package/api/stellar-solutions/expense/index.js +0 -15
  31. package/api/stellar-solutions/expense-category/cache.d.ts +0 -94
  32. package/api/stellar-solutions/expense-category/cache.js +224 -280
  33. package/api/stellar-solutions/expense-category/index.d.ts +1 -1
  34. package/api/stellar-solutions/expense-category/index.js +0 -15
  35. package/api/stellar-solutions/payment-mode/cache.d.ts +0 -102
  36. package/api/stellar-solutions/payment-mode/cache.js +245 -295
  37. package/api/stellar-solutions/payment-mode/index.d.ts +1 -1
  38. package/api/stellar-solutions/payment-mode/index.js +0 -15
  39. package/api/stellar-solutions/preference/cache.d.ts +0 -90
  40. package/api/stellar-solutions/preference/cache.js +218 -268
  41. package/api/stellar-solutions/preference/index.d.ts +1 -1
  42. package/api/stellar-solutions/preference/index.js +0 -15
  43. package/api/stellar-solutions/product/cache.d.ts +0 -94
  44. package/api/stellar-solutions/product/cache.js +222 -280
  45. package/api/stellar-solutions/product/index.d.ts +1 -1
  46. package/api/stellar-solutions/product/index.js +0 -15
  47. package/api/stellar-solutions/product-category/cache.d.ts +0 -94
  48. package/api/stellar-solutions/product-category/cache.js +224 -280
  49. package/api/stellar-solutions/product-category/index.d.ts +1 -1
  50. package/api/stellar-solutions/product-category/index.js +0 -15
  51. package/api/stellar-solutions/tax/cache.d.ts +0 -102
  52. package/api/stellar-solutions/tax/cache.js +235 -295
  53. package/api/stellar-solutions/tax/index.d.ts +1 -1
  54. package/api/stellar-solutions/tax/index.js +0 -15
  55. package/constants/cache-time.d.ts +3 -0
  56. package/constants/cache-time.js +6 -0
  57. package/constants/index.d.ts +2 -1
  58. package/constants/index.js +2 -1
  59. package/general/generic-cache.d.ts +143 -0
  60. package/general/generic-cache.js +411 -0
  61. package/general/index.d.ts +1 -0
  62. package/general/index.js +1 -0
  63. package/package.json +1 -1
@@ -10,20 +10,6 @@ var __assign = (this && this.__assign) || function () {
10
10
  };
11
11
  return __assign.apply(this, arguments);
12
12
  };
13
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
- if (k2 === undefined) k2 = k;
15
- var desc = Object.getOwnPropertyDescriptor(m, k);
16
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
- desc = { enumerable: true, get: function() { return m[k]; } };
18
- }
19
- Object.defineProperty(o, k2, desc);
20
- }) : (function(o, m, k, k2) {
21
- if (k2 === undefined) k2 = k;
22
- o[k2] = m[k];
23
- }));
24
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
25
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
26
- };
27
13
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
28
14
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
29
15
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -71,7 +57,6 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
71
57
  };
72
58
  Object.defineProperty(exports, "__esModule", { value: true });
73
59
  exports.deleteProduct = exports.updateProduct = exports.unitProductById = exports.listProduct = void 0;
74
- __exportStar(require("./cache"), exports);
75
60
  var multi_part_search_1 = require("../../../general/multi-part-search");
76
61
  /**
77
62
  * Retrieves a paginated list of products
@@ -1,94 +0,0 @@
1
- import { ProductCategoryBE } from '../type';
2
- /**
3
- * Synchronous utility function to get product categories from cache only
4
- * Returns cached data immediately if available and fresh, otherwise returns empty array
5
- * Does not trigger any API calls
6
- *
7
- * @returns ProductCategoryBE[] - Array of cached product categories or empty array
8
- *
9
- * @example
10
- * const categories = getCachedProductCategoriesSync();
11
- * if (categories.length > 0) {
12
- * console.log(categories[0].name);
13
- * }
14
- */
15
- export declare const getCachedProductCategoriesSync: () => {
16
- count: number;
17
- items: ProductCategoryBE[];
18
- };
19
- /**
20
- * Utility function to get product categories from cache or fetch from API
21
- *
22
- * This function manages a localStorage cache of product categories with the following logic:
23
- * - If categories exist in cache and are less than 1 week old, return cached version
24
- * - If categories exist but are older than 1 week, fetch fresh data and update cache
25
- * - If categories don't exist in cache, fetch from API and cache them
26
- *
27
- * @param searchQuery - Optional search query to filter categories
28
- * @param filters - Optional filters object to apply additional filtering (bypasses cache)
29
- * @param pageLimit - Number of categories to fetch (default: 100)
30
- * @returns Promise<ProductCategoryBE[]> - Array of product categories
31
- *
32
- * @example
33
- * const categories = await getCachedProductCategories();
34
- * console.log(categories[0].name);
35
- *
36
- * // With search
37
- * const filtered = await getCachedProductCategories('Electronics');
38
- *
39
- * // With filters
40
- * const filteredCategories = await getCachedProductCategories(undefined, { enabled: true });
41
- */
42
- export declare const getCachedProductCategories: (searchQuery?: string, filters?: Record<string, unknown>, pageLimit?: number) => Promise<{
43
- count: number;
44
- items: ProductCategoryBE[];
45
- }>;
46
- /**
47
- * Utility function to get a specific product category by ID from cache
48
- * If not found in cache, returns null (does not trigger API call)
49
- *
50
- * @param categoryId - The ID of the category to retrieve
51
- * @returns ProductCategoryBE | null - The category or null if not found
52
- *
53
- * @example
54
- * const category = getCachedProductCategoryById('cat-123');
55
- * if (category) {
56
- * console.log(category.name);
57
- * }
58
- */
59
- export declare const getCachedProductCategoryById: (categoryId: string) => ProductCategoryBE | null;
60
- /**
61
- * Utility function to invalidate (remove) product categories from cache
62
- * Useful when categories have been updated and you want to force a refresh
63
- *
64
- * @example
65
- * invalidateProductCategoriesCache();
66
- * const freshCategories = await getCachedProductCategories();
67
- */
68
- export declare const invalidateProductCategoriesCache: () => void;
69
- /**
70
- * Utility function to preload product categories into cache
71
- * Useful to call on app initialization or login
72
- *
73
- * @returns Promise<ProductCategoryBE[]> - Array of preloaded categories
74
- *
75
- * @example
76
- * // On app initialization
77
- * await preloadProductCategories();
78
- */
79
- export declare const preloadProductCategories: () => Promise<{
80
- count: number;
81
- items: ProductCategoryBE[];
82
- }>;
83
- /**
84
- * Utility function to check if product categories cache is stale
85
- * Returns true if cache is older than 1 week or doesn't exist
86
- *
87
- * @returns boolean - True if cache is stale or doesn't exist
88
- *
89
- * @example
90
- * if (isProductCategoriesCacheStale()) {
91
- * await getCachedProductCategories(); // This will fetch fresh data
92
- * }
93
- */
94
- export declare const isProductCategoriesCacheStale: () => boolean;
@@ -1,280 +1,224 @@
1
- "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
- return new (P || (P = Promise))(function (resolve, reject) {
16
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
- step((generator = generator.apply(thisArg, _arguments || [])).next());
20
- });
21
- };
22
- var __generator = (this && this.__generator) || function (thisArg, body) {
23
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
24
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
- function verb(n) { return function (v) { return step([n, v]); }; }
26
- function step(op) {
27
- if (f) throw new TypeError("Generator is already executing.");
28
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
- if (y = 0, t) op = [op[0] & 2, t.value];
31
- switch (op[0]) {
32
- case 0: case 1: t = op; break;
33
- case 4: _.label++; return { value: op[1], done: false };
34
- case 5: _.label++; y = op[1]; op = [0]; continue;
35
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
- default:
37
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
- if (t[2]) _.ops.pop();
42
- _.trys.pop(); continue;
43
- }
44
- op = body.call(thisArg, _);
45
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
- }
48
- };
49
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
50
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
51
- if (ar || !(i in from)) {
52
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
53
- ar[i] = from[i];
54
- }
55
- }
56
- return to.concat(ar || Array.prototype.slice.call(from));
57
- };
58
- Object.defineProperty(exports, "__esModule", { value: true });
59
- exports.isProductCategoriesCacheStale = exports.preloadProductCategories = exports.invalidateProductCategoriesCache = exports.getCachedProductCategoryById = exports.getCachedProductCategories = exports.getCachedProductCategoriesSync = void 0;
60
- var constants_1 = require("../constants");
61
- var type_1 = require("../type");
62
- var api_methods_1 = require("../../../constants/api-methods");
63
- var fetch_data_1 = require("../../../general/fetch-data");
64
- var get_storage_value_1 = require("../../../local-storage/get-storage-value");
65
- var set_storage_value_1 = require("../../../local-storage/set-storage-value");
66
- /**
67
- * Synchronous utility function to get product categories from cache only
68
- * Returns cached data immediately if available and fresh, otherwise returns empty array
69
- * Does not trigger any API calls
70
- *
71
- * @returns ProductCategoryBE[] - Array of cached product categories or empty array
72
- *
73
- * @example
74
- * const categories = getCachedProductCategoriesSync();
75
- * if (categories.length > 0) {
76
- * console.log(categories[0].name);
77
- * }
78
- */
79
- var getCachedProductCategoriesSync = function () {
80
- try {
81
- var cachedData = (0, get_storage_value_1.getStorageValue)(type_1.LS_KEYS.PRODUCT_CATEGORIES);
82
- if (!cachedData) {
83
- return { count: 0, items: [] };
84
- }
85
- var currentTime = new Date().getTime();
86
- var cachedTime = new Date(cachedData.cachedAt).getTime();
87
- var ageInMs = currentTime - cachedTime;
88
- // If cached data is less than 1 week old, return it
89
- if (ageInMs < constants_1.ONE_DAY_IN_MS) {
90
- return {
91
- count: cachedData.productCategories.length,
92
- items: cachedData.productCategories,
93
- };
94
- }
95
- return { count: 0, items: [] };
96
- }
97
- catch (error) {
98
- console.error('Error getting cached product categories:', error);
99
- return { count: 0, items: [] };
100
- }
101
- };
102
- exports.getCachedProductCategoriesSync = getCachedProductCategoriesSync;
103
- /**
104
- * Utility function to get product categories from cache or fetch from API
105
- *
106
- * This function manages a localStorage cache of product categories with the following logic:
107
- * - If categories exist in cache and are less than 1 week old, return cached version
108
- * - If categories exist but are older than 1 week, fetch fresh data and update cache
109
- * - If categories don't exist in cache, fetch from API and cache them
110
- *
111
- * @param searchQuery - Optional search query to filter categories
112
- * @param filters - Optional filters object to apply additional filtering (bypasses cache)
113
- * @param pageLimit - Number of categories to fetch (default: 100)
114
- * @returns Promise<ProductCategoryBE[]> - Array of product categories
115
- *
116
- * @example
117
- * const categories = await getCachedProductCategories();
118
- * console.log(categories[0].name);
119
- *
120
- * // With search
121
- * const filtered = await getCachedProductCategories('Electronics');
122
- *
123
- * // With filters
124
- * const filteredCategories = await getCachedProductCategories(undefined, { enabled: true });
125
- */
126
- var getCachedProductCategories = function (searchQuery_1, filters_1) {
127
- var args_1 = [];
128
- for (var _i = 2; _i < arguments.length; _i++) {
129
- args_1[_i - 2] = arguments[_i];
130
- }
131
- return __awaiter(void 0, __spreadArray([searchQuery_1, filters_1], args_1, true), void 0, function (searchQuery, filters, pageLimit) {
132
- var response_1, cachedData, currentTime, cachedTime, ageInMs, response, updatedCache, error_1;
133
- var _a;
134
- if (pageLimit === void 0) { pageLimit = 100; }
135
- return __generator(this, function (_b) {
136
- switch (_b.label) {
137
- case 0:
138
- _b.trys.push([0, 4, , 5]);
139
- if (!((searchQuery && searchQuery.trim()) ||
140
- (filters && Object.keys(filters).length > 0))) return [3 /*break*/, 2];
141
- return [4 /*yield*/, (0, fetch_data_1.fetchData)({
142
- url: constants_1.API_ROUTES.PRODUCT_CATEGORIES,
143
- body: JSON.stringify(__assign(__assign({ searchQuery: searchQuery }, filters), { pageLimit: pageLimit, currentPage: 1 })),
144
- method: api_methods_1.API_METHODS.POST,
145
- })];
146
- case 1:
147
- response_1 = _b.sent();
148
- return [2 /*return*/, (response_1 === null || response_1 === void 0 ? void 0 : response_1.data) || { count: 0, items: [] }];
149
- case 2:
150
- cachedData = (0, get_storage_value_1.getStorageValue)(type_1.LS_KEYS.PRODUCT_CATEGORIES);
151
- currentTime = new Date().getTime();
152
- // Check if cached data exists and is still fresh
153
- if (cachedData) {
154
- cachedTime = new Date(cachedData.cachedAt).getTime();
155
- ageInMs = currentTime - cachedTime;
156
- // If cached data is less than 1 week old, return it
157
- if (ageInMs < constants_1.ONE_DAY_IN_MS) {
158
- return [2 /*return*/, {
159
- count: cachedData.productCategories.length,
160
- items: cachedData.productCategories,
161
- }];
162
- }
163
- }
164
- return [4 /*yield*/, (0, fetch_data_1.fetchData)({
165
- url: constants_1.API_ROUTES.PRODUCT_CATEGORIES,
166
- body: JSON.stringify({
167
- pageLimit: pageLimit,
168
- currentPage: 1,
169
- }),
170
- method: api_methods_1.API_METHODS.POST,
171
- })];
172
- case 3:
173
- response = _b.sent();
174
- if ((_a = response === null || response === void 0 ? void 0 : response.data) === null || _a === void 0 ? void 0 : _a.items) {
175
- updatedCache = {
176
- productCategories: response.data.items,
177
- cachedAt: new Date().toISOString(),
178
- };
179
- (0, set_storage_value_1.setStorageValue)(type_1.LS_KEYS.PRODUCT_CATEGORIES, updatedCache);
180
- return [2 /*return*/, response.data];
181
- }
182
- return [2 /*return*/, { count: 0, items: [] }];
183
- case 4:
184
- error_1 = _b.sent();
185
- console.error('Error fetching product categories:', error_1);
186
- return [2 /*return*/, { count: 0, items: [] }];
187
- case 5: return [2 /*return*/];
188
- }
189
- });
190
- });
191
- };
192
- exports.getCachedProductCategories = getCachedProductCategories;
193
- /**
194
- * Utility function to get a specific product category by ID from cache
195
- * If not found in cache, returns null (does not trigger API call)
196
- *
197
- * @param categoryId - The ID of the category to retrieve
198
- * @returns ProductCategoryBE | null - The category or null if not found
199
- *
200
- * @example
201
- * const category = getCachedProductCategoryById('cat-123');
202
- * if (category) {
203
- * console.log(category.name);
204
- * }
205
- */
206
- var getCachedProductCategoryById = function (categoryId) {
207
- if (!categoryId) {
208
- return null;
209
- }
210
- try {
211
- var productCategories = (0, exports.getCachedProductCategoriesSync)().items;
212
- return productCategories.find(function (cat) { return cat.id === categoryId; }) || null;
213
- }
214
- catch (error) {
215
- console.error('Error getting cached product category by ID:', error);
216
- return null;
217
- }
218
- };
219
- exports.getCachedProductCategoryById = getCachedProductCategoryById;
220
- /**
221
- * Utility function to invalidate (remove) product categories from cache
222
- * Useful when categories have been updated and you want to force a refresh
223
- *
224
- * @example
225
- * invalidateProductCategoriesCache();
226
- * const freshCategories = await getCachedProductCategories();
227
- */
228
- var invalidateProductCategoriesCache = function () {
229
- try {
230
- localStorage.removeItem(type_1.LS_KEYS.PRODUCT_CATEGORIES);
231
- }
232
- catch (error) {
233
- console.error('Error invalidating product categories cache:', error);
234
- }
235
- };
236
- exports.invalidateProductCategoriesCache = invalidateProductCategoriesCache;
237
- /**
238
- * Utility function to preload product categories into cache
239
- * Useful to call on app initialization or login
240
- *
241
- * @returns Promise<ProductCategoryBE[]> - Array of preloaded categories
242
- *
243
- * @example
244
- * // On app initialization
245
- * await preloadProductCategories();
246
- */
247
- var preloadProductCategories = function () { return __awaiter(void 0, void 0, void 0, function () {
248
- return __generator(this, function (_a) {
249
- return [2 /*return*/, (0, exports.getCachedProductCategories)()];
250
- });
251
- }); };
252
- exports.preloadProductCategories = preloadProductCategories;
253
- /**
254
- * Utility function to check if product categories cache is stale
255
- * Returns true if cache is older than 1 week or doesn't exist
256
- *
257
- * @returns boolean - True if cache is stale or doesn't exist
258
- *
259
- * @example
260
- * if (isProductCategoriesCacheStale()) {
261
- * await getCachedProductCategories(); // This will fetch fresh data
262
- * }
263
- */
264
- var isProductCategoriesCacheStale = function () {
265
- try {
266
- var cachedData = (0, get_storage_value_1.getStorageValue)(type_1.LS_KEYS.PRODUCT_CATEGORIES);
267
- if (!cachedData) {
268
- return true;
269
- }
270
- var currentTime = new Date().getTime();
271
- var cachedTime = new Date(cachedData.cachedAt).getTime();
272
- var ageInMs = currentTime - cachedTime;
273
- return ageInMs >= constants_1.ONE_DAY_IN_MS;
274
- }
275
- catch (error) {
276
- console.error('Error checking product categories cache staleness:', error);
277
- return true;
278
- }
279
- };
280
- exports.isProductCategoriesCacheStale = isProductCategoriesCacheStale;
1
+ // import { API_ROUTES } from '../constants';
2
+ // import { ProductCategoryBE, LS_KEYS } from '../type';
3
+ // import { API_METHODS } from '../../../constants/api-methods';
4
+ // import { fetchData } from '../../../general/fetch-data';
5
+ // import { getStorageValue } from '../../../local-storage/get-storage-value';
6
+ // import { setStorageValue } from '../../../local-storage/set-storage-value';
7
+ // import { ONE_DAY_IN_MS } from '../../../constants';
8
+ // interface CachedProductCategories {
9
+ // productCategories: ProductCategoryBE[];
10
+ // cachedAt: string;
11
+ // }
12
+ // /**
13
+ // * Synchronous utility function to get product categories from cache only
14
+ // * Returns cached data immediately if available and fresh, otherwise returns empty array
15
+ // * Does not trigger any API calls
16
+ // *
17
+ // * @returns ProductCategoryBE[] - Array of cached product categories or empty array
18
+ // *
19
+ // * @example
20
+ // * const categories = getCachedProductCategoriesSync();
21
+ // * if (categories.length > 0) {
22
+ // * console.log(categories[0].name);
23
+ // * }
24
+ // */
25
+ // export const getCachedProductCategoriesSync = (): {
26
+ // count: number;
27
+ // items: ProductCategoryBE[];
28
+ // } => {
29
+ // try {
30
+ // const cachedData = getStorageValue(
31
+ // LS_KEYS.PRODUCT_CATEGORIES
32
+ // ) as CachedProductCategories | null;
33
+ // if (!cachedData) {
34
+ // return { count: 0, items: [] };
35
+ // }
36
+ // const currentTime = new Date().getTime();
37
+ // const cachedTime = new Date(cachedData.cachedAt).getTime();
38
+ // const ageInMs = currentTime - cachedTime;
39
+ // // If cached data is less than 1 week old, return it
40
+ // if (ageInMs < ONE_DAY_IN_MS) {
41
+ // return {
42
+ // count: cachedData.productCategories.length,
43
+ // items: cachedData.productCategories,
44
+ // };
45
+ // }
46
+ // return { count: 0, items: [] };
47
+ // } catch (error) {
48
+ // console.error('Error getting cached product categories:', error);
49
+ // return { count: 0, items: [] };
50
+ // }
51
+ // };
52
+ // /**
53
+ // * Utility function to get product categories from cache or fetch from API
54
+ // *
55
+ // * This function manages a localStorage cache of product categories with the following logic:
56
+ // * - If categories exist in cache and are less than 1 week old, return cached version
57
+ // * - If categories exist but are older than 1 week, fetch fresh data and update cache
58
+ // * - If categories don't exist in cache, fetch from API and cache them
59
+ // *
60
+ // * @param searchQuery - Optional search query to filter categories
61
+ // * @param filters - Optional filters object to apply additional filtering (bypasses cache)
62
+ // * @param pageLimit - Number of categories to fetch (default: 100)
63
+ // * @returns Promise<ProductCategoryBE[]> - Array of product categories
64
+ // *
65
+ // * @example
66
+ // * const categories = await getCachedProductCategories();
67
+ // * console.log(categories[0].name);
68
+ // *
69
+ // * // With search
70
+ // * const filtered = await getCachedProductCategories('Electronics');
71
+ // *
72
+ // * // With filters
73
+ // * const filteredCategories = await getCachedProductCategories(undefined, { enabled: true });
74
+ // */
75
+ // export const getCachedProductCategories = async (
76
+ // searchQuery?: string,
77
+ // filters?: Record<string, unknown>,
78
+ // pageLimit: number = 100
79
+ // ): Promise<{ count: number; items: ProductCategoryBE[] }> => {
80
+ // try {
81
+ // // If there's a search query or filters, always fetch fresh data (don't use cache)
82
+ // if (
83
+ // (searchQuery && searchQuery.trim()) ||
84
+ // (filters && Object.keys(filters).length > 0)
85
+ // ) {
86
+ // const response = await fetchData({
87
+ // url: API_ROUTES.PRODUCT_CATEGORIES,
88
+ // body: JSON.stringify({
89
+ // searchQuery,
90
+ // ...filters,
91
+ // pageLimit,
92
+ // currentPage: 1,
93
+ // }),
94
+ // method: API_METHODS.POST,
95
+ // });
96
+ // return response?.data || { count: 0, items: [] };
97
+ // }
98
+ // // Get the cached data from localStorage
99
+ // const cachedData = getStorageValue(
100
+ // LS_KEYS.PRODUCT_CATEGORIES
101
+ // ) as CachedProductCategories | null;
102
+ // const currentTime = new Date().getTime();
103
+ // // Check if cached data exists and is still fresh
104
+ // if (cachedData) {
105
+ // const cachedTime = new Date(cachedData.cachedAt).getTime();
106
+ // const ageInMs = currentTime - cachedTime;
107
+ // // If cached data is less than 1 week old, return it
108
+ // if (ageInMs < ONE_DAY_IN_MS) {
109
+ // return {
110
+ // count: cachedData.productCategories.length,
111
+ // items: cachedData.productCategories,
112
+ // };
113
+ // }
114
+ // }
115
+ // // If no cached data or data is older than 1 week, fetch fresh data
116
+ // const response = await fetchData({
117
+ // url: API_ROUTES.PRODUCT_CATEGORIES,
118
+ // body: JSON.stringify({
119
+ // pageLimit,
120
+ // currentPage: 1,
121
+ // }),
122
+ // method: API_METHODS.POST,
123
+ // });
124
+ // if (response?.data?.items) {
125
+ // // Update the cache with fresh data
126
+ // const updatedCache: CachedProductCategories = {
127
+ // productCategories: response.data.items,
128
+ // cachedAt: new Date().toISOString(),
129
+ // };
130
+ // setStorageValue(LS_KEYS.PRODUCT_CATEGORIES, updatedCache);
131
+ // return response.data;
132
+ // }
133
+ // return { count: 0, items: [] };
134
+ // } catch (error) {
135
+ // console.error('Error fetching product categories:', error);
136
+ // return { count: 0, items: [] };
137
+ // }
138
+ // };
139
+ // /**
140
+ // * Utility function to get a specific product category by ID from cache
141
+ // * If not found in cache, returns null (does not trigger API call)
142
+ // *
143
+ // * @param categoryId - The ID of the category to retrieve
144
+ // * @returns ProductCategoryBE | null - The category or null if not found
145
+ // *
146
+ // * @example
147
+ // * const category = getCachedProductCategoryById('cat-123');
148
+ // * if (category) {
149
+ // * console.log(category.name);
150
+ // * }
151
+ // */
152
+ // export const getCachedProductCategoryById = (
153
+ // categoryId: string
154
+ // ): ProductCategoryBE | null => {
155
+ // if (!categoryId) {
156
+ // return null;
157
+ // }
158
+ // try {
159
+ // const productCategories = getCachedProductCategoriesSync().items;
160
+ // return productCategories.find((cat) => cat.id === categoryId) || null;
161
+ // } catch (error) {
162
+ // console.error('Error getting cached product category by ID:', error);
163
+ // return null;
164
+ // }
165
+ // };
166
+ // /**
167
+ // * Utility function to invalidate (remove) product categories from cache
168
+ // * Useful when categories have been updated and you want to force a refresh
169
+ // *
170
+ // * @example
171
+ // * invalidateProductCategoriesCache();
172
+ // * const freshCategories = await getCachedProductCategories();
173
+ // */
174
+ // export const invalidateProductCategoriesCache = (): void => {
175
+ // try {
176
+ // localStorage.removeItem(LS_KEYS.PRODUCT_CATEGORIES);
177
+ // } catch (error) {
178
+ // console.error('Error invalidating product categories cache:', error);
179
+ // }
180
+ // };
181
+ // /**
182
+ // * Utility function to preload product categories into cache
183
+ // * Useful to call on app initialization or login
184
+ // *
185
+ // * @returns Promise<ProductCategoryBE[]> - Array of preloaded categories
186
+ // *
187
+ // * @example
188
+ // * // On app initialization
189
+ // * await preloadProductCategories();
190
+ // */
191
+ // export const preloadProductCategories = async (): Promise<{
192
+ // count: number;
193
+ // items: ProductCategoryBE[];
194
+ // }> => {
195
+ // return getCachedProductCategories();
196
+ // };
197
+ // /**
198
+ // * Utility function to check if product categories cache is stale
199
+ // * Returns true if cache is older than 1 week or doesn't exist
200
+ // *
201
+ // * @returns boolean - True if cache is stale or doesn't exist
202
+ // *
203
+ // * @example
204
+ // * if (isProductCategoriesCacheStale()) {
205
+ // * await getCachedProductCategories(); // This will fetch fresh data
206
+ // * }
207
+ // */
208
+ // export const isProductCategoriesCacheStale = (): boolean => {
209
+ // try {
210
+ // const cachedData = getStorageValue(
211
+ // LS_KEYS.PRODUCT_CATEGORIES
212
+ // ) as CachedProductCategories | null;
213
+ // if (!cachedData) {
214
+ // return true;
215
+ // }
216
+ // const currentTime = new Date().getTime();
217
+ // const cachedTime = new Date(cachedData.cachedAt).getTime();
218
+ // const ageInMs = currentTime - cachedTime;
219
+ // return ageInMs >= ONE_DAY_IN_MS;
220
+ // } catch (error) {
221
+ // console.error('Error checking product categories cache staleness:', error);
222
+ // return true;
223
+ // }
224
+ // };