From 00eb6bed2b4112c83b46d234b66c461bcee8f353 Mon Sep 17 00:00:00 2001 From: BiggerRain <15911122312@163.COM> Date: Sat, 11 Oct 2025 17:08:53 +0800 Subject: [PATCH] feat: support pageup/pagedown to navigate search results (#920) * feat: support pageup/pagedown to navigate search results * docs: add release note --- docs/content.en/docs/release-notes/_index.md | 1 + src/components/Common/Scrollbar.tsx | 47 ++++++++++++++++++++ src/components/Search/DocumentList.tsx | 13 +++--- src/components/Search/DropdownList.tsx | 7 +-- 4 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 src/components/Common/Scrollbar.tsx diff --git a/docs/content.en/docs/release-notes/_index.md b/docs/content.en/docs/release-notes/_index.md index 4fb9f731..d348ec87 100644 --- a/docs/content.en/docs/release-notes/_index.md +++ b/docs/content.en/docs/release-notes/_index.md @@ -16,6 +16,7 @@ Information about release notes of Coco App is provided here. feat: support switching groups via keyboard shortcuts #911 feat: support opening logs from about page #915 feat: support moving cursor with home and end keys #918 +feat: support pageup/pagedown to navigate search results #920 ### 🐛 Bug fix diff --git a/src/components/Common/Scrollbar.tsx b/src/components/Common/Scrollbar.tsx new file mode 100644 index 00000000..62b56530 --- /dev/null +++ b/src/components/Common/Scrollbar.tsx @@ -0,0 +1,47 @@ +import { useEventListener } from "ahooks"; +import clsx from "clsx"; +import { + forwardRef, + HTMLAttributes, + useImperativeHandle, + useRef, +} from "react"; + +const Scrollbar = forwardRef>( + (props, ref) => { + const { children, className, ...rest } = props; + const containerRef = useRef(null); + + useImperativeHandle(ref, () => containerRef.current as HTMLDivElement); + + useEventListener("keydown", (event) => { + const { key } = event; + + if (key !== "PageDown" && key !== "PageUp") return; + + if (!containerRef.current) return; + + event.preventDefault(); + + const delta = key === "PageDown" ? 1 : -1; + const el = containerRef.current; + + el.scrollBy({ + top: delta * el.clientHeight * 0.9, + behavior: "smooth", + }); + }); + + return ( +
+ {children} +
+ ); + } +); + +export default Scrollbar; diff --git a/src/components/Search/DocumentList.tsx b/src/components/Search/DocumentList.tsx index 9c38e6ee..c9bc127f 100644 --- a/src/components/Search/DocumentList.tsx +++ b/src/components/Search/DocumentList.tsx @@ -1,6 +1,9 @@ import React, { useState, useRef, useEffect, useCallback } from "react"; import { useInfiniteScroll } from "ahooks"; import { useTranslation } from "react-i18next"; +import { Data } from "ahooks/lib/useInfiniteScroll/types"; +import { nanoid } from "nanoid"; +import { isNil } from "lodash-es"; import { useSearchStore } from "@/stores/searchStore"; import { SearchHeader } from "./SearchHeader"; @@ -11,9 +14,7 @@ import { Get } from "@/api/axiosRequest"; import { useAppStore } from "@/stores/appStore"; import { useConnectStore } from "@/stores/connectStore"; import SearchEmpty from "../Common/SearchEmpty"; -import { Data } from "ahooks/lib/useInfiniteScroll/types"; -import { nanoid } from "nanoid"; -import { isNil } from "lodash-es"; +import Scrollbar from "@/components/Common/Scrollbar"; interface DocumentListProps { onSelectDocument: (id: string) => void; @@ -297,8 +298,8 @@ export const DocumentList: React.FC = ({ /> -
{data?.list && data.list.length > 0 && ( @@ -334,7 +335,7 @@ export const DocumentList: React.FC = ({
)} - + ); }; diff --git a/src/components/Search/DropdownList.tsx b/src/components/Search/DropdownList.tsx index a5af2d96..d2ef9b2c 100644 --- a/src/components/Search/DropdownList.tsx +++ b/src/components/Search/DropdownList.tsx @@ -16,6 +16,7 @@ import { useKeyboardNavigation } from "@/hooks/useKeyboardNavigation"; import { SearchSource } from "./SearchSource"; import DropdownListItem from "./DropdownListItem"; import platformAdapter from "@/utils/platformAdapter"; +import Scrollbar from "@/components/Common/Scrollbar"; type ISearchData = Record; @@ -149,10 +150,10 @@ function DropdownList({ }); return ( -
))} -
+ ); }