From 12a3a62d0e083d3351af6b6435b77e7fba163275 Mon Sep 17 00:00:00 2001 From: Sonny Date: Sat, 27 May 2023 02:29:34 +0200 Subject: [PATCH] refacto: clean & move search code to SearchList + selected item bg-color --- src/components/SearchModal/SearchList.tsx | 47 ++++++++++++-- src/components/SearchModal/SearchListItem.tsx | 9 ++- src/components/SearchModal/SearchModal.tsx | 62 ++++++++----------- src/components/SearchModal/search.module.scss | 13 ++++ src/pages/api/category/index.ts | 20 ++++++ 5 files changed, 108 insertions(+), 43 deletions(-) create mode 100644 src/pages/api/category/index.ts diff --git a/src/components/SearchModal/SearchList.tsx b/src/components/SearchModal/SearchList.tsx index 5b93a6d..8be3fca 100644 --- a/src/components/SearchModal/SearchList.tsx +++ b/src/components/SearchModal/SearchList.tsx @@ -1,20 +1,27 @@ -import { ReactNode, useMemo } from "react"; +import { ReactNode, useEffect, useMemo } from "react"; +import { useHotkeys } from "react-hotkeys-hook"; import { SearchItem } from "types"; import { groupItemBy } from "utils/array"; import SearchListItem from "./SearchListItem"; +import * as Keys from "constants/keys"; + import styles from "./search.module.scss"; +const isActiveItem = (item: SearchItem, otherItem: SearchItem) => + item?.id === otherItem?.id && item?.type === otherItem?.type; export default function SearchList({ items, + selectedItem, + setSelectedItem, noItem, - cursor, closeModal, }: { items: SearchItem[]; + selectedItem: SearchItem; + setSelectedItem: (item: SearchItem) => void; noItem?: ReactNode; - cursor: number; closeModal: () => void; }) { const searchItemsGrouped = useMemo( @@ -26,16 +33,44 @@ export default function SearchList({ [searchItemsGrouped] ); + const selectedItemIndex = useMemo( + () => items.findIndex((item) => isActiveItem(item, selectedItem)), + [items, selectedItem] + ); + + useHotkeys( + Keys.ARROW_UP, + () => setSelectedItem(items[selectedItemIndex - 1]), + { + enableOnFormTags: ["INPUT"], + enabled: items.length > 1 && selectedItemIndex !== 0, + preventDefault: true, + } + ); + useHotkeys( + Keys.ARROW_DOWN, + () => setSelectedItem(items[selectedItemIndex + 1]), + { + enableOnFormTags: ["INPUT"], + enabled: items.length > 1 && selectedItemIndex !== items.length - 1, + preventDefault: true, + } + ); + + useEffect(() => { + setSelectedItem(items[0]); + }, [items, setSelectedItem]); + return (