summaryrefslogtreecommitdiff
path: root/src/lib/home/components/CategoryDynamicMobile.jsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/home/components/CategoryDynamicMobile.jsx')
-rw-r--r--src/lib/home/components/CategoryDynamicMobile.jsx97
1 files changed, 68 insertions, 29 deletions
diff --git a/src/lib/home/components/CategoryDynamicMobile.jsx b/src/lib/home/components/CategoryDynamicMobile.jsx
index 4a8f13cf..55654b0e 100644
--- a/src/lib/home/components/CategoryDynamicMobile.jsx
+++ b/src/lib/home/components/CategoryDynamicMobile.jsx
@@ -4,52 +4,91 @@ import Link from 'next/link';
import { createSlug } from '@/core/utils/slug';
import { Swiper, SwiperSlide } from 'swiper/react';
import 'swiper/css';
-import { fetchCategoryManagementSolr } from '../api/categoryManagementApi';
+import {
+ fetchCategoryManagementSolr,
+ fetchCategoryManagementVersion,
+} from '../api/categoryManagementApi';
+
+const saveToLocalStorage = (key, data, version) => {
+ const now = new Date();
+ const item = {
+ value: data,
+ version: version,
+ lastFetchedTime: now.getTime(),
+ };
+ localStorage.setItem(key, JSON.stringify(item));
+};
+
+const getFromLocalStorage = (key) => {
+ const itemStr = localStorage.getItem(key);
+ if (!itemStr) return null;
+
+ const item = JSON.parse(itemStr);
+ return item;
+};
+
+const getElapsedTime = (lastFetchedTime) => {
+ const now = new Date();
+ return now.getTime() - lastFetchedTime;
+};
const CategoryDynamicMobile = () => {
const [selectedCategory, setSelectedCategory] = useState({});
const [categoryManagement, setCategoryManagement] = useState([]);
const [isLoading, setIsLoading] = useState(false);
- const loadBrand = useCallback(async () => {
- setIsLoading(true);
- const items = await fetchCategoryManagementSolr();
+ const loadCategoryManagement = useCallback(async () => {
+ const cachedData = getFromLocalStorage('homepage_categoryDynamic');
+
+ if (cachedData) {
+ // Hitung selisih waktu antara saat ini dengan waktu terakhir data di-fetch
+ const elapsedTime = getElapsedTime(cachedData.lastFetchedTime);
+
+ if (elapsedTime < 24 * 60 * 60 * 1000) {
+ setCategoryManagement(cachedData.value);
+ return;
+ }
+ }
- setIsLoading(false);
- setCategoryManagement(items);
+ const latestVersion = await fetchCategoryManagementVersion();
+ if (cachedData && cachedData.version === latestVersion) {
+ // perbarui waktu
+ saveToLocalStorage(
+ 'homepage_categoryDynamic',
+ cachedData.value,
+ latestVersion
+ );
+ setCategoryManagement(cachedData.value);
+ } else {
+ setIsLoading(true);
+ const items = await fetchCategoryManagementSolr();
+ setIsLoading(false);
+
+ saveToLocalStorage('homepage_categoryDynamic', items, latestVersion);
+ setCategoryManagement(items);
+ }
}, []);
useEffect(() => {
- loadBrand();
- }, [loadBrand]);
+ loadCategoryManagement();
+ }, [loadCategoryManagement]);
useEffect(() => {
- const loadPromo = async () => {
- try {
- if (categoryManagement?.length > 0) {
- const initialSelections = categoryManagement.reduce(
- (acc, category) => {
- if (category.categories.length > 0) {
- acc[category.id] = category.categories[0].id_level_2;
- }
- return acc;
- },
- {}
- );
- setSelectedCategory(initialSelections);
+ if (categoryManagement?.length > 0) {
+ const initialSelections = categoryManagement.reduce((acc, category) => {
+ if (category.categories.length > 0) {
+ acc[category.id] = category.categories[0].id_level_2;
}
- } catch (loadError) {
- // console.error("Error loading promo items:", loadError);
- }
- };
-
- loadPromo();
+ return acc;
+ }, {});
+ setSelectedCategory(initialSelections);
+ }
}, [categoryManagement]);
- const handleCategoryLevel2Click = (categoryIdI, idLevel2) => {
+ const handleCategoryLevel2Click = (categoryId, idLevel2) => {
setSelectedCategory((prev) => ({
...prev,
- [categoryIdI]: idLevel2,
+ [categoryId]: idLevel2,
}));
};