/** @jsxRuntime classic */ /** @jsx jsx */ import React, { FC, useState, useRef, useEffect, ChangeEvent, MutableRefObject, } from 'react'; import cx from 'classnames'; import { jsx, Theme, useTheme } from '@emotion/react'; import { StyledInput, DeleteButtonStyle, InputContainer, RightButton, ArrowsButton, } from './style'; import { getIcon, BnRemove, BnArrowUp, BnArrowDown } from '../../icons'; import { BnIcon } from '../icons_v2'; import { capitalize } from '../../functions'; import { Tooltip } from '../Tooltip'; import { ErrorMessage } from '../ErrorMessage'; import { InputProps } from '../../types'; import Cleave from 'cleave.js/react'; const useClickOutside = ( ref: React.MutableRefObject, callback: (val: number) => void, innerValue: string ) => { const handleClick = (e: Event) => { if (ref) { if (ref.current && !ref.current.contains(e.target as Node)) { callback(Number(innerValue)); } } }; React.useEffect(() => { document.addEventListener('click', handleClick); return () => { document.removeEventListener('click', handleClick); }; }); }; export const Input: FC< InputProps & React.InputHTMLAttributes > = ({ leftIcon = '', rightIcon = '', children, sizer = 'S', label = '', info = '', helper = '', helperContent = '', rightButton = '', format = 'default', onRightButtonClick = () => {}, isVisited = false, withArrows = false, error = undefined, hideError = false, noLabel = false, disableTrailing = false, setChange = () => {}, clear = () => {}, clickOutside = (val) => {}, // colors = ThemeColors, ...rest }) => { const [isFocus, setFocus] = useState(false); // const [innerValue, setInnerValue] = useState(''); const [isHover, setHover] = useState(false); const [visited, setVisited] = useState(false); const inputRef = useRef(null); const inputContainerRef = useRef(null); const colors = useTheme(); // const { colors: ThemeC } = useColors(); const newClassName = rest.className; delete rest.className; useClickOutside( inputContainerRef as MutableRefObject, clickOutside, String(rest.value) ); useEffect(() => { setVisited(isVisited); }, [isVisited]); const disabled = rest.disabled; return ( {(label || noLabel) && (
{capitalize(label)} {rest.required && !noLabel && ' *'}
{info && {getIcon('info', 'l')}}
)} { if (inputRef.current) { //@ts-ignore inputRef.current.focus(); } }} onMouseEnter={() => { setHover(true); }} onMouseLeave={() => { setHover(false); }} >
{leftIcon && ( )} {format === 'time' ? ( { setFocus(true); if (rest.onFocus) { rest.onFocus(e); } }} onChange={(e) => { // setInnerValue(e.target.value); if (rest.onChange) { rest.onChange(e); } }} onBlur={(e) => { setFocus(false); setVisited(true); if (rest.onBlur) { rest.onBlur(e); } }} /> ) : ( { // setInnerValue(e.target.value); if (rest.onChange) { rest.onChange(e); } }} onFocus={(e) => { setFocus(true); if (rest.onFocus) { rest.onFocus(e); } }} onBlur={(e) => { setFocus(false); setVisited(true); if (rest.onBlur) { rest.onBlur(e); } }} /> )} {!disableTrailing && isHover && !disabled && ( { if (inputRef && inputRef.current) { // @ts-ignore: Object is possibly 'null'. inputRef.current.focus(); } // setInnerValue(''); if (clear) { clear(); } }} theme={{ ...colors }} /> )} {rightIcon && ( )}
{withArrows && rest.type === 'number' && (
{ let v = rest.value as number; let e = { target: { value: v ? Number(v) + 1 : 1, }, }; // setInnerValue(String(v + 1)); if (rest.onChange) { rest.onChange( (e as unknown) as ChangeEvent ); } }} >
{ let v = rest.value as number; let e = { target: { value: v ? Number(v) - 1 : 1, }, }; // setInnerValue(String(v - 1)); if (rest.onChange) { rest.onChange( (e as unknown) as ChangeEvent ); } }} >
)} {rightButton && ( )}
{helper && (
{helperContent && ( {getIcon('info', 'r')} )}
{capitalize(helper)}
)} {!hideError && (
{visited && }
)}
); }; interface DeleteButtonProps { theme: Theme; onClick: () => void; } const DeleteButton = ({ theme, onClick }: DeleteButtonProps) => { return ( ); };