feat(settings): enhance scroll behavior in SettingModalContent

- Added a new state to track if the scroller is at the top.
- Implemented a scroll event listener to update the scroller state.
- Updated SettingsTitle component styling based on scroller position for improved visual feedback.

Signed-off-by: Innei <tukon479@gmail.com>
This commit is contained in:
Innei 2025-10-30 21:09:54 +08:00
parent 534a6a6ca4
commit d255d7d6a2
No known key found for this signature in database
GPG Key ID: 0F62D33977F021F7
1 changed files with 20 additions and 2 deletions

View File

@ -1,5 +1,5 @@
import { ScrollArea } from "@follow/components/ui/scroll-area/index.js"
import { cn } from "@follow/utils"
import { clsx, cn } from "@follow/utils"
import { repository } from "@pkg"
import type { FC } from "react"
import {
@ -51,6 +51,7 @@ const Content: FC<{
const pages = getSettingPages()
const { Component, loader } = pages[key]
const [scrollerAtTop, setScrollerAtTop] = useState(true)
const [scroller, setScroller] = useState<HTMLDivElement | null>(null)
const pendingSectionRef = useRef<string | null>(initialSection ?? null)
@ -67,6 +68,17 @@ const Content: FC<{
}
}, [key, scroller])
useEffect(() => {
if (!scroller) return
const handler = () => {
setScrollerAtTop(scroller.scrollTop < 20)
}
scroller.addEventListener("scroll", handler)
return () => {
scroller.removeEventListener("scroll", handler)
}
}, [scroller])
const scrollToSection = useCallback(
(sectionId: string) => {
if (!sectionId) return false
@ -99,7 +111,13 @@ const Content: FC<{
return (
<Suspense>
<SettingsTitle loader={loader} className="relative mb-0 px-8" />
<SettingsTitle
loader={loader}
className={clsx(
"relative mb-0 border-b border-transparent px-8 transition-colors duration-200",
!scrollerAtTop ? "border-border" : "",
)}
/>
<ModalClose />
<ScrollArea.ScrollArea
mask={false}