From 740304c0c393fa7e974d9a5fb9d02a978055f789 Mon Sep 17 00:00:00 2001 From: MartinBraquet Date: Fri, 1 Aug 2025 11:21:37 +0200 Subject: [PATCH] Add connections and cause areas to filter --- app/api/profiles/route.ts | 48 +++++++-- app/components/dropdown.tsx | 9 +- app/profiles/ProfileFilters.tsx | 181 ++++++++++++++++---------------- app/profiles/page.tsx | 13 ++- 4 files changed, 143 insertions(+), 108 deletions(-) diff --git a/app/api/profiles/route.ts b/app/api/profiles/route.ts index 17bf22be..1c5634e6 100644 --- a/app/api/profiles/route.ts +++ b/app/api/profiles/route.ts @@ -10,6 +10,7 @@ export async function GET(request: Request) { 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 connections = url.searchParams.get("connections")?.split(",").filter(Boolean) || []; const searchQuery = url.searchParams.get("search") || ""; const profilesPerPage = 100; @@ -37,11 +38,11 @@ export async function GET(request: Request) { ...where.profile, birthYear: {} }; - + if (minAge) { where.profile.birthYear.lte = currentYear - parseInt(minAge); } - + if (maxAge) { where.profile.birthYear.gte = currentYear - parseInt(maxAge); } @@ -65,11 +66,11 @@ export async function GET(request: Request) { if (interests.length > 0) { where.profile = { ...where.profile, - AND: interests.map((interestName) => ({ + AND: interests.map((name) => ({ intellectualInterests: { some: { interest: { - name: interestName, + name: name, }, }, }, @@ -77,19 +78,46 @@ export async function GET(request: Request) { }; } - if (causeAreas.length > 0) { + // OR + if (connections.length > 0) { where.profile = { ...where.profile, - causeAreas: { + desiredConnections: { some: { - causeArea: { - name: {in: causeAreas}, + connection: { + name: {in: connections}, }, }, }, }; } + if (causeAreas.length > 0) { + // where.profile = { + // ...where.profile, + // causeAreas: { + // some: { + // causeArea: { + // name: {in: causeAreas}, + // }, + // }, + // }, + // }; + // } + where.profile = { + ...where.profile, + AND: causeAreas.map((name) => ({ + causeAreas: { + some: { + causeArea: { + name: name, + }, + }, + }, + })), + }; + } + if (searchQuery) { where.OR = [ {name: {contains: searchQuery, mode: 'insensitive'}}, @@ -118,7 +146,7 @@ export async function GET(request: Request) { } // Fetch paginated and filtered profiles - const cacheStrategy = { swr: 60, ttl: 60 , tags: ["profiles"]}; + const cacheStrategy = {swr: 60, ttl: 60, tags: ["profiles"]}; const profiles = await prisma.user.findMany({ skip: offset, take: profilesPerPage, @@ -127,7 +155,7 @@ export async function GET(request: Request) { select: { id: true, name: true, - email: true, + // email: true, image: true, createdAt: true, profile: { diff --git a/app/components/dropdown.tsx b/app/components/dropdown.tsx index a89652d9..18a70c4c 100644 --- a/app/components/dropdown.tsx +++ b/app/components/dropdown.tsx @@ -7,9 +7,7 @@ type DropdownProps = { onChange: (id: string, value: string) => void onFocus?: (id: string) => void onKeyDown?: (id: string, key: string) => void - onClick?: (id: string) => void - setShowDropdown: (id: boolean) => void - showDropdown: boolean + onClick: (id: string) => void } export default function Dropdown( @@ -20,8 +18,7 @@ export default function Dropdown( onChange, onFocus, onKeyDown, - setShowDropdown, - showDropdown, + onClick, }: DropdownProps ) { return ( @@ -38,7 +35,7 @@ export default function Dropdown( />