From 8f6cccac1125561dcb8606a22034bce16fdd79d4 Mon Sep 17 00:00:00 2001 From: MartinBraquet Date: Fri, 1 Aug 2025 09:03:45 +0200 Subject: [PATCH] Pre setup generic dropdown --- app/components/dropdown.tsx | 55 ++++++++ app/profiles/ProfileFilters.tsx | 227 +++++++++++++++++--------------- 2 files changed, 177 insertions(+), 105 deletions(-) create mode 100644 app/components/dropdown.tsx diff --git a/app/components/dropdown.tsx b/app/components/dropdown.tsx new file mode 100644 index 00000000..a89652d9 --- /dev/null +++ b/app/components/dropdown.tsx @@ -0,0 +1,55 @@ +'use client'; + +type DropdownProps = { + id: string + options?: string[] + value: string + 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 +} + +export default function Dropdown( + { + id, + options, + value, + onChange, + onFocus, + onKeyDown, + setShowDropdown, + showDropdown, + }: DropdownProps +) { + return ( +
+
+ onChange(id, e.target.value)} + onFocus={() => onFocus?.(id)} + onKeyDown={(e) => onKeyDown?.(id, e.key)} + className="flex-1 min-w-0 block w-full px-3 py-2 rounded-l-md border-0 focus:ring-blue-500 focus:border-blue-500 sm:text-sm" + placeholder="Type to search" + /> + +
+
+ + ) +} diff --git a/app/profiles/ProfileFilters.tsx b/app/profiles/ProfileFilters.tsx index ea085b89..b7fab739 100644 --- a/app/profiles/ProfileFilters.tsx +++ b/app/profiles/ProfileFilters.tsx @@ -2,6 +2,7 @@ import {useEffect, useRef, useState} from 'react'; import {Gender} from "@prisma/client"; +import Dropdown from "@/app/components/dropdown"; interface FilterProps { filters: { @@ -22,6 +23,7 @@ export function ProfileFilters({filters, onFilterChange, onShowFilters, onToggle const [showFilters, setShowFilters] = useState(true); const [allCauseAreas, setAllCauseAreas] = useState<{ id: string, name: string }[]>([]); const [allInterests, setAllInterests] = useState<{ id: string, name: string }[]>([]); + const [allConnections, setAllConnections] = useState<{ id: string, name: string }[]>([]); const [selectedInterests, setSelectedInterests] = useState>(new Set()); const dropdownRef = useRef(null); const [showDropdown, setShowDropdown] = useState(false); @@ -35,8 +37,10 @@ export function ProfileFilters({filters, onFilterChange, onShowFilters, onToggle const data = await res.json(); setAllInterests(data.interests || []); setAllCauseAreas(data.causeAreas || []); + setAllConnections(data.desiredConnections || []); console.log('All interests:', data.interests); console.log('All cause areas:', data.causeAreas); + console.log('All Connections:', data.desiredConnections); // console.log('Gender', Gender); } } catch (error) { @@ -72,12 +76,123 @@ export function ProfileFilters({filters, onFilterChange, onShowFilters, onToggle }); }; - const handleKeyDown = (e: React.KeyboardEvent) => { - if (e.key === 'Escape') { + const handleKeyDown = (key: string) => { + if (key === 'Escape') { setShowDropdown(false); } }; + const dropdownConfig = [ + {id: "interests",}, + ] + + const [values, setValues] = useState>({ + v: "", + // showDropdown: false, + }) + + const handleChange = (id: string, value: string) => { + setValues((prev) => ({ ...prev, [id]: value })) + } + + const handleFocus = (id: string) => { + console.log(`Focused: ${id}`) + setShowDropdown[id](true) + } + + + function getDrowDown() { + return ( +
+
+ + + {dropdownConfig.map(({ id }) => ( + setShowDropdown[id]} + showDropdown={} + /> + ))} + + {(showDropdown) && ( +
+ {/* Filtered interests */} + {allInterests + .filter(interest => + interest.name.toLowerCase().includes(newInterest.toLowerCase()) + ) + .map((interest) => ( +
{ + onToggleFilter('interests', interest.name); + toggleInterest(interest.id); + // setNewInterest(''); + }} + > +
+ { + }} + onClick={(e) => { + e.stopPropagation(); + }} + /> + + {interest.name} + +
+
+ ))} +
+ )} +
+
+ {Array.from(selectedInterests).map(interestId => { + const interest = allInterests.find(i => i.id === interestId); + if (!interest) return null; + return ( + + {interest.name} + + + ); + })} +
+
+ ) + } return (
@@ -104,8 +219,9 @@ export function ProfileFilters({filters, onFilterChange, onShowFilters, onToggle className="absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-gray-600" type="button" > - - + + )} @@ -159,7 +275,7 @@ export function ProfileFilters({filters, onFilterChange, onShowFilters, onToggle
-
- -
-
- setNewInterest(e.target.value)} - onFocus={() => setShowDropdown(true)} - onKeyDown={handleKeyDown} - className="flex-1 min-w-0 block w-full px-3 py-2 rounded-l-md border-0 focus:ring-blue-500 focus:border-blue-500 sm:text-sm" - placeholder="Type to search" - /> - -
-
- - {(showDropdown) && ( -
- {/* Filtered interests */} - {allInterests - .filter(interest => - interest.name.toLowerCase().includes(newInterest.toLowerCase()) - ) - .map((interest) => ( -
{ - onToggleFilter('interests', interest.name); - toggleInterest(interest.id); - // setNewInterest(''); - }} - > -
- { - }} - onClick={(e) => { - e.stopPropagation(); - }} - /> - - {interest.name} - -
-
- ))} -
- )} -
- - - {/* Selected interests */} -
- {Array.from(selectedInterests).map(interestId => { - const interest = allInterests.find(i => i.id === interestId); - if (!interest) return null; - return ( - - {interest.name} - - - ); - })} -
+ {getDrowDown()} {/*
*/} {/* */}