Files
bigcapital/packages/webapp/src/hooks/useUncontrolled.ts
2023-09-11 23:17:27 +02:00

37 lines
886 B
TypeScript

import React, { useState } from 'react';
interface UseUncontrolledInput<T> {
/** Value for controlled state */
value?: T;
/** Initial value for uncontrolled state */
initialValue?: T;
/** Final value for uncontrolled state when value and initialValue are not provided */
finalValue?: T;
/** Controlled state onChange handler */
onChange?(value: T): void;
}
export function useUncontrolled<T>({
value,
initialValue,
finalValue,
onChange = () => {},
}: UseUncontrolledInput<T>) {
const [uncontrolledValue, setUncontrolledValue] = useState(
initialValue !== undefined ? initialValue : finalValue,
);
const handleUncontrolledChange = (val: T) => {
setUncontrolledValue(val);
onChange?.(val);
};
if (value !== undefined) {
return [value as T, onChange, true];
}
return [uncontrolledValue as T, handleUncontrolledChange, false];
}