Remove unused file
This commit is contained in:
parent
f1cb72ccc8
commit
ed71f7fb13
|
|
@ -1,121 +0,0 @@
|
|||
import { useCallback, useEffect, useRef, useState } from 'preact/hooks'
|
||||
|
||||
type BaseValue = Record<string, string>
|
||||
|
||||
type Props<TValue extends BaseValue> = {
|
||||
onSubmit?: (value: TValue) => void
|
||||
onChange?: (value: TValue) => void
|
||||
defaultValue: TValue | (() => TValue)
|
||||
}
|
||||
|
||||
type InternalState<TValue extends BaseValue> = {
|
||||
onSubmit?: (value: TValue) => void
|
||||
onChange?: (value: TValue) => void
|
||||
subscribers: ((value: TValue) => void)[]
|
||||
value: TValue
|
||||
}
|
||||
|
||||
export const useForm = <TValue extends BaseValue = BaseValue>({
|
||||
defaultValue,
|
||||
onSubmit,
|
||||
onChange,
|
||||
}: Props<TValue>) => {
|
||||
const firstRenderRef = useRef(true)
|
||||
|
||||
const internalRef = useRef(
|
||||
(firstRenderRef.current
|
||||
? {
|
||||
onSubmit,
|
||||
onChange,
|
||||
subscribers: [],
|
||||
value:
|
||||
typeof defaultValue === 'function'
|
||||
? (defaultValue as () => TValue)()
|
||||
: defaultValue,
|
||||
}
|
||||
: {}) as InternalState<TValue>
|
||||
)
|
||||
|
||||
internalRef.current = {
|
||||
onSubmit,
|
||||
onChange,
|
||||
subscribers: internalRef.current.subscribers,
|
||||
value: internalRef.current.value,
|
||||
}
|
||||
|
||||
firstRenderRef.current = false
|
||||
|
||||
const handleInputRef = useCallback(
|
||||
(ref: HTMLInputElement | HTMLSelectElement | null) => {
|
||||
if (ref) {
|
||||
const name = ref.name
|
||||
const predefinedValue = internalRef.current.value[name]
|
||||
|
||||
if (predefinedValue) {
|
||||
ref.value = predefinedValue
|
||||
}
|
||||
}
|
||||
},
|
||||
[]
|
||||
)
|
||||
|
||||
const handleInputChange = useCallback((e: Event) => {
|
||||
const target = e.target as HTMLSelectElement | HTMLInputElement
|
||||
|
||||
internalRef.current.value = {
|
||||
...internalRef.current.value,
|
||||
[target.name]: target.value,
|
||||
}
|
||||
|
||||
internalRef.current.onChange?.(internalRef.current.value)
|
||||
internalRef.current.subscribers.forEach((s) => s(internalRef.current.value))
|
||||
}, [])
|
||||
|
||||
const register = useCallback(
|
||||
(name: keyof TValue) => {
|
||||
return {
|
||||
name,
|
||||
ref: handleInputRef,
|
||||
onChange: handleInputChange,
|
||||
value: internalRef.current.value[name] ?? '',
|
||||
}
|
||||
},
|
||||
[handleInputChange]
|
||||
)
|
||||
|
||||
const watch = useCallback(
|
||||
<TName extends keyof TValue>(name: TName) => {
|
||||
const [value, setValue] = useState(internalRef.current.value[name] ?? '')
|
||||
|
||||
useEffect(() => {
|
||||
const cb = (v: TValue) => setValue(v[name])
|
||||
|
||||
internalRef.current.subscribers.push(cb)
|
||||
|
||||
return () => {
|
||||
const index = internalRef.current.subscribers.indexOf(cb)
|
||||
|
||||
if (index >= 0) {
|
||||
internalRef.current.subscribers.splice(index, 1)
|
||||
}
|
||||
}
|
||||
}, [])
|
||||
|
||||
return value
|
||||
},
|
||||
[handleInputChange]
|
||||
)
|
||||
|
||||
const handleSubmit = useCallback((e: Event) => {
|
||||
e.preventDefault()
|
||||
e.stopPropagation()
|
||||
|
||||
internalRef.current.onSubmit?.(internalRef.current.value)
|
||||
}, [])
|
||||
|
||||
return {
|
||||
register,
|
||||
watch,
|
||||
handleSubmit,
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue