49 lines
1.2 KiB
TypeScript
49 lines
1.2 KiB
TypeScript
|
import type { ChangeEvent } from 'react'
|
||
|
import { useEffect, useState } from 'react'
|
||
|
|
||
|
export interface UseInputStateProps {
|
||
|
id: string
|
||
|
name: string
|
||
|
title: string
|
||
|
subtitle?: string
|
||
|
defaultValue?: string
|
||
|
placeholder?: string
|
||
|
}
|
||
|
|
||
|
export const useInputState = ({ defaultValue, ...args }: UseInputStateProps) => {
|
||
|
const [value, setValue] = useState<string>(() => defaultValue ?? '')
|
||
|
useEffect(() => {
|
||
|
if (defaultValue) setValue(defaultValue)
|
||
|
}, [defaultValue])
|
||
|
return {
|
||
|
value,
|
||
|
onChange: (obj: string | ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
|
||
|
setValue(typeof obj === 'string' ? obj : obj.target.value)
|
||
|
},
|
||
|
...args,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export interface UseNumberInputStateProps {
|
||
|
id: string
|
||
|
name: string
|
||
|
title: string
|
||
|
subtitle?: string
|
||
|
defaultValue?: number
|
||
|
placeholder?: string
|
||
|
}
|
||
|
|
||
|
export const useNumberInputState = (args: UseNumberInputStateProps) => {
|
||
|
const [value, setValue] = useState<number>(() => args.defaultValue ?? 0)
|
||
|
useEffect(() => {
|
||
|
if (args.defaultValue) setValue(args.defaultValue)
|
||
|
}, [args.defaultValue])
|
||
|
return {
|
||
|
value,
|
||
|
onChange: (obj: number | ChangeEvent<HTMLInputElement>) => {
|
||
|
setValue(typeof obj === 'number' ? obj : obj.target.valueAsNumber)
|
||
|
},
|
||
|
...args,
|
||
|
}
|
||
|
}
|