mirror of
https://github.com/linsa-io/linsa.git
synced 2026-03-17 23:03:55 +01:00
* chore: remove useKeyDownListener * chore: remove react-use, update jazz version and add query string * chore: update jazz version * chore: use simple mac or win utils code * feat(util): add isTextInput * feat(hooks): all needed hooks * fix: link bunch stuff * fix: page bunch stuff * chore: bunch update for custom component * chore: use throttle from internal hook * chore: topic bunch stuff * chore: update layout * fix: truncate content header of topic detail
32 lines
935 B
TypeScript
32 lines
935 B
TypeScript
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 = (index: number) => {
|
|
const activeElement = elementRefs.current[index]
|
|
activeElement?.focus()
|
|
// 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, scrollActiveElementIntoView }
|
|
}
|