ferns-ui 1.15.0 → 1.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Accordion.js +7 -2
- package/dist/Accordion.js.map +1 -1
- package/dist/Common.d.ts +6 -2
- package/dist/Common.js.map +1 -1
- package/dist/EmailField.js +17 -37
- package/dist/EmailField.js.map +1 -1
- package/package.json +1 -1
- package/src/Accordion.tsx +7 -1
- package/src/Common.ts +7 -2
- package/src/EmailField.tsx +22 -42
package/dist/Accordion.js
CHANGED
|
@@ -5,7 +5,7 @@ import { Heading } from "./Heading";
|
|
|
5
5
|
import { InfoModalIcon } from "./InfoModalIcon";
|
|
6
6
|
import { Text } from "./Text";
|
|
7
7
|
import { useTheme } from "./Theme";
|
|
8
|
-
export const Accordion = ({ children, isCollapsed = false, title, subtitle, includeInfoModal = false, infoModalChildren, infoModalSubtitle, infoModalText, infoModalTitle, }) => {
|
|
8
|
+
export const Accordion = ({ children, isCollapsed = false, title, subtitle, includeInfoModal = false, infoModalChildren, infoModalSubtitle, infoModalText, infoModalTitle, onToggle, }) => {
|
|
9
9
|
const { theme } = useTheme();
|
|
10
10
|
const [collapsed, setCollapsed] = useState(false);
|
|
11
11
|
// The external collapse state should override the internal collapse state.
|
|
@@ -27,7 +27,12 @@ export const Accordion = ({ children, isCollapsed = false, title, subtitle, incl
|
|
|
27
27
|
includeInfoModal && infoModalTitle && (React.createElement(InfoModalIcon, { infoModalChildren: infoModalChildren, infoModalSubtitle: infoModalSubtitle, infoModalText: infoModalText, infoModalTitle: infoModalTitle }))),
|
|
28
28
|
subtitle && React.createElement(Text, null, subtitle)),
|
|
29
29
|
React.createElement(View, null,
|
|
30
|
-
React.createElement(Pressable, { "aria-role": "button", hitSlop: { top: 20, bottom: 20, left: 20, right: 20 }, testID: "accordion-toggle", onPress: () =>
|
|
30
|
+
React.createElement(Pressable, { "aria-role": "button", hitSlop: { top: 20, bottom: 20, left: 20, right: 20 }, testID: "accordion-toggle", onPress: () => {
|
|
31
|
+
setCollapsed(!collapsed);
|
|
32
|
+
if (onToggle) {
|
|
33
|
+
onToggle(!collapsed);
|
|
34
|
+
}
|
|
35
|
+
} },
|
|
31
36
|
React.createElement(FontAwesome6, { color: theme.text.link, name: collapsed ? "chevron-down" : "chevron-up", selectable: undefined, size: 16 })))),
|
|
32
37
|
collapsed ? null : React.createElement(View, { style: { marginTop: 8 } }, children)));
|
|
33
38
|
};
|
package/dist/Accordion.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Accordion.js","sourceRoot":"","sources":["../src/Accordion.tsx"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,iCAAiC,CAAC;AAC3D,OAAO,KAAK,EAAE,EAAK,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AACrD,OAAO,EAAC,SAAS,EAAE,IAAI,EAAC,MAAM,cAAc,CAAC;AAG7C,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AAClC,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAC,IAAI,EAAC,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAC,QAAQ,EAAC,MAAM,SAAS,CAAC;AAEjC,MAAM,CAAC,MAAM,SAAS,GAAuB,CAAC,EAC5C,QAAQ,EACR,WAAW,GAAG,KAAK,EACnB,KAAK,EACL,QAAQ,EACR,gBAAgB,GAAG,KAAK,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,cAAc,
|
|
1
|
+
{"version":3,"file":"Accordion.js","sourceRoot":"","sources":["../src/Accordion.tsx"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,iCAAiC,CAAC;AAC3D,OAAO,KAAK,EAAE,EAAK,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AACrD,OAAO,EAAC,SAAS,EAAE,IAAI,EAAC,MAAM,cAAc,CAAC;AAG7C,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AAClC,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAC,IAAI,EAAC,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAC,QAAQ,EAAC,MAAM,SAAS,CAAC;AAEjC,MAAM,CAAC,MAAM,SAAS,GAAuB,CAAC,EAC5C,QAAQ,EACR,WAAW,GAAG,KAAK,EACnB,KAAK,EACL,QAAQ,EACR,gBAAgB,GAAG,KAAK,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,QAAQ,GACT,EAAE,EAAE;IACH,MAAM,EAAC,KAAK,EAAC,GAAG,QAAQ,EAAE,CAAC;IAC3B,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAElD,2EAA2E;IAC3E,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,OAAO,CACL,oBAAC,IAAI,IACH,KAAK,EAAE;YACL,OAAO,EAAE,EAAE;YACX,iBAAiB,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;YACvC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;YACpC,cAAc,EAAE,CAAC;YACjB,iBAAiB,EAAE,CAAC;YACpB,KAAK,EAAE,MAAM;SACd;QAED,oBAAC,IAAI,IAAC,KAAK,EAAE,EAAC,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAC;YACxF,oBAAC,IAAI,IAAC,KAAK,EAAE,EAAC,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAC;gBAC5C,oBAAC,IAAI,IAAC,KAAK,EAAE,EAAC,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAC;oBACvD,oBAAC,OAAO,QAAE,KAAK,CAAW;oBACzB,gBAAgB,IAAI,cAAc,IAAI,CACrC,oBAAC,aAAa,IACZ,iBAAiB,EAAE,iBAAiB,EACpC,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,cAAc,GAC9B,CACH,CACI;gBACN,QAAQ,IAAI,oBAAC,IAAI,QAAE,QAAQ,CAAQ,CAC/B;YACP,oBAAC,IAAI;gBACH,oBAAC,SAAS,iBACE,QAAQ,EAClB,OAAO,EAAE,EAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAC,EACnD,MAAM,EAAC,kBAAkB,EACzB,OAAO,EAAE,GAAG,EAAE;wBACZ,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC;wBACzB,IAAI,QAAQ,EAAE,CAAC;4BACb,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC;wBACvB,CAAC;oBACH,CAAC;oBAED,oBAAC,YAAY,IACX,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EACtB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,EAC/C,UAAU,EAAE,SAAS,EACrB,IAAI,EAAE,EAAE,GACR,CACQ,CACP,CACF;QACN,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAC,IAAI,IAAC,KAAK,EAAE,EAAC,SAAS,EAAE,CAAC,EAAC,IAAG,QAAQ,CAAQ,CAC7D,CACR,CAAC;AACJ,CAAC,CAAC"}
|
package/dist/Common.d.ts
CHANGED
|
@@ -45,6 +45,10 @@ export interface AccordionProps extends InfoModalIconProps {
|
|
|
45
45
|
* The title of the accordion.
|
|
46
46
|
*/
|
|
47
47
|
title: string;
|
|
48
|
+
/**
|
|
49
|
+
* * Callback fired when the accordion is toggled.
|
|
50
|
+
* */
|
|
51
|
+
onToggle?: (isCollapse: boolean) => void;
|
|
48
52
|
}
|
|
49
53
|
export interface BaseProfile {
|
|
50
54
|
email: string;
|
|
@@ -316,11 +320,11 @@ export type TextFieldType = "date" | "datetime" | "decimal" | "decimalRange" | "
|
|
|
316
320
|
export type IconSize = "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
|
|
317
321
|
export declare const iconSizeToNumber: (size?: IconSize) => number;
|
|
318
322
|
export type TextSize = "sm" | "md" | "lg" | "xl" | "2xl";
|
|
319
|
-
export
|
|
323
|
+
export interface ValueMappingItem {
|
|
320
324
|
value: number;
|
|
321
325
|
label: string;
|
|
322
326
|
size?: IconSize;
|
|
323
|
-
}
|
|
327
|
+
}
|
|
324
328
|
export type IconPrefix = "far" | "fas";
|
|
325
329
|
export interface LayerProps {
|
|
326
330
|
children: ReactChildren;
|
package/dist/Common.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Common.js","sourceRoot":"","sources":["../src/Common.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Common.js","sourceRoot":"","sources":["../src/Common.ts"],"names":[],"mappings":"AAoXA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;CACP,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,OAAqB;IAC9C,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,WAAW,CAAC,OAAyB,CAAC,CAAC;AAChD,CAAC;AAqBD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAe,EAAE,EAAE;IAClD,OAAO;QACL,EAAE,EAAE,CAAC;QACL,EAAE,EAAE,EAAE;QACN,EAAE,EAAE,EAAE;QACN,EAAE,EAAE,EAAE;QACN,EAAE,EAAE,EAAE;QACN,KAAK,EAAE,EAAE;KACV,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AAClB,CAAC,CAAC;AA+RF,MAAM,YAAY,GAAG;IACnB,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,GAAG;IACZ,EAAE,EAAE,CAAC;IACL,EAAE,EAAE,CAAC;IACL,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,GAAG;CACX,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,QAAkB;IAC5C,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC"}
|
package/dist/EmailField.js
CHANGED
|
@@ -14,7 +14,10 @@ import { TextField } from "./TextField";
|
|
|
14
14
|
export const EmailField = (_a) => {
|
|
15
15
|
var { errorText, iconName, placeholder, value, onChange, onBlur } = _a, rest = __rest(_a, ["errorText", "iconName", "placeholder", "value", "onChange", "onBlur"]);
|
|
16
16
|
const [localValue, setLocalValue] = useState(value || "");
|
|
17
|
-
|
|
17
|
+
// Sync local state with incoming prop values
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
setLocalValue(value || "");
|
|
20
|
+
}, [value]);
|
|
18
21
|
const validateEmail = useCallback((email) => {
|
|
19
22
|
if (email.trim() === "") {
|
|
20
23
|
return undefined;
|
|
@@ -25,43 +28,20 @@ export const EmailField = (_a) => {
|
|
|
25
28
|
}
|
|
26
29
|
return undefined;
|
|
27
30
|
}, []);
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
if (
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
setError(undefined);
|
|
31
|
+
const localOnChange = useCallback((e) => {
|
|
32
|
+
setLocalValue(e);
|
|
33
|
+
const err = validateEmail(e);
|
|
34
|
+
if (!err && onChange) {
|
|
35
|
+
onChange(e);
|
|
36
|
+
}
|
|
37
|
+
}, [onChange, validateEmail, setLocalValue]);
|
|
38
|
+
const localOnBlur = useCallback((e) => {
|
|
39
|
+
setLocalValue(e);
|
|
40
|
+
const err = validateEmail(e);
|
|
41
|
+
if (!err && onBlur) {
|
|
42
|
+
onBlur(e);
|
|
43
43
|
}
|
|
44
44
|
}, [onBlur, validateEmail]);
|
|
45
|
-
|
|
46
|
-
setLocalValue(email);
|
|
47
|
-
const validationError = validateEmail(email);
|
|
48
|
-
if (error && !validationError) {
|
|
49
|
-
setError(undefined);
|
|
50
|
-
}
|
|
51
|
-
if (!validationError) {
|
|
52
|
-
onChange(email);
|
|
53
|
-
}
|
|
54
|
-
}, [onChange, error, validateEmail]);
|
|
55
|
-
return (React.createElement(TextField, Object.assign({ errorText: error, iconName: iconName, placeholder: placeholder, type: "email", value: localValue, onBlur: (e) => {
|
|
56
|
-
handleBlur(e);
|
|
57
|
-
if (onBlur) {
|
|
58
|
-
onBlur(value || "");
|
|
59
|
-
}
|
|
60
|
-
}, onChange: (e) => {
|
|
61
|
-
handleChange(e);
|
|
62
|
-
if (onChange) {
|
|
63
|
-
onChange;
|
|
64
|
-
}
|
|
65
|
-
} }, rest)));
|
|
45
|
+
return (React.createElement(TextField, Object.assign({ errorText: errorText || validateEmail(localValue), iconName: iconName, placeholder: placeholder, type: "email", value: localValue, onBlur: localOnBlur, onChange: localOnChange }, rest)));
|
|
66
46
|
};
|
|
67
47
|
//# sourceMappingURL=EmailField.js.map
|
package/dist/EmailField.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmailField.js","sourceRoot":"","sources":["../src/EmailField.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAK,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAGlE,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,UAAU,GAAwB,CAAC,EAQ/C,EAAE,EAAE;QAR2C,EAC9C,SAAS,EACT,QAAQ,EACR,WAAW,EACX,KAAK,EACL,QAAQ,EACR,MAAM,OAEP,EADI,IAAI,cAPuC,uEAQ/C,CADQ;IAEP,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAS,KAAK,IAAI,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"EmailField.js","sourceRoot":"","sources":["../src/EmailField.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAK,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAGlE,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,UAAU,GAAwB,CAAC,EAQ/C,EAAE,EAAE;QAR2C,EAC9C,SAAS,EACT,QAAQ,EACR,WAAW,EACX,KAAK,EACL,QAAQ,EACR,MAAM,OAEP,EADI,IAAI,cAPuC,uEAQ/C,CADQ;IAEP,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAS,KAAK,IAAI,EAAE,CAAC,CAAC;IAElE,6CAA6C;IAC7C,SAAS,CAAC,GAAG,EAAE;QACb,aAAa,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,KAAa,EAAsB,EAAE;QACtE,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,UAAU,GAAG,4BAA4B,CAAC;QAChD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,8BAA8B,CAAC;QACxC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,CAAS,EAAE,EAAE;QACZ,aAAa,CAAC,CAAC,CAAC,CAAC;QACjB,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,IAAI,QAAQ,EAAE,CAAC;YACrB,QAAQ,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;IACH,CAAC,EACD,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,CAAC,CACzC,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,CAAS,EAAE,EAAE;QACZ,aAAa,CAAC,CAAC,CAAC,CAAC;QACjB,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,CAAC,CAAC,CAAC;QACZ,CAAC;IACH,CAAC,EACD,CAAC,MAAM,EAAE,aAAa,CAAC,CACxB,CAAC;IACF,OAAO,CACL,oBAAC,SAAS,kBACR,SAAS,EAAE,SAAS,IAAI,aAAa,CAAC,UAAU,CAAC,EACjD,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,aAAa,IACnB,IAAI,EACR,CACH,CAAC;AACJ,CAAC,CAAC"}
|
package/package.json
CHANGED
package/src/Accordion.tsx
CHANGED
|
@@ -18,6 +18,7 @@ export const Accordion: FC<AccordionProps> = ({
|
|
|
18
18
|
infoModalSubtitle,
|
|
19
19
|
infoModalText,
|
|
20
20
|
infoModalTitle,
|
|
21
|
+
onToggle,
|
|
21
22
|
}) => {
|
|
22
23
|
const {theme} = useTheme();
|
|
23
24
|
const [collapsed, setCollapsed] = useState(false);
|
|
@@ -58,7 +59,12 @@ export const Accordion: FC<AccordionProps> = ({
|
|
|
58
59
|
aria-role="button"
|
|
59
60
|
hitSlop={{top: 20, bottom: 20, left: 20, right: 20}}
|
|
60
61
|
testID="accordion-toggle"
|
|
61
|
-
onPress={() =>
|
|
62
|
+
onPress={() => {
|
|
63
|
+
setCollapsed(!collapsed);
|
|
64
|
+
if (onToggle) {
|
|
65
|
+
onToggle(!collapsed);
|
|
66
|
+
}
|
|
67
|
+
}}
|
|
62
68
|
>
|
|
63
69
|
<FontAwesome6
|
|
64
70
|
color={theme.text.link}
|
package/src/Common.ts
CHANGED
|
@@ -64,6 +64,11 @@ export interface AccordionProps extends InfoModalIconProps {
|
|
|
64
64
|
* The title of the accordion.
|
|
65
65
|
*/
|
|
66
66
|
title: string;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* * Callback fired when the accordion is toggled.
|
|
70
|
+
* */
|
|
71
|
+
onToggle?: (isCollapse: boolean) => void;
|
|
67
72
|
}
|
|
68
73
|
|
|
69
74
|
export interface BaseProfile {
|
|
@@ -420,11 +425,11 @@ export const iconSizeToNumber = (size?: IconSize) => {
|
|
|
420
425
|
|
|
421
426
|
export type TextSize = "sm" | "md" | "lg" | "xl" | "2xl";
|
|
422
427
|
|
|
423
|
-
export
|
|
428
|
+
export interface ValueMappingItem {
|
|
424
429
|
value: number;
|
|
425
430
|
label: string;
|
|
426
431
|
size?: IconSize;
|
|
427
|
-
}
|
|
432
|
+
}
|
|
428
433
|
|
|
429
434
|
export type IconPrefix = "far" | "fas";
|
|
430
435
|
|
package/src/EmailField.tsx
CHANGED
|
@@ -13,7 +13,11 @@ export const EmailField: FC<EmailFieldProps> = ({
|
|
|
13
13
|
...rest
|
|
14
14
|
}) => {
|
|
15
15
|
const [localValue, setLocalValue] = useState<string>(value || "");
|
|
16
|
-
|
|
16
|
+
|
|
17
|
+
// Sync local state with incoming prop values
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
setLocalValue(value || "");
|
|
20
|
+
}, [value]);
|
|
17
21
|
|
|
18
22
|
const validateEmail = useCallback((email: string): string | undefined => {
|
|
19
23
|
if (email.trim() === "") {
|
|
@@ -26,60 +30,36 @@ export const EmailField: FC<EmailFieldProps> = ({
|
|
|
26
30
|
return undefined;
|
|
27
31
|
}, []);
|
|
28
32
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const handleBlur = useCallback(
|
|
36
|
-
(email: string) => {
|
|
37
|
-
if (onBlur) {
|
|
38
|
-
onBlur(email);
|
|
39
|
-
}
|
|
40
|
-
const validationError = validateEmail(email);
|
|
41
|
-
if (validationError) {
|
|
42
|
-
setError(validationError);
|
|
43
|
-
} else {
|
|
44
|
-
setError(undefined);
|
|
33
|
+
const localOnChange = useCallback(
|
|
34
|
+
(e: string) => {
|
|
35
|
+
setLocalValue(e);
|
|
36
|
+
const err = validateEmail(e);
|
|
37
|
+
if (!err && onChange) {
|
|
38
|
+
onChange(e);
|
|
45
39
|
}
|
|
46
40
|
},
|
|
47
|
-
[
|
|
41
|
+
[onChange, validateEmail, setLocalValue]
|
|
48
42
|
);
|
|
49
43
|
|
|
50
|
-
const
|
|
51
|
-
(
|
|
52
|
-
setLocalValue(
|
|
53
|
-
const
|
|
54
|
-
if (
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
if (!validationError) {
|
|
58
|
-
onChange(email);
|
|
44
|
+
const localOnBlur = useCallback(
|
|
45
|
+
(e: string) => {
|
|
46
|
+
setLocalValue(e);
|
|
47
|
+
const err = validateEmail(e);
|
|
48
|
+
if (!err && onBlur) {
|
|
49
|
+
onBlur(e);
|
|
59
50
|
}
|
|
60
51
|
},
|
|
61
|
-
[
|
|
52
|
+
[onBlur, validateEmail]
|
|
62
53
|
);
|
|
63
|
-
|
|
64
54
|
return (
|
|
65
55
|
<TextField
|
|
66
|
-
errorText={
|
|
56
|
+
errorText={errorText || validateEmail(localValue)}
|
|
67
57
|
iconName={iconName}
|
|
68
58
|
placeholder={placeholder}
|
|
69
59
|
type="email"
|
|
70
60
|
value={localValue}
|
|
71
|
-
onBlur={
|
|
72
|
-
|
|
73
|
-
if (onBlur) {
|
|
74
|
-
onBlur(value || "");
|
|
75
|
-
}
|
|
76
|
-
}}
|
|
77
|
-
onChange={(e) => {
|
|
78
|
-
handleChange(e);
|
|
79
|
-
if (onChange) {
|
|
80
|
-
onChange;
|
|
81
|
-
}
|
|
82
|
-
}}
|
|
61
|
+
onBlur={localOnBlur}
|
|
62
|
+
onChange={localOnChange}
|
|
83
63
|
{...rest}
|
|
84
64
|
/>
|
|
85
65
|
);
|