All files / Bandstand/src/components RestoreButton.tsx

0% Statements 0/52
100% Branches 1/1
100% Functions 1/1
0% Lines 0/52

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65                                                                                                                                 
'use client'
 
import {useRouter} from 'next/navigation'
import {useState} from 'react'
 
export default function RestoreButton({
  songId,
  number,
}: {
  songId: string
  number: number
}) {
  const router = useRouter()
  const [state, setState] = useState<'idle' | 'confirm' | 'busy' | 'error'>(
    'idle',
  )
 
  async function restore() {
    setState('busy')
    const r = await fetch(`/api/songs/${songId}/versions/${number}/restore`, {
      method: 'POST',
    })
    if (!r.ok) return setState('error')
    const {number: n} = await r.json()
    router.push(`?v=${n}`)
    router.refresh()
    setState('idle')
  }
 
  if (state === 'confirm' || state === 'busy')
    return (
      <span className="flex items-center gap-2">
        <span className="text-sm text-muted">
          Save version {number} as the current chart?
        </span>
        <button
          type="button"
          onClick={restore}
          disabled={state === 'busy'}
          className="min-h-11 rounded-lg bg-accent px-4 font-bold text-on-accent"
        >
          Restore
        </button>
        <button
          type="button"
          onClick={() => setState('idle')}
          className="min-h-11 px-2 text-muted"
        >
          Cancel
        </button>
      </span>
    )
  return (
    <button
      type="button"
      onClick={() => setState('confirm')}
      className="min-h-11 rounded-lg border border-amber px-4 font-semibold text-amber"
    >
      {state === 'error'
        ? 'Restore failed — try again'
        : `Restore version ${number}`}
    </button>
  )
}