|
@@ -1,11 +1,21 @@
|
|
|
-import { useEffect, useState } from 'react'
|
|
|
+import { useEffect, useState, FormEvent, ChangeEvent, SyntheticEvent } from 'react'
|
|
|
|
|
|
-type FormHandler = {
|
|
|
- inputProps: (name: string) => {},
|
|
|
- submitProps: () => {},
|
|
|
- handleSubmit: (event: Event) => void,
|
|
|
- handleChange: (event: Event) => void,
|
|
|
- handleBlur: (event: Event) => void,
|
|
|
+import TextInput from './TextInput'
|
|
|
+
|
|
|
+export interface InputProps {
|
|
|
+ id: string,
|
|
|
+ name: string,
|
|
|
+ value: any,
|
|
|
+ onChange: (event: SyntheticEvent) => void,
|
|
|
+ onBlur: (event: SyntheticEvent) => void,
|
|
|
+ placeholder: string,
|
|
|
+ label: string
|
|
|
+}
|
|
|
+
|
|
|
+interface FormHandler {
|
|
|
+ inputProps: (name: string) => InputProps,
|
|
|
+ handleChange: (event: SyntheticEvent) => void,
|
|
|
+ handleBlur: (event: SyntheticEvent) => void,
|
|
|
values: Dict,
|
|
|
errors: Dict,
|
|
|
isSubmitting: boolean
|
|
@@ -13,22 +23,23 @@ type FormHandler = {
|
|
|
|
|
|
/**
|
|
|
* Provides hooks for forms.
|
|
|
- *
|
|
|
+ *
|
|
|
* @remarks
|
|
|
* You can use it like this
|
|
|
* ```ts
|
|
|
- * const {inputParams, submitParams} = useFormHandler()
|
|
|
+ * const {inputParams, formParams} = useFormHandler()
|
|
|
* ```
|
|
|
- *
|
|
|
- * @param initialValues - Initial values of inputs
|
|
|
+ *
|
|
|
+ * @param initialValues - Initial values of inputs
|
|
|
* @param validate - validation function for the form
|
|
|
* @returns hooks to handle the form
|
|
|
*/
|
|
|
function useFormHandler(
|
|
|
initialValues: Dict,
|
|
|
- validate: (values: Dict) => {}
|
|
|
+ validate?: (values: Dict) => {}
|
|
|
): FormHandler {
|
|
|
|
|
|
+ console.log('useFormHandler called.', initialValues)
|
|
|
const [values, setValues] = useState(initialValues)
|
|
|
const [errors, setErrors] = useState({})
|
|
|
const [isSubmitting, setIsSubmitting] = useState(false)
|
|
@@ -45,20 +56,7 @@ function useFormHandler(
|
|
|
}
|
|
|
}, [errors])
|
|
|
|
|
|
- function handleSubmit(
|
|
|
- event: Event,
|
|
|
- callback?: (event: Event, data?: {}) => void, data?: {}
|
|
|
- ): void {
|
|
|
- event.preventDefault()
|
|
|
- const validationErrors = validate(values)
|
|
|
- setErrors(validationErrors)
|
|
|
- setIsSubmitting(true)
|
|
|
- if (callback !== undefined) {
|
|
|
- callback(event, data)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- function handleChange(event: Event): void {
|
|
|
+ function handleChange(event: SyntheticEvent): void {
|
|
|
setValues({
|
|
|
...values,
|
|
|
[(event.target as HTMLInputElement).name]:
|
|
@@ -66,34 +64,30 @@ function useFormHandler(
|
|
|
})
|
|
|
}
|
|
|
|
|
|
- function handleBlur(event: Event): void {
|
|
|
- const validationErrors = validate(values)
|
|
|
- setErrors(validationErrors)
|
|
|
+ function handleBlur(event: SyntheticEvent): void {
|
|
|
+ if (validate) {
|
|
|
+ const validationErrors = validate(values)
|
|
|
+ setErrors(validationErrors)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- function inputProps(name: string): {} {
|
|
|
+ function inputProps(name: string, label?: string): InputProps {
|
|
|
if (!values.hasOwnProperty(name)) {
|
|
|
throw Error(`${name} is not an existing field.`)
|
|
|
}
|
|
|
return {
|
|
|
- name,
|
|
|
id: name,
|
|
|
+ name,
|
|
|
+ value: values[name],
|
|
|
onChange: handleChange,
|
|
|
onBlur: handleBlur,
|
|
|
- value: values[name]
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- function submitProps(): {} {
|
|
|
- return {
|
|
|
- onSubmit: handleSubmit
|
|
|
+ placeholder: label || name,
|
|
|
+ label: label || name
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
inputProps,
|
|
|
- submitProps,
|
|
|
- handleSubmit,
|
|
|
handleChange,
|
|
|
handleBlur,
|
|
|
values,
|
|
@@ -102,4 +96,4 @@ function useFormHandler(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-export default useFormHandler
|
|
|
+export { useFormHandler, TextInput }
|