~bigbes/lethe

ref: 7cffe38a672c0f5fc825235f496c72bebc9ee2b3 lethe/web/src/features/projects/useProjectsCursor.ts -rw-r--r-- 832 bytes
7cffe38a — Eugene Blikh web: add display preference modules a month ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import { useState, useCallback } from 'react'

export interface ProjectsCursor {
  cursor: number
  move(d: 1 | -1): void
  activate(): void
  jumpTo(i: number): void
}

export function useProjectsCursor(
  projectCount: number,
  onActivate: (idx: number) => void,
): ProjectsCursor {
  const [cursor, setCursor] = useState(0)

  const move = useCallback(
    (d: 1 | -1) => {
      if (projectCount === 0) return
      setCursor(c => Math.max(0, Math.min(projectCount - 1, c + d)))
    },
    [projectCount],
  )

  const activate = useCallback(() => {
    onActivate(cursor)
  }, [cursor, onActivate])

  const jumpTo = useCallback(
    (i: number) => {
      if (projectCount === 0) return
      setCursor(Math.max(0, Math.min(projectCount - 1, i)))
    },
    [projectCount],
  )

  return { cursor, move, activate, jumpTo }
}