| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 | import state, { useSelector } from "state"
import styled from "styles"
import {
  ControlType,
  NumberCodeControl,
  SelectCodeControl,
  TextCodeControl,
  VectorCodeControl,
} from "types"
export default function Control({ id }: { id: string }) {
  const control = useSelector((s) => s.data.codeControls[id])
  if (!control) return null
  return (
    <>
      <label>{control.label}</label>
      {control.type === ControlType.Number ? (
        <NumberControl {...control} />
      ) : control.type === ControlType.Vector ? (
        <VectorControl {...control} />
      ) : control.type === ControlType.Text ? (
        <TextControl {...control} />
      ) : control.type === ControlType.Select ? (
        <SelectControl {...control} />
      ) : null}
    </>
  )
}
function NumberControl({ id, min, max, step, value }: NumberCodeControl) {
  return (
    <Inputs>
      <input
        type="range"
        min={min}
        max={max}
        step={step}
        value={value}
        onChange={(e) =>
          state.send("CHANGED_CODE_CONTROL", {
            [id]: Number(e.currentTarget.value),
          })
        }
      />
      <input
        type="number"
        min={min}
        max={max}
        step={step}
        value={value}
        onChange={(e) =>
          state.send("CHANGED_CODE_CONTROL", {
            [id]: Number(e.currentTarget.value),
          })
        }
      />
    </Inputs>
  )
}
function VectorControl({ id, value, isNormalized }: VectorCodeControl) {
  return (
    <Inputs>
      <input
        type="range"
        min={isNormalized ? -1 : -Infinity}
        max={isNormalized ? 1 : Infinity}
        step={0.01}
        value={value[0]}
        onChange={(e) =>
          state.send("CHANGED_CODE_CONTROL", {
            [id]: [Number(e.currentTarget.value), value[1]],
          })
        }
      />
      <input
        type="number"
        min={isNormalized ? -1 : -Infinity}
        max={isNormalized ? 1 : Infinity}
        step={0.01}
        value={value[0]}
        onChange={(e) =>
          state.send("CHANGED_CODE_CONTROL", {
            [id]: [Number(e.currentTarget.value), value[1]],
          })
        }
      />
      <input
        type="range"
        min={isNormalized ? -1 : -Infinity}
        max={isNormalized ? 1 : Infinity}
        step={0.01}
        value={value[1]}
        onChange={(e) =>
          state.send("CHANGED_CODE_CONTROL", {
            [id]: [value[0], Number(e.currentTarget.value)],
          })
        }
      />
      <input
        type="number"
        min={isNormalized ? -1 : -Infinity}
        max={isNormalized ? 1 : Infinity}
        step={0.01}
        value={value[1]}
        onChange={(e) =>
          state.send("CHANGED_CODE_CONTROL", {
            [id]: [value[0], Number(e.currentTarget.value)],
          })
        }
      />
    </Inputs>
  )
}
function TextControl({}: TextCodeControl) {
  return <></>
}
function SelectControl({}: SelectCodeControl) {
  return <></>
}
const Inputs = styled("div", {
  display: "flex",
  gap: "8px",
  height: "100%",
  "& input": {
    font: "$ui",
    width: "64px",
    fontSize: "$1",
    border: "1px solid $inputBorder",
    backgroundColor: "$input",
    color: "$text",
    height: "100%",
    padding: "0px 6px",
  },
  "& input[type='range']": {
    padding: 0,
    flexGrow: 2,
  },
})
 |