All files / src/components/forms PaletteIndexSelect.tsx

0% Statements 0/30
0% Branches 0/50
0% Functions 0/12
0% Lines 0/28

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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119                                                                                                                                                                                                                                             
import React, { FC, useEffect, useMemo, useState } from "react";
import { useAppSelector } from "store/hooks";
import l10n from "shared/lib/lang/l10n";
import {
  getLocalisedDMGPalette,
  getLocalisedPalettesLookup,
  sceneSelectors,
} from "store/features/entities/entitiesState";
import { Palette } from "shared/lib/entities/entitiesTypes";
import PaletteBlock from "components/forms/PaletteBlock";
import {
  OptionLabelWithPreview,
  Select,
  SingleValueWithPreview,
} from "ui/form/Select";
import { SingleValue } from "react-select";
 
interface PaletteIndexSelectProps {
  name: string;
  value?: number;
  onChange?: (newValue: number) => void;
}
 
interface PaletteIndexOption {
  value: number;
  label: string;
  palette?: Palette;
}
 
export const PaletteIndexSelect: FC<PaletteIndexSelectProps> = ({
  name,
  value = 0,
  onChange,
}) => {
  const [options, setOptions] = useState<PaletteIndexOption[]>([]);
  const [currentValue, setCurrentValue] = useState<PaletteIndexOption>();
 
  const previewAsSceneId = useAppSelector(
    (state) => state.editor.previewAsSceneId
  );
  const scene = useAppSelector((state) =>
    sceneSelectors.selectById(state, previewAsSceneId)
  );
  const palettesLookup = useAppSelector((state) =>
    getLocalisedPalettesLookup(state)
  );
  const defaultSpritePaletteIds = useAppSelector(
    (state) => state.project.present.settings.defaultSpritePaletteIds
  );
  const dmgPalette = useMemo(getLocalisedDMGPalette, []);
 
  useEffect(() => {
    setOptions(
      Array.from(Array(8)).map((_, index) => ({
        value: index,
        label: l10n("TOOL_PALETTE_N", { number: index + 1 }),
        palette:
          palettesLookup[
            scene
              ? scene.spritePaletteIds?.[index] ||
                defaultSpritePaletteIds[index]
              : defaultSpritePaletteIds[index]
          ],
      }))
    );
  }, [scene, palettesLookup, defaultSpritePaletteIds]);
 
  useEffect(() => {
    setCurrentValue(options.find((o) => o.value === value));
  }, [value, options]);
 
  return (
    <Select
      name={name}
      value={currentValue}
      options={options}
      onChange={(newValue: SingleValue<PaletteIndexOption>) => {
        Iif (newValue) {
          onChange?.(newValue.value);
        }
      }}
      formatOptionLabel={(option: PaletteIndexOption) => {
        return (
          <OptionLabelWithPreview
            preview={
              <PaletteBlock
                type="sprite"
                colors={option.palette?.colors || dmgPalette.colors}
                size={20}
              />
            }
          >
            {option.label}
            {": "}
            {option.palette?.name || dmgPalette.name}
          </OptionLabelWithPreview>
        );
      }}
      components={{
        SingleValue: () => (
          <SingleValueWithPreview
            preview={
              <PaletteBlock
                type="sprite"
                colors={currentValue?.palette?.colors || dmgPalette.colors}
                size={20}
              />
            }
          >
            {currentValue?.label}
            {": "}
            {currentValue?.palette?.name || dmgPalette.name}
          </SingleValueWithPreview>
        ),
      }}
    />
  );
};