refactor hooks organization and month picker

This commit is contained in:
Felipe Coutinho
2026-03-06 16:39:49 +00:00
parent 9a5e9161db
commit ad0df4ea81
22 changed files with 239 additions and 239 deletions

View File

@@ -1,10 +1,10 @@
import { useState } from "react";
import { useCallback, useRef, useState } from "react";
/**
* Hook for managing form state with type-safe field updates
*
* @param initialValues - Initial form values
* @returns Object with formState, updateField, resetForm, setFormState
* @returns Object with formState, updateField, updateFields, replaceForm, resetForm
*
* @example
* ```tsx
@@ -16,37 +16,45 @@ import { useState } from "react";
* updateField('name', 'John');
* ```
*/
export function useFormState<T extends Record<string, unknown>>(
initialValues: T,
) {
export function useFormState<T extends object>(initialValues: T) {
const latestInitialValuesRef = useRef(initialValues);
latestInitialValuesRef.current = initialValues;
const [formState, setFormState] = useState<T>(initialValues);
/**
* Updates a single field in the form state
*/
const updateField = <K extends keyof T>(field: K, value: T[K]) => {
setFormState((prev) => ({ ...prev, [field]: value }));
};
const updateField = useCallback(
<K extends keyof T>(field: K, value: T[K]) => {
setFormState((prev) => ({ ...prev, [field]: value }));
},
[],
);
/**
* Resets form to initial values
*/
const resetForm = () => {
setFormState(initialValues);
};
const resetForm = useCallback((nextValues?: T) => {
setFormState(nextValues ?? latestInitialValuesRef.current);
}, []);
/**
* Updates multiple fields at once
*/
const updateFields = (updates: Partial<T>) => {
const updateFields = useCallback((updates: Partial<T>) => {
setFormState((prev) => ({ ...prev, ...updates }));
};
}, []);
const replaceForm = useCallback((nextValues: T) => {
setFormState(nextValues);
}, []);
return {
formState,
updateField,
updateFields,
replaceForm,
resetForm,
setFormState,
};
}