@react5/ui 1.0.2 → 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.
- package/package.json +1 -1
- package/packages/app/src/App.tsx +21 -2
- package/packages/lib/dist/esm/index.esm.js +1 -1
- package/packages/lib/dist/esm/index.esm.js.map +1 -1
- package/packages/lib/dist/index.js +1 -1
- package/packages/lib/dist/index.js.map +1 -1
- package/packages/lib/dist/types/components/DialogPrompt/DialogPrompt.d.ts +2 -1
- package/packages/lib/dist/types/components/DialogPrompt/DialogPrompt.d.ts.map +1 -1
- package/packages/lib/dist/types/hooks/index.d.ts +1 -0
- package/packages/lib/dist/types/hooks/index.d.ts.map +1 -1
- package/packages/lib/dist/types/hooks/use-form.d.ts +25 -0
- package/packages/lib/dist/types/hooks/use-form.d.ts.map +1 -0
- package/packages/lib/src/components/DialogPrompt/DialogPrompt.tsx +3 -2
- package/packages/lib/src/hooks/index.tsx +2 -1
- package/packages/lib/src/hooks/use-form.tsx +79 -0
|
@@ -8,7 +8,8 @@ interface DialogPromptProps {
|
|
|
8
8
|
prompt?: string;
|
|
9
9
|
confirmText?: string;
|
|
10
10
|
cancelText?: string;
|
|
11
|
+
variant?: 'small' | 'medium' | 'large';
|
|
11
12
|
}
|
|
12
|
-
export declare const DialogPrompt: ({ children, onOk, onCancel, className, prompt, confirmText, cancelText }: DialogPromptProps) => import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export declare const DialogPrompt: ({ children, variant, onOk, onCancel, className, prompt, confirmText, cancelText }: DialogPromptProps) => import("react/jsx-runtime").JSX.Element;
|
|
13
14
|
export default DialogPrompt;
|
|
14
15
|
//# sourceMappingURL=DialogPrompt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DialogPrompt.d.ts","sourceRoot":"","sources":["../../../../src/components/DialogPrompt/DialogPrompt.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,qBAAqB,CAAA;AAQ5B,UAAU,iBAAiB;IACzB,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"DialogPrompt.d.ts","sourceRoot":"","sources":["../../../../src/components/DialogPrompt/DialogPrompt.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,qBAAqB,CAAA;AAQ5B,UAAU,iBAAiB;IACzB,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;CACxC;AAED,eAAO,MAAM,YAAY,sFAA+F,iBAAiB,4CAoBxI,CAAA;AACD,eAAe,YAAY,CAAA"}
|
|
@@ -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"}
|
|
@@ -15,12 +15,13 @@ interface DialogPromptProps {
|
|
|
15
15
|
prompt?: string;
|
|
16
16
|
confirmText?: string;
|
|
17
17
|
cancelText?: string;
|
|
18
|
+
variant?: 'small' | 'medium' | 'large';
|
|
18
19
|
}
|
|
19
20
|
const b = bem("dialog-prompt");
|
|
20
|
-
export const DialogPrompt = ({children, onOk, onCancel, className, prompt, confirmText, cancelText}: DialogPromptProps) => {
|
|
21
|
+
export const DialogPrompt = ({children, variant = "small", onOk, onCancel, className, prompt, confirmText, cancelText}: DialogPromptProps) => {
|
|
21
22
|
|
|
22
23
|
return (
|
|
23
|
-
<Modal variant=
|
|
24
|
+
<Modal variant={variant} className={clsx(b(), className)} onClose={onCancel}>
|
|
24
25
|
<Modal.Header>
|
|
25
26
|
</Modal.Header>
|
|
26
27
|
<Modal.Body className={b("body")}>
|
|
@@ -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
|
+
}
|