goldenChat base source add
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
/**
|
||||
* SMA MA1~11 기간 입력 — 프리셋 드롭다운 없이 직접 숫자 편집 (포커스 유지)
|
||||
*/
|
||||
import React, { useState, useEffect, useRef, useCallback } from 'react';
|
||||
|
||||
const MIN = 1;
|
||||
const MAX = 500;
|
||||
|
||||
interface SmaPeriodInputProps {
|
||||
value: number;
|
||||
disabled?: boolean;
|
||||
onCommit: (v: number) => void;
|
||||
}
|
||||
|
||||
const SmaPeriodInput: React.FC<SmaPeriodInputProps> = ({
|
||||
value,
|
||||
disabled = false,
|
||||
onCommit,
|
||||
}) => {
|
||||
const [text, setText] = useState(() => String(value));
|
||||
const editingRef = useRef(false);
|
||||
const committedRef = useRef(value);
|
||||
|
||||
useEffect(() => {
|
||||
if (editingRef.current) return;
|
||||
if (value !== committedRef.current) {
|
||||
committedRef.current = value;
|
||||
setText(String(value));
|
||||
}
|
||||
}, [value]);
|
||||
|
||||
const commit = useCallback((raw: string) => {
|
||||
const trimmed = raw.trim();
|
||||
if (trimmed === '') {
|
||||
setText(String(committedRef.current));
|
||||
return;
|
||||
}
|
||||
const n = parseInt(trimmed, 10);
|
||||
if (isNaN(n)) {
|
||||
setText(String(committedRef.current));
|
||||
return;
|
||||
}
|
||||
const clamped = Math.max(MIN, Math.min(MAX, n));
|
||||
committedRef.current = clamped;
|
||||
setText(String(clamped));
|
||||
onCommit(clamped);
|
||||
}, [onCommit]);
|
||||
|
||||
return (
|
||||
<input
|
||||
type="text"
|
||||
inputMode="numeric"
|
||||
className="ism-input ism-narrow ism-sma-period-input"
|
||||
value={text}
|
||||
disabled={disabled}
|
||||
autoComplete="off"
|
||||
spellCheck={false}
|
||||
onMouseDown={e => {
|
||||
e.stopPropagation();
|
||||
}}
|
||||
onPointerDown={e => {
|
||||
e.stopPropagation();
|
||||
}}
|
||||
onClick={e => e.stopPropagation()}
|
||||
onFocus={e => {
|
||||
e.stopPropagation();
|
||||
editingRef.current = true;
|
||||
}}
|
||||
onChange={e => {
|
||||
const s = e.target.value.replace(/[^\d]/g, '');
|
||||
setText(s);
|
||||
}}
|
||||
onBlur={e => {
|
||||
editingRef.current = false;
|
||||
commit(e.target.value);
|
||||
}}
|
||||
onKeyDown={e => {
|
||||
if (e.key === 'Enter') {
|
||||
(e.target as HTMLInputElement).blur();
|
||||
}
|
||||
}}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
export default SmaPeriodInput;
|
||||
Reference in New Issue
Block a user