import React, {useMemo, useRef, useState} from 'react'; import renderHtmlAttributes from "../../utils/renderHtmlAttributes"; import useFormSubmitSuccess from "../../hooks/useFormSubmitSuccess"; import CurrencyInput from 'react-currency-input-field'; import {__} from "@wordpress/i18n"; import {Icon} from "@wordpress/components"; import {chevronDown, chevronUp} from "@wordpress/icons"; import UpgradeOverlay from "../../components/UpgradeOverlay"; import type {FreemiusProps} from "../../types/freemius"; type FieldProps = { itemId: string formId: string attrs: Record value: string allowDecimals: boolean disableGroupSeparators: boolean allowNegativeValue: boolean disableAbbreviations: boolean decimalsLimit: number decimalScale: number fixedDecimalLength: number maxLength: number step: number decimalSeparator: string groupSeparator: string placeholder: string prefix: string suffix: string intlConfig: boolean intlLocale: string intlCurrency: string disableArrowButtons: boolean } & FreemiusProps const Field = (props: FieldProps) => { const inputRef = useRef(null); const intervalRef = useRef(undefined); const timoutRef = useRef(undefined); const attrs = useMemo(() => renderHtmlAttributes(props.attrs), [props.attrs]); const [value, setValue] = useState(props.value); // Reset after form submit useFormSubmitSuccess(inputRef, () => { setValue(props.value); }, [props.value]); function dispatchIncrement() { const downArrowEvent = new KeyboardEvent("keydown", { key: "ArrowUp", code: "ArrowUp", bubbles: true }); inputRef.current?.dispatchEvent(downArrowEvent); } function dispatchDecrement() { const downArrowEvent = new KeyboardEvent("keydown", { key: "ArrowDown", code: "ArrowDown", bubbles: true }); inputRef.current?.dispatchEvent(downArrowEvent); } function decrement(e: any) { e.preventDefault(); inputRef.current?.focus(); dispatchDecrement(); clearTimeout(timoutRef.current); timoutRef.current = setTimeout(() => { intervalRef.current = setInterval(dispatchDecrement, 50); }, 300); } function increment(e: any) { e.preventDefault(); inputRef.current?.focus(); dispatchIncrement(); clearTimeout(timoutRef.current); timoutRef.current = setTimeout(() => { intervalRef.current = setInterval(dispatchIncrement, 50); }, 300); } function handleWheel(e: React.WheelEvent) { if (e.deltaY < 0) { // Scrolling up dispatchIncrement(); } else if (e.deltaY > 0) { // Scrolling down dispatchDecrement(); } } function handleClear() { clearInterval(timoutRef.current); clearInterval(intervalRef.current); } return ( <> {!props.freemius.can_use_premium_code && } { if (!props.freemius.can_use_premium_code) { return; } setValue(val ?? ''); }} onWheel={handleWheel} /> {(props.step && !props.disableArrowButtons) && ( <> )} ); }; export default Field;