'use client'; import { useEffect, useState } from 'react'; interface SelectedFilters { banks: string[]; features: string[]; // Now holds card names instead of feature strings salary: string; } interface Bank { bankcode: string; bankname: string; } interface FeatureByCard { creditcardsname: string; feature: string; } interface FilterProps { selectedFilters: SelectedFilters; setSelectedFilters: React.Dispatch>; } const Filter: React.FC = ({ selectedFilters, setSelectedFilters }) => { const [banksList, setBanksList] = useState([]); const [features, setFeatures] = useState([]); const [loading, setLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(''); const [openSections, setOpenSections] = useState({ bank: true, feature: true, }); useEffect(() => { const fetchFilters = async () => { try { const res = await fetch('/api/cardlists/filters'); const data = await res.json(); setFeatures(data.featuresByCard || []); setBanksList(data.banks || []); } catch (err) { console.error('Filter API Fetch Error:', err); } finally { setLoading(false); } }; fetchFilters(); }, []); // Map from feature to list of card names having that feature const featureToCardNamesMap = features.reduce>((acc, item) => { if (!acc[item.feature]) { acc[item.feature] = []; } if (!acc[item.feature].includes(item.creditcardsname)) { acc[item.feature].push(item.creditcardsname); } return acc; }, {}); const handleCheckboxChange = (type: keyof SelectedFilters, value: string) => { if (type === 'features') { // Toggle card names related to the feature setSelectedFilters((prevFilters) => { let currentSelectedCards = prevFilters.features; // Holds card names const cardNamesForFeature = featureToCardNamesMap[value] || []; // Check if all card names for this feature are already selected const isSelected = cardNamesForFeature.every((cn) => currentSelectedCards.includes(cn)); let newSelectedCards: string[]; if (isSelected) { // Remove these card names newSelectedCards = currentSelectedCards.filter((cn) => !cardNamesForFeature.includes(cn)); } else { // Add these card names (avoid duplicates) newSelectedCards = Array.from(new Set([...currentSelectedCards, ...cardNamesForFeature])); } return { ...prevFilters, features: newSelectedCards, }; }); } else { // For other filters like banks setSelectedFilters((prevFilters) => { const currentArray = prevFilters[type] as string[]; return { ...prevFilters, [type]: currentArray.includes(value) ? currentArray.filter((item) => item !== value) : [...currentArray, value], }; }); } }; const toggleSection = (section: 'bank' | 'feature') => { setOpenSections((prev) => ({ ...prev, [section]: !prev[section] })); }; const clearAllFilters = () => { setSelectedFilters({ banks: [], features: [], salary: '0' }); }; // Filter features by card name search (for the search box) const filteredFeaturesByCardName = features .filter((f) => f.creditcardsname.toLowerCase().includes(searchTerm.toLowerCase()) ) .map((f) => f.feature); // Unique features for display const uniqueFilteredFeatures = Array.from(new Set(filteredFeaturesByCardName)); // Checkbox checked state: checked if ALL card names of that feature are selected const isFeatureChecked = (featureLabel: string) => { const cardNames = featureToCardNamesMap[featureLabel] || []; return cardNames.length > 0 && cardNames.every((cn) => selectedFilters.features.includes(cn)); }; return (

Filters

{/* Salary Range */}
setSelectedFilters({ ...selectedFilters, salary: e.target.value }) } />
{/* Bank Filters Accordion */}
{openSections.bank && (
{loading ? (

Loading banks...

) : ( banksList.map((bank) => ( )) )}
)}
{/* Feature Filters Accordion */}
{openSections.feature && ( <> {/* Search Bar */} setSearchTerm(e.target.value)} className="w-full mb-2 px-2 py-1 border rounded text-sm" />
{loading ? (

Loading features...

) : uniqueFilteredFeatures.length === 0 ? (

No features found.

) : ( uniqueFilteredFeatures.map((featureLabel, index) => ( )) )}
)}
); }; export default Filter;