Skip to content

Commit 989e579

Browse files
committed
fix: prevent negative selectedIndex in keyboard navigation
1 parent 05b97b3 commit 989e579

File tree

1 file changed

+13
-12
lines changed

1 file changed

+13
-12
lines changed

web/src/pages/Courts/CourtDetails/TopSearch.tsx

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ const CourtNameSpan = styled.span`
9898
color: ${({ theme }) => theme.primaryText};
9999
`;
100100

101-
function flattenCourts(court, parent = null) {
101+
function flattenCourts(court: any, parent: any = null) {
102102
const current = {
103103
...court,
104104
parentName: parent?.name ?? null,
@@ -114,7 +114,7 @@ const TopSearch: React.FC = () => {
114114
const items = useMemo(() => !isUndefined(data?.court) && [rootCourtToItems(data.court)], [data]);
115115
const isUniversity = isKlerosUniversity();
116116
const [search, setSearch] = useState("");
117-
const [selectedIndex, setSelectedIndex] = useState(-1);
117+
const [selectedIndex, setSelectedIndex] = useState(0);
118118

119119
const filteredCourts = useMemo(() => {
120120
if (!data?.court) return [];
@@ -131,31 +131,32 @@ const TopSearch: React.FC = () => {
131131
switch (e.key) {
132132
case "ArrowDown":
133133
e.preventDefault();
134-
setSelectedIndex((prev) => Math.min(prev + 1, filteredCourts.length - 1));
134+
setSelectedIndex((prev) => (prev + 1) % filteredCourts.length);
135135
break;
136136
case "ArrowUp":
137137
e.preventDefault();
138-
setSelectedIndex((prev) => Math.max(prev - 1, -1));
138+
setSelectedIndex((prev) => {
139+
const newIndex = prev - 1;
140+
return newIndex < 0 ? filteredCourts.length - 1 : newIndex;
141+
});
139142
break;
140143
case "Enter":
141-
if (selectedIndex >= 0) {
142-
navigate(`/courts/${filteredCourts[selectedIndex].id}`);
143-
setSearch("");
144-
setSelectedIndex(-1);
145-
}
144+
navigate(`/courts/${filteredCourts[selectedIndex].id}`);
145+
setSearch("");
146+
setSelectedIndex(0);
146147
break;
147148
}
148149
};
149150

150151
const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {
151152
setSearch(e.target.value);
152-
setSelectedIndex(-1);
153+
setSelectedIndex(0);
153154
};
154155

155156
const handleCourtClick = (courtId: string) => {
156157
navigate(`/courts/${courtId}`);
157158
setSearch("");
158-
setSelectedIndex(-1);
159+
setSelectedIndex(0);
159160
};
160161

161162
return (
@@ -181,7 +182,7 @@ const TopSearch: React.FC = () => {
181182
{filteredCourts.map((court, index) => (
182183
<StyledCard
183184
key={court.id}
184-
selected={selectedIndex === -1 && court.id === currentCourtId}
185+
selected={selectedIndex === 0 && court.id === currentCourtId}
185186
keyboardSelected={index === selectedIndex}
186187
onClick={() => handleCourtClick(court.id)}
187188
>

0 commit comments

Comments
 (0)