import { useRef } from "react"; import { twMerge } from "tailwind-merge"; import { disableHotkeyInput, enableHotkeyInput, DomLevels, } from "~/pages/PageEnigma/store"; interface InputVectorProps { x: string; y: string; z: string; onBlur: () => void; onFocus: () => void; onChange: (v: { x: string; y: string; z: string }) => void; increment?: number; } export const InputVector = ({ x, y, z, onBlur, onFocus, onChange, increment = 0.1, }: InputVectorProps) => { const xRef = useRef(null); const yRef = useRef(null); const zRef = useRef(null); const inputCommonClasses = "relative h-6 rounded-r-lg bg-brand-secondary p-2 text-sm text-white transition-all duration-100 ease-in-out outline-none -outline-offset-2 text-end w-full hover:cursor-e-resize hover:bg-brand-secondary-900"; const wrapperCommonClasses = "relative flex items-center before:inline-block before:h-6 before:bg-brand-primary before:text-white before:rounded-l-lg before:w-1.5 before:text-center before:justify-center before:items-center before:font-semibold before:flex before:align-middle before:leading-8 text-xs"; function handleOnChange(e: React.ChangeEvent) { if ( xRef.current !== null && yRef.current !== null && zRef.current !== null ) { const inputStr = e.target.value; const newVector: { [key: string]: string } = { x: xRef.current.value, y: yRef.current.value, z: zRef.current.value, }; newVector[e.target.name] = inputStr; onChange(newVector); } } const blurAllInputs = () => { xRef.current?.blur(); yRef.current?.blur(); zRef.current?.blur(); }; // For dragging the input value to increment/decrement const handleMouseDown = ( e: React.MouseEvent, ref: React.RefObject, ) => { e.preventDefault(); blurAllInputs(); let isDragging = false; let previousMousePosition = e.clientX; const mouseMoveHandler = (e: MouseEvent) => { isDragging = true; const currentMousePosition = e.clientX; const direction = currentMousePosition > previousMousePosition ? 1 : -1; previousMousePosition = currentMousePosition; const currentValue = Number(ref.current?.value) || 0; const newValue = currentValue + direction * increment; // onFocus(); if (ref.current) { ref.current.value = newValue.toFixed(1); ref.current.blur(); } onChange({ x: xRef.current?.value || "", y: yRef.current?.value || "", z: zRef.current?.value || "", }); }; const mouseUpHandler = () => { document.removeEventListener("mousemove", mouseMoveHandler); document.removeEventListener("mouseup", mouseUpHandler); if (!isDragging) { // onBlur(); ref.current?.focus(); ref.current?.select(); } }; document.addEventListener("mousemove", mouseMoveHandler); document.addEventListener("mouseup", mouseUpHandler); }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter") { (e.currentTarget as HTMLInputElement).blur(); // Unfocus the input field on pressing Enter } }; return (
X
{ disableHotkeyInput(DomLevels.INPUT); onFocus(); }} onBlur={() => { enableHotkeyInput(DomLevels.INPUT); onBlur(); }} onMouseDown={(e) => { onFocus(); handleMouseDown(e, xRef); }} onMouseUp={() => onBlur()} onKeyDown={handleKeyDown} />
Y
{ disableHotkeyInput(DomLevels.INPUT); onFocus(); }} onBlur={() => { enableHotkeyInput(DomLevels.INPUT); onBlur(); }} onMouseDown={(e) => { onFocus(); handleMouseDown(e, yRef); }} onMouseUp={() => onBlur()} onKeyDown={handleKeyDown} />
Z
{ disableHotkeyInput(DomLevels.INPUT); onFocus(); }} onBlur={() => { enableHotkeyInput(DomLevels.INPUT); onBlur(); }} onMouseDown={(e) => { onFocus(); handleMouseDown(e, zRef); }} onMouseUp={() => onBlur()} onKeyDown={handleKeyDown} />
); };