summaryrefslogtreecommitdiff
path: root/src/components/FpsMultiplierControl.tsx
blob: 1fd0e785490fff25f7317f65b76fd53d16ebaa7e (plain)
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
import { Focusable, PanelSectionRow, SliderField } from "@decky/ui";
import { useEffect, useRef } from "react";
import { ConfigurationData } from "../config/configSchema";
import { MULTIPLIER } from "../config/generatedConfigSchema";
import t from "../i18n/i18n";

interface FpsMultiplierControlProps {
  config: ConfigurationData;
  onConfigChange: (fieldName: keyof ConfigurationData, value: boolean | number | string | string[]) => Promise<void>;
  autoFocus?: boolean;
  onAutoFocus?: () => void;
}

export function FpsMultiplierControl({
  config,
  onConfigChange,
  autoFocus = false,
  onAutoFocus,
}: FpsMultiplierControlProps) {
  const focusableRef = useRef<HTMLDivElement>(null);

  useEffect(() => {
    if (!autoFocus) return;
    const frame = requestAnimationFrame(() => {
      const target = focusableRef.current?.querySelector<HTMLElement>(
        '[role="button"], [role="slider"]',
      );
      target?.focus();
      onAutoFocus?.();
    });
    return () => cancelAnimationFrame(frame);
  }, [autoFocus, onAutoFocus]);

  const multiplierLabel = config.multiplier === 1
    ? t("MULTIPLIER_OFF", "Off")
    : `${config.multiplier}x`;

  return (
    <PanelSectionRow>
      <Focusable ref={focusableRef} noFocusRing>
        <SliderField
          label={`FPS multiplier · ${multiplierLabel}`}
          value={config.multiplier}
          min={1}
          max={4}
          step={1}
          notchCount={4}
          showValue={false}
          onChange={(value) => void onConfigChange(MULTIPLIER, value)}
        />
      </Focusable>
    </PanelSectionRow>
  );
}