ButtonsTabbed.jsx 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import { h } from 'preact';
  2. import { useCallback, useState } from 'preact/hooks';
  3. export default function ButtonsTabbed({
  4. viewModes = [''],
  5. setViewMode = null,
  6. setHeader = null,
  7. headers = [''],
  8. className = 'text-gray-600 py-0 px-4 block hover:text-gray-500',
  9. selectedClassName = `${className} focus:outline-none border-b-2 font-medium border-gray-500`
  10. }) {
  11. const [selected, setSelected] = useState(0);
  12. const captitalize = (str) => { return (`${str.charAt(0).toUpperCase()}${str.slice(1)}`); };
  13. const getHeader = useCallback((i) => {
  14. return (headers.length === viewModes.length ? headers[i] : captitalize(viewModes[i]));
  15. }, [headers, viewModes]);
  16. const handleClick = useCallback((i) => {
  17. setSelected(i);
  18. setViewMode && setViewMode(viewModes[i]);
  19. setHeader && setHeader(getHeader(i));
  20. }, [setViewMode, setHeader, setSelected, viewModes, getHeader]);
  21. setHeader && setHeader(getHeader(selected));
  22. return (
  23. <nav className="flex justify-end">
  24. {viewModes.map((item, i) => {
  25. return (
  26. <button onClick={() => handleClick(i)} className={i === selected ? selectedClassName : className}>
  27. {captitalize(item)}
  28. </button>
  29. );
  30. })}
  31. </nav>
  32. );
  33. }