mirror of
https://github.com/linsa-io/linsa.git
synced 2026-01-12 12:20:23 +01:00
fix(link): Navigate between item and fix Enter keybind (#165)
* feat: add item scroll to active * fix: reset enterkey and scroll to view * fix: link item displayName
This commit is contained in:
30
web/hooks/use-active-item-scroll.ts
Normal file
30
web/hooks/use-active-item-scroll.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
import { useEffect, useRef, useCallback } from "react"
|
||||
|
||||
type ElementRef<T extends HTMLElement> = T | null
|
||||
type ElementRefs<T extends HTMLElement> = ElementRef<T>[]
|
||||
|
||||
interface ActiveItemScrollOptions {
|
||||
activeIndex: number | null
|
||||
}
|
||||
|
||||
export function useActiveItemScroll<T extends HTMLElement>(options: ActiveItemScrollOptions) {
|
||||
const { activeIndex } = options
|
||||
const elementRefs = useRef<ElementRefs<T>>([])
|
||||
|
||||
const scrollActiveElementIntoView = useCallback((index: number) => {
|
||||
const activeElement = elementRefs.current[index]
|
||||
activeElement?.scrollIntoView({ block: "nearest" })
|
||||
}, [])
|
||||
|
||||
useEffect(() => {
|
||||
if (activeIndex !== null) {
|
||||
scrollActiveElementIntoView(activeIndex)
|
||||
}
|
||||
}, [activeIndex, scrollActiveElementIntoView])
|
||||
|
||||
const setElementRef = useCallback((element: ElementRef<T>, index: number) => {
|
||||
elementRefs.current[index] = element
|
||||
}, [])
|
||||
|
||||
return setElementRef
|
||||
}
|
||||
Reference in New Issue
Block a user