-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathFormattedInput.tsx
More file actions
110 lines (101 loc) · 3.38 KB
/
FormattedInput.tsx
File metadata and controls
110 lines (101 loc) · 3.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import classnames from "classnames";
import { Controller, FieldValues } from "react-hook-form";
import { NumericFormat, NumericFormatProps, PatternFormat, PatternFormatProps } from "react-number-format";
import { useSafeNameId } from "src/lib/hooks/useSafeNameId";
import { FormGroupLayout } from "./FormGroupLayout";
import { CommonInputProps } from "./types/CommonInputProps";
import { useMarkOnFocusHandler } from "./hooks/useMarkOnFocusHandler";
import { useFormContext } from "./context/FormContext";
interface FormattedInputProps<T extends FieldValues> extends CommonInputProps<T> {
patternFormat?: PatternFormatProps;
numericFormat?: NumericFormatProps;
placeholder?: string;
}
const FormattedInput = <T extends FieldValues>(props: FormattedInputProps<T>) => {
if (props.patternFormat && props.numericFormat) {
throw new Error("FormattedInput cannot have both patternFormat and numericFormat");
}
const {
disabled,
label,
helpText,
numericFormat,
inputGroupStyle,
patternFormat,
onChange: propsOnChange,
onBlur: propsOnBlur,
labelToolTip,
style,
markAllOnFocus,
addonLeft,
addonRight,
className = "",
hideValidationMessage = false,
placeholder,
} = props;
const { name, id } = useSafeNameId(props.name, props.id);
const { control, disabled: formDisabled } = useFormContext();
const focusHandler = useMarkOnFocusHandler(markAllOnFocus);
const isDisabled = formDisabled || disabled;
return (
<Controller
control={control}
name={name}
shouldUnregister={isDisabled}
render={({ field: { name, onBlur, onChange, ref, value }, fieldState: { error } }) => {
const commonProps: NumericFormatProps = {
name: name,
value: value as string | number,
getInputRef: ref,
className: classnames("form-control", { "is-invalid": error }, className),
"aria-invalid": !!error,
id,
onBlur: (e) => {
if (propsOnBlur) propsOnBlur(e);
onBlur();
},
disabled: isDisabled,
};
return (
<FormGroupLayout
helpText={helpText}
name={name}
id={id}
label={label}
labelToolTip={labelToolTip}
inputGroupStyle={inputGroupStyle}
addonLeft={addonLeft}
addonRight={addonRight}
addonProps={{
isDisabled,
}}
hideValidationMessage={hideValidationMessage}
>
<>
{numericFormat && (
<NumericFormat
{...numericFormat}
{...commonProps}
valueIsNumericString={true}
onChange={(e) => {
if (propsOnChange) propsOnChange(e);
}}
onValueChange={(values) => {
onChange(values.value);
}}
onFocus={focusHandler}
style={style}
placeholder={placeholder}
></NumericFormat>
)}
{patternFormat && (
<PatternFormat {...patternFormat} {...commonProps} onChange={onChange} style={style} onFocus={focusHandler}></PatternFormat>
)}
</>
</FormGroupLayout>
);
}}
/>
);
};
export { FormattedInput, FormattedInputProps };