import React, {useEffect, useState} from 'react'; import { Dialog, DialogContent, IconButton, Grid, Box, Typography, Slider, FormControl, InputLabel, Select, MenuItem, Checkbox, ListItemText, Card, CardContent, CardMedia, Button, CircularProgress, Divider, AppBar, Toolbar } from '@mui/material'; import CloseIcon from '@mui/icons-material/Close'; import FilterListIcon from '@mui/icons-material/FilterList'; import SortIcon from '@mui/icons-material/Sort'; import {onGetAllComponents} from '../pages/+Layout.telefunc'; import ComponentDetailsDialog from "./ComponentDetailsDialog"; const formatMoney = (amount: number) => `$${amount}`; export default function ComponentBrowserDialog({open, category, onClose}: any) { const [components, setComponents] = useState([]); const [loading, setLoading] = useState(false); const [selectedComponent, setSelectedComponent] = useState(null); const [priceRange, setPriceRange] = useState([0, 2000]); const [selectedBrands, setSelectedBrands] = useState([]); const [availableBrands, setAvailableBrands] = useState([]); const [sortOrder, setSortOrder] = useState('default'); useEffect(() => { if (open && category) { setLoading(true); setSortOrder('price_desc'); onGetAllComponents({componentType: category}) .then((data) => { setComponents(data); const brands = Array.from(new Set(data.map((c: any) => c.brand))); setAvailableBrands(brands as string[]); const maxPrice = data.length > 0 ? Math.max(...data.map((c: any) => Number(c.price))) : 2000; setPriceRange([0, Math.ceil(maxPrice)]); }) .catch(console.error) .finally(() => setLoading(false)); } }, [open, category]); let processedComponents = components.filter(comp => { const matchesBrand = selectedBrands.length === 0 || selectedBrands.includes(comp.brand); const matchesPrice = Number(comp.price) >= priceRange[0] && Number(comp.price) <= priceRange[1]; return matchesBrand && matchesPrice; }); if (sortOrder === 'price_asc') { processedComponents.sort((a, b) => Number(a.price) - Number(b.price)); } else if (sortOrder === 'price_desc') { processedComponents.sort((a, b) => Number(b.price) - Number(a.price)); } const handleBrandChange = (event: any) => { const value = event.target.value; setSelectedBrands(typeof value === 'string' ? value.split(',') : value); }; if (!open) return null; return ( Browsing: {category === 'gpu' ? 'Graphics Cards' : category?.toUpperCase()} Sort By Price Filters Price Range setPriceRange(newValue as number[])} valueLabelDisplay="auto" min={0} max={components.length > 0 ? Math.max(...components.map(c => Number(c.price))) : 2000} sx={{color: '#ff8201', mb: 2}} /> {formatMoney(priceRange[0])} {formatMoney(priceRange[1])} Brands {loading ? ( ) : ( {processedComponents.map((comp) => ( {comp.brand} {comp.name} {formatMoney(comp.price)} ))} {processedComponents.length === 0 && ( No components match. )} )} setSelectedComponent(null)} /> ); }