import React, { useEffect, useState } from 'react'; import { Container, Box, Typography, TextField, MenuItem, Select, Slider, Button, Paper, InputAdornment, CircularProgress } from '@mui/material'; import SearchIcon from '@mui/icons-material/Search'; import FilterListIcon from '@mui/icons-material/FilterList'; import BuildCard from '../../components/BuildCard'; import BuildDetailsDialog from '../../components/BuildDetailsDialog'; import { onGetApprovedBuilds, onCloneBuild, onGetAuthState } from '../+Layout.telefunc'; export default function CompletedBuildsPage() { const [builds, setBuilds] = useState([]); const [loading, setLoading] = useState(true); const [userId, setUserId] = useState(null); const [selectedBuildId, setSelectedBuildId] = useState(null); const [sortBy, setSortBy] = useState('price_asc'); const [priceRange, setPriceRange] = useState([0, 5000]); const [searchQuery, setSearchQuery] = useState(""); const loadBuilds = async () => { setLoading(true); try { const [userData, data] = await Promise.all([ onGetAuthState(), onGetApprovedBuilds({q: searchQuery}) ]); setUserId(userData.userId); let sortedData = [...data]; switch (sortBy) { case 'price_asc': sortedData.sort((a, b) => Number(a.total_price) - Number(b.total_price)); break; case 'price_desc': sortedData.sort((a, b) => Number(b.total_price) - Number(a.total_price)); break; case 'rating_desc': sortedData.sort((a, b) => (Number(b.avgRating) || 0) - (Number(a.avgRating) || 0)); break; case 'oldest': sortedData.sort((a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime()); break; case 'newest': default: sortedData.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime()); break; } sortedData = sortedData.filter(b => { const price = Number(b.total_price); return price >= priceRange[0] && price <= priceRange[1]; }); setBuilds(sortedData); } catch (e) { console.error("Failed to load builds", e); } finally { setLoading(false); } }; useEffect(() => { loadBuilds(); }, [sortBy, searchQuery]); const handleClone = async (buildId: number) => { if (!userId) return alert("Please login to clone builds!"); if (confirm(`Clone this build?`)) { await onCloneBuild({buildId}); alert("Build cloned!"); setSelectedBuildId(null); } }; return ( Completed Builds Browse community configurations. Filter by price, components, or popularity. Filters setSearchQuery(e.target.value)} InputProps={{ startAdornment: , }} sx={{ mb: 3 }} /> Price Range setPriceRange(newValue as number[])} valueLabelDisplay="auto" min={0} max={5000} step={100} /> ${priceRange[0]} ${priceRange[1]}+ {builds.length} Builds Found Sort by: {loading ? ( ) : ( {builds.map((build) => ( setSelectedBuildId(build.id)} /> ))} {builds.length === 0 && ( No builds found matching your filters. )} )} {/* @ts-ignore */} setSelectedBuildId(null)} onClone={handleClone} /> ); }