// Copyright (C) 2017-2025 Smart code 203358507 import Icon from '@stremio/stremio-icons/react'; import React, { ChangeEvent, forwardRef, memo, useCallback, useMemo, useState } from 'react'; import { type KeyboardEvent, type InputHTMLAttributes } from 'react'; import classnames from 'classnames'; import styles from './NumberInput.less'; import Button from '../Button'; type Props = InputHTMLAttributes & { containerClassName?: string; className?: string; disabled?: boolean; showButtons?: boolean; label?: string; min?: number; max?: number; value?: number; defaultValue?: number; onKeyDown?: (event: KeyboardEvent) => void; onSubmit?: (event: KeyboardEvent) => void; onUpdate?: (value: number) => void; onChange?: (event: ChangeEvent) => void; }; const NumberInput = forwardRef(({ defaultValue = 1, showButtons, onUpdate, onKeyDown, onSubmit, min, max, onChange, ...props }, ref) => { const [value, setValue] = useState(defaultValue); const displayValue = useMemo(() => props.value ?? value, [props.value, value]); const handleKeyDown = useCallback((event: KeyboardEvent) => { onKeyDown && onKeyDown(event); if (event.key === 'Enter') { onSubmit && onSubmit(event); } }, [onKeyDown, onSubmit]); const handleValueChange = (value: number) => { if (props.value === undefined) { setValue(value); } onUpdate?.(value); onChange?.({ target: { value: value.toString() }} as ChangeEvent); }; const handleIncrement = () => { handleValueChange(clampValueToRange((displayValue || 0) + 1)); }; const handleDecrement = () => { handleValueChange(clampValueToRange((displayValue || 0) - 1)); }; const clampValueToRange = (value: number): number => { const minValue = min ?? 0; if (value < minValue) { return minValue; } if (max !== undefined && value > max) { return max; } return value; }; const handleInputChange = ({ target: { valueAsNumber }}: ChangeEvent) => { handleValueChange(clampValueToRange(valueAsNumber || 0)); }; return (
{ showButtons ? : null }
{ props.label ?
{props.label}
: null }
{ showButtons ? : null }
); }); NumberInput.displayName = 'NumberInput'; export default memo(NumberInput);