aboutsummaryrefslogtreecommitdiffstats
path: root/packages/excalidraw/components/ButtonIconCycle.tsx
blob: b73a8ec5af90344a55965ac911920d675cec7aa2 (plain) (blame)
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
import type { JSX } from "react";
import clsx from "clsx";

export const ButtonIconCycle = <T extends any>({
  options,
  value,
  onChange,
  group,
}: {
  options: { value: T; text: string; icon: JSX.Element }[];
  value: T | null;
  onChange: (value: T) => void;
  group: string;
}) => {
  const current = options.find((op) => op.value === value);

  const cycle = () => {
    const index = options.indexOf(current!);
    const next = (index + 1) % options.length;
    onChange(options[next].value);
  };

  return (
    <label key={group} className={clsx({ active: current!.value !== null })}>
      <input type="button" name={group} onClick={cycle} />
      {current!.icon}
    </label>
  );
};