import React, { useState, useEffect } from "react"; import { Layers, Filter } from "lucide-react"; import SearchInput from "@/shared/components/search-input"; import { useQueryParam, StringParam } from "use-query-params"; import GroupMapset from "./group-mapset"; import { useQuery } from "@tanstack/react-query"; import organizationApi from "@/shared/services/organization"; import categoryApi from "@/shared/services/category"; // Add this import import { useAtom } from "jotai"; import { activeTabAtom } from "../../../state/active-tab"; import { selectedMapsetAtom } from "../../../state/mapset-dialog"; import { Organization } from "@/shared/types/organization"; import { Category } from "@/shared/types/category"; import { Button } from "@/shared/components/ui/button"; import { Popover, PopoverContent, PopoverTrigger } from "@/shared/components/ui/popover"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/shared/components/ui/select"; const MapsetList: React.FC = () => { const [query] = useQueryParam("query", StringParam); const [producerId, setProducerId] = useQueryParam("producer_id", StringParam); const [categoryId, setCategoryId] = useQueryParam("category_id", StringParam); const [searchTerm, setSearchTerm] = useState(query || ""); const [debouncedSearchTerm, setDebouncedSearchTerm] = useState(searchTerm); const [isSearching, setIsSearching] = useState(false); const [activeTab] = useAtom(activeTabAtom); const [selectedMapset, setSelectedMapset] = useAtom(selectedMapsetAtom); const [orgFilterEnabled, setOrgFilterEnabled] = useState(false); const [popoverOpen, setPopoverOpen] = useState(false); const [pendingOrgId, setPendingOrgId] = useState(undefined); const { data: organizations, isLoading: isLoadingOrganizations } = useQuery({ queryKey: ["organizations"], queryFn: () => organizationApi.getOrganizations(undefined, { skipAuth: true }).then((res) => res.items), enabled: activeTab === "organization", }); const { data: singleOrganization, isLoading: isLoadingSingleOrganization } = useQuery({ queryKey: ["organization", producerId], queryFn: () => organizationApi.getOrganizationById(producerId as string, { skipAuth: true }), enabled: activeTab === "organization" && !!producerId && orgFilterEnabled, }); // When a specific category_id is provided (coming from CategorySection), fetch only that category const { data: singleCategory, isLoading: isLoadingSingleCategory } = useQuery({ queryKey: ["category", categoryId], queryFn: () => categoryApi.getCategoryById(categoryId as string, { skipAuth: true }), enabled: activeTab === "category" && !!categoryId, }); const { data: categories, isLoading: isLoadingCategories } = useQuery({ queryKey: ["categories"], queryFn: () => categoryApi.getCategories(undefined, { skipAuth: true }).then((res) => res.items), enabled: activeTab === "category" && !categoryId, }); const isDataLoading = (activeTab === "organization" && (isLoadingOrganizations || (producerId && orgFilterEnabled ? isLoadingSingleOrganization : false))) || (activeTab === "category" && (categoryId ? isLoadingSingleCategory : isLoadingCategories)); let items: (Organization | Category)[] = []; if (activeTab === "organization" && producerId && orgFilterEnabled) { items = singleOrganization ? [singleOrganization] : []; } else if (activeTab === "organization") { items = organizations || []; } else if (activeTab === "category") { items = categoryId ? (singleCategory ? [singleCategory] : []) : categories || []; } useEffect(() => { setSearchTerm(query || ""); }, [query]); useEffect(() => { setIsSearching(true); const handler = setTimeout(() => { setDebouncedSearchTerm(searchTerm); setIsSearching(false); }, 300); return () => { clearTimeout(handler); }; }, [searchTerm]); useEffect(() => { if (activeTab === "organization" && producerId) { setOrgFilterEnabled(true); } }, [activeTab, producerId]); const handleSearch = (value: string) => { setSearchTerm(value); }; if (isDataLoading) { return (

{`Loading ${activeTab === "organization" ? "organizations" : "categories"}...`}

); } return (
{activeTab === "category" && categoryId && (
Filter: Kategori {singleCategory?.name ? : null} {singleCategory?.name ? {singleCategory.name} : null}
)}
{activeTab === "organization" && ( { setPopoverOpen(open); if (open) { setPendingOrgId((producerId as string) || undefined); } }} > {false && <>} { const target = e.target as HTMLElement; if (target && target.closest('[data-slot="select-content"]')) { e.preventDefault(); } }} >
Filter organisasi
)}
{isSearching ? (

Mencari dataset...

) : items?.length === 0 ? (

No layers found matching "{debouncedSearchTerm}"

) : (
{ // eslint-disable-next-line @typescript-eslint/no-explicit-any items?.map((item: any) => ( )) }
)}
); }; export default MapsetList;