diff --git a/src/pages/ImageGallery/ImageGalleryPage.jsx b/src/pages/ImageGallery/ImageGalleryPage.jsx index 0f6ff869..85f8cf85 100644 --- a/src/pages/ImageGallery/ImageGalleryPage.jsx +++ b/src/pages/ImageGallery/ImageGalleryPage.jsx @@ -22,14 +22,12 @@ const ImageGalleryPage = () => { const { openModal } = useModal(); const { setOffcanvasContent, setShowTrigger } = useFab(); - // Auto-select first project if none selected useEffect(() => { if (!selectedProjectId && projectNames?.length) { dispatch(setProjectId(projectNames[0].id)); } }, [selectedProjectId, projectNames, dispatch]); - // --- Filters state --- const [appliedFilters, setAppliedFilters] = useState({ buildingIds: [], floorIds: [], @@ -41,18 +39,11 @@ const ImageGalleryPage = () => { endDate: null, }); - const { - data, - fetchNextPage, - hasNextPage, - isLoading, - isFetchingNextPage, - refetch, - } = useImageGallery(selectedProjectId, appliedFilters); + const { data, fetchNextPage, hasNextPage, isLoading, isFetchingNextPage, refetch } = + useImageGallery(selectedProjectId, appliedFilters); const images = data?.pages.flatMap((page) => page.data) || []; - // --- Utility: store mappings independent of images --- const [labelMaps, setLabelMaps] = useState({ buildings: new Map(), floors: new Map(), @@ -92,31 +83,21 @@ const ImageGalleryPage = () => { }); }, [images]); - // --- Apply filters --- const handleApplyFilters = useCallback((values) => setAppliedFilters(values), []); - // --- Remove single filter --- const handleRemoveFilter = (filterKey, valueId) => { setAppliedFilters((prev) => { const updated = { ...prev }; - if (Array.isArray(updated[filterKey])) { updated[filterKey] = updated[filterKey].filter((id) => id !== valueId); - } - else if (filterKey === "startDate" || filterKey === "endDate") { - updated[filterKey] = null; - } - else if (filterKey === "dateRange") { + } else if (filterKey === "startDate" || filterKey === "endDate" || filterKey === "dateRange") { updated.startDate = null; updated.endDate = null; } - return updated; }); }; - - // --- Chips --- const appliedFiltersChips = useMemo(() => { const chips = []; const { buildings, floors, activities, workAreas, workCategories, uploadedByUsers } = labelMaps; @@ -139,6 +120,7 @@ const ImageGalleryPage = () => { appliedFilters.workCategoryIds?.forEach((id) => chips.push({ label: "Work Category", value: workCategories.get(id) || id, key: "workCategoryIds", id }) ); + if (appliedFilters.startDate || appliedFilters.endDate) { const start = appliedFilters.startDate ? moment(appliedFilters.startDate).format("DD MMM, YYYY") : ""; const end = appliedFilters.endDate ? moment(appliedFilters.endDate).format("DD MMM, YYYY") : ""; @@ -147,10 +129,8 @@ const ImageGalleryPage = () => { return chips; }, [appliedFilters, labelMaps]); - // --- Refetch on filter change --- useEffect(() => { refetch(); }, [appliedFilters, refetch]); - // --- Filter Panel --- const filterPanelElement = useMemo( () => ( { [labelMaps, appliedFilters, handleApplyFilters] ); - // --- Fab Offcanvas --- useEffect(() => { setShowTrigger(true); setOffcanvasContent("Gallery Filters", filterPanelElement); @@ -178,14 +157,12 @@ const ImageGalleryPage = () => { }; }, [filterPanelElement, setOffcanvasContent, setShowTrigger]); - // --- EventBus --- useEffect(() => { const handler = (data) => { if (data.projectId === selectedProjectId) refetch(); }; eventBus.on("image_gallery", handler); return () => eventBus.off("image_gallery", handler); }, [selectedProjectId, refetch]); - // --- Infinite scroll --- useEffect(() => { if (!loaderRef.current) return; const observer = new IntersectionObserver( @@ -199,77 +176,49 @@ const ImageGalleryPage = () => { }, [hasNextPage, isFetchingNextPage, isLoading, fetchNextPage]); return ( -
+
- {appliedFiltersChips.length > 0 && ( -
- Filters: + {/* Card wrapper */} +
+
- {/* Group chips by label */} - {["Building", "Floor", "Work Area", "Activity", "Uploaded By", "Work Category"].map((label) => { - const chipsForLabel = appliedFiltersChips.filter((chip) => chip.label === label); - if (chipsForLabel.length === 0) return null; - - return ( - - {label} : - {chipsForLabel.map((chip, idx) => ( - - {chip.value} -
)} + + {/* Gallery */} + {isLoading ? ( + + ) : ( + + )} +
- )} - - - {isLoading ? ( - - ) : ( - - )} - +
); };