bemusic/bemuse

View on GitHub
bemuse/src/devtools/ui/BenchmarkPanel.tsx

Summary

Maintainability
A
0 mins
Test Coverage
import './BenchmarkPanel.scss'

import React, { MouseEvent, TouchEvent, useEffect, useState } from 'react'

const Table = ({ stats }: { stats: Record<string, unknown> }) => (
  <table>
    <tbody>
      {Object.keys(stats).map((key) => {
        const stat = stats[key]
        return (
          <tr key={key}>
            <td>
              <strong>{key}</strong>
            </td>
            <td align='right'>{'' + stat}</td>
          </tr>
        )
      })}
    </tbody>
  </table>
)

export interface BenchmarkPanelProps {
  bench: {
    stats: Record<string, unknown>
  }
}

const BenchmarkPanel = ({ bench }: BenchmarkPanelProps) => {
  const [show, setShow] = useState(false)
  const [, updater] = useState(false)

  useEffect(() => {
    const id = setInterval(() => updater((flag) => !flag), 1000)
    return () => {
      clearInterval(id)
    }
  }, [])

  const handleInteraction = (e: MouseEvent | TouchEvent) => {
    e.preventDefault()
    e.stopPropagation()
    setShow((flag) => !flag)
  }

  return (
    <div
      className='BenchmarkPanel'
      onClick={handleInteraction}
      onTouchStart={handleInteraction}
    >
      {show ? (
        <article>
          <b>Benchmark Stats</b>
          <br />
          <Table stats={bench.stats} />
        </article>
      ) : (
        'Show Benchmark Stats'
      )}
    </div>
  )
}

export default BenchmarkPanel