use-roving-index

Easily manage an active index that needs to be contained or wrap.

Usage no npm install needed!

<script type="module">
  import useRovingIndex from 'https://cdn.skypack.dev/use-roving-index';
</script>

README

⌨️ use-roving-index

Easily manage an active index that needs to be contained or wrap.

Install

yarn add use-roving-index
npm install use-roving-index

Usage

import React from 'react'
import { useRovingIndex } from 'use-roving-index'

const items = ['Item 1', 'Item 2', 'Item 3']

function App() {
  const {
    activeIndex,
    moveActiveIndex,
    moveBackward,
    moveBackwardDisabled,
    moveForward,
    moveForwardDisabled,
  } = useRovingIndex({ maxIndex: items.length - 1 })
  return (
    <>
      <ul
        tabIndex={0}
        onKeyDown={(event) => {
          const multiplier = event.shiftKey ? 3 : 1
          switch (event.key) {
            case 'ArrowUp':
            case 'ArrowLeft':
              moveActiveIndex(-1 * multiplier)
              break
            case 'ArrowDown':
            case 'ArrowRight':
              moveActiveIndex(1 * multiplier)
              break
          }
        }}
      >
        {items.map((title, index) => (
          <li
            key={title}
            style={{ backgroundColor: index === activeIndex && 'pink' }}
          >
            {title}
          </li>
        ))}
      </ul>
      <button disabled={moveBackwardDisabled} onClick={moveBackward}>
        Previous
      </button>
      <button disabled={moveForwardDisabled} onClick={moveForward}>
        Next
      </button>
    </>
  )
}