@react5/ui 1.0.3 → 1.0.4

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.
@@ -1,4 +1,5 @@
1
1
  export * from './use-click-outside';
2
2
  export * from './use-keys-enteresc';
3
3
  export * from './use-set-startup-focus';
4
+ export * from './use-form';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/index.tsx"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AACnC,cAAc,yBAAyB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/index.tsx"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AACnC,cAAc,yBAAyB,CAAA;AACvC,cAAc,YAAY,CAAA"}
@@ -0,0 +1,25 @@
1
+ import { ChangeEvent, FormEvent } from 'react';
2
+ type FormFields = Record<string, any>;
3
+ type Validator<T> = (values: T) => Partial<Record<keyof T, string>>;
4
+ interface IRegisterInfo {
5
+ name: string;
6
+ onChange: (e: ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => (void);
7
+ value?: string | number;
8
+ checked?: boolean;
9
+ error?: string;
10
+ }
11
+ export declare function useForm<T extends FormFields>(initialValues: T, validate?: Validator<T>): {
12
+ values: T;
13
+ errors: Partial<Record<keyof T, string>>;
14
+ handleChange: (e: ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => void;
15
+ setFieldValue: <K extends keyof T>(field: K, value: T[K]) => void;
16
+ reset: (newValues?: T) => void;
17
+ setValues: import("react").Dispatch<import("react").SetStateAction<T>>;
18
+ validateForm: () => Partial<Record<keyof T, string>>;
19
+ register: (name: string) => IRegisterInfo;
20
+ registerForm: (onUserSubmit?: () => void) => {
21
+ onSubmit: (e: FormEvent<HTMLFormElement>) => void;
22
+ };
23
+ };
24
+ export {};
25
+ //# sourceMappingURL=use-form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-form.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-form.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzD,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACtC,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAEpE,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,gBAAgB,GAAG,iBAAiB,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjG,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AACD,wBAAgB,OAAO,CAAC,CAAC,SAAS,UAAU,EAC1C,aAAa,EAAE,CAAC,EAChB,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;;;sBAOlB,WAAW,CAAC,gBAAgB,GAAG,iBAAiB,GAAG,mBAAmB,CAAC;oBAgBrD,CAAC,SAAS,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;;;wBAWtC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;qBAcjC,MAAM,KAAG,aAAa;kCAWT,MAAM,IAAI;sBAPoB,SAAS,CAAC,eAAe,CAAC;;EAY9F"}
@@ -1,3 +1,4 @@
1
1
  export * from './use-click-outside'
2
2
  export * from './use-keys-enteresc'
3
- export * from './use-set-startup-focus'
3
+ export * from './use-set-startup-focus'
4
+ export * from './use-form'
@@ -0,0 +1,79 @@
1
+ import { useState, ChangeEvent, FormEvent } from 'react';
2
+
3
+ type FormFields = Record<string, any>;
4
+ type Validator<T> = (values: T) => Partial<Record<keyof T, string>>;
5
+
6
+ interface IRegisterInfo {
7
+ name: string,
8
+ onChange: (e: ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => (void),
9
+ value?: string | number,
10
+ checked?: boolean,
11
+ error?: string
12
+ };
13
+ export function useForm<T extends FormFields>(
14
+ initialValues: T,
15
+ validate?: Validator<T>
16
+ ) {
17
+ const [values, setValues] = useState<T>(initialValues);
18
+ const [errors, setErrors] = useState<Partial<Record<keyof T, string>>>({});
19
+
20
+ // Standard change handler for native elements
21
+ const handleChange = (
22
+ e: ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>
23
+ ) => {
24
+ const { name, type, value } = e.target;
25
+ const fieldValue = type === 'checkbox' ? (e.target as HTMLInputElement).checked : value;
26
+
27
+ setValues((prevValues) => {
28
+ const newValues = { ...prevValues, [name]: fieldValue };
29
+ if (validate) {
30
+ const newErrors = validate(newValues);
31
+ setErrors(newErrors);
32
+ }
33
+ return newValues;
34
+ });
35
+ };
36
+
37
+ // New helper: update a specific field directly.
38
+ const setFieldValue = <K extends keyof T>(field: K, value: T[K]) => {
39
+ setValues((prevValues) => {
40
+ const newValues = { ...prevValues, [field]: value };
41
+ if (validate) {
42
+ const newErrors = validate(newValues);
43
+ setErrors(newErrors);
44
+ }
45
+ return newValues;
46
+ });
47
+ };
48
+
49
+ const validateForm = (): Partial<Record<keyof T, string>> => {
50
+ if (validate) {
51
+ const newErrors = validate(values);
52
+ setErrors(newErrors);
53
+ return newErrors;
54
+ }
55
+ return {};
56
+ };
57
+
58
+ const reset = (newValues = initialValues) => {
59
+ setValues(newValues);
60
+ setErrors({});
61
+ };
62
+
63
+ const register = (name: string): IRegisterInfo => {
64
+ return {name, onChange: handleChange, value: values[name] || '', checked: values[name] || false, error: errors[name]};
65
+ }
66
+
67
+ const handleFormSubmit = (onUserSubmit?: (data: T) => void) => (e: FormEvent<HTMLFormElement>) => {
68
+ e.preventDefault();
69
+ onUserSubmit?.(values);
70
+
71
+ reset();
72
+ }
73
+
74
+ const registerForm = (onUserSubmit?: () => void) => {
75
+ return { onSubmit: handleFormSubmit(onUserSubmit) };
76
+ }
77
+
78
+ return { values, errors, handleChange, setFieldValue, reset, setValues, validateForm, register, registerForm };
79
+ }