exercism/website

View on GitHub
app/javascript/components/mentoring/session/useIterationScrolling.tsx

Summary

Maintainability
A
1 hr
Test Coverage
import { useCallback, useState } from 'react'
import { Iteration } from '../../types'

export const iterationId = (iteration: Iteration): string => {
  return `iteration-${iteration.idx}`
}

export const useIterationScrolling = ({
  iterations,
  setIterations,
  on,
}: {
  iterations: readonly Iteration[]
  setIterations: React.Dispatch<React.SetStateAction<Iteration[]>>
  on: boolean
}) => {
  const [currentIteration, setCurrentIteration] = useState(
    iterations[iterations.length - 1]
  )

  const handleIterationScroll = useCallback(
    (iteration) => {
      if (!on) {
        return
      }

      setCurrentIteration(iteration)
    },
    [on]
  )

  const handleIterationClick = useCallback(
    (iteration: Iteration) => {
      setCurrentIteration(iteration)
      if (iteration.new) {
        setIterations((iters: Iteration[]) => {
          return iters.map((iter) => {
            if (iter.idx === iteration.idx) {
              return { ...iter, new: false }
            }
            return iter
          })
        })
      }

      if (!on) {
        return
      }

      window.location.href = `#${iterationId(iteration)}`
    },
    [on]
  )

  return { currentIteration, handleIterationScroll, handleIterationClick }
}