Add age filtering

This commit is contained in:
MartinBraquet
2025-07-31 15:23:43 +02:00
parent 5a381a5dc3
commit 7a2cece1f3
3 changed files with 50 additions and 1 deletions

View File

@@ -6,6 +6,8 @@ export async function GET(request: Request) {
const url = new URL(request.url);
const page = parseInt(url.searchParams.get("page") || "1");
const gender = url.searchParams.get("gender");
const minAge = url.searchParams.get("minAge");
const maxAge = url.searchParams.get("maxAge");
const interests = url.searchParams.get("interests")?.split(",").filter(Boolean) || [];
const causeAreas = url.searchParams.get("causeAreas")?.split(",").filter(Boolean) || [];
const searchQuery = url.searchParams.get("search") || "";
@@ -28,6 +30,23 @@ export async function GET(request: Request) {
};
}
// Add age filtering
const currentYear = new Date().getFullYear();
if (minAge || maxAge) {
where.profile = {
...where.profile,
birthYear: {}
};
if (minAge) {
where.profile.birthYear.lte = currentYear - parseInt(minAge);
}
if (maxAge) {
where.profile.birthYear.gte = currentYear - parseInt(maxAge);
}
}
// OR
// if (interests.length > 0) {
// where.profile = {

View File

@@ -9,6 +9,8 @@ interface FilterProps {
interests: string[];
causeAreas: string[];
searchQuery: string;
minAge?: number;
maxAge?: number;
};
onFilterChange: (key: string, value: any) => void;
onShowFilters: (value: boolean) => void;
@@ -134,11 +136,35 @@ export function ProfileFilters({filters, onFilterChange, onShowFilters, onToggle
))}
</select>
</div>
<div>
<label className="block text-sm font-medium text-gray-700 dark:text-white mb-1">Min Age</label>
<input
type="number"
min="18"
max="100"
className="w-full p-2 border rounded-lg"
value={filters.minAge || ''}
onChange={(e) => onFilterChange('minAge', e.target.value ? parseInt(e.target.value) : undefined)}
placeholder="Min"
/>
</div>
<div>
<label className="block text-sm font-medium text-gray-700 dark:text-white mb-1">Max Age</label>
<input
type="number"
min="18"
max="100"
className="w-full p-2 border rounded-lg"
value={filters.maxAge || ''}
onChange={(e) => onFilterChange('maxAge', e.target.value ? parseInt(e.target.value) : undefined)}
placeholder="Max"
/>
</div>
</div>
<div className="relative" ref={dropdownRef}>
<label className="block text-sm font-medium text-gray-700 dark:text-white mb-2">
Interests
Core Interests
</label>
<div className="relative">
<div className="flex items-center border border-gray-300 rounded-md shadow-sm">

View File

@@ -19,6 +19,8 @@ export default function ProfilePage() {
const [images, setImages] = useState<string[]>([])
const [filters, setFilters] = useState({
gender: '',
minAge: null,
maxAge: null,
interests: [] as string[],
causeAreas: [] as string[],
searchQuery: '',
@@ -43,6 +45,8 @@ export default function ProfilePage() {
const params = new URLSearchParams();
if (filters.gender) params.append('gender', filters.gender);
if (filters.minAge) params.append('minAge', filters.minAge);
if (filters.maxAge) params.append('maxAge', filters.maxAge);
if (filters.interests.length > 0) params.append('interests', filters.interests.join(','));
if (filters.causeAreas.length > 0) params.append('causeAreas', filters.causeAreas.join(','));
if (filters.searchQuery) params.append('search', filters.searchQuery);