mirror of
https://gitlab.com/mbugroup/lti-web-client.git
synced 2026-05-20 13:32:00 +00:00
chore(FE-188,193): create formik helper function utils and create removeArrayItemAndSync formik helper function
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
import { FormikContextType, getIn, setIn } from 'formik';
|
||||
|
||||
function spliceArray<T>(arr: T[] | undefined, index: number) {
|
||||
const a = Array.isArray(arr) ? arr.slice() : [];
|
||||
if (index >= 0 && index < a.length) a.splice(index, 1);
|
||||
return a;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove one item from an array field and also trim Formik's errors & touched
|
||||
* at the SAME index to keep everything aligned.
|
||||
*
|
||||
* @param formik - your useFormik instance
|
||||
* @param arrayPath - path to the array field, e.g. "kandangExpenses[0].expenses"
|
||||
* @param index - the index to remove
|
||||
* @param validateAfter - optional: revalidate after removal (default false)
|
||||
*/
|
||||
export async function removeArrayItemAndSync<FormValues>(
|
||||
formik: FormikContextType<FormValues>,
|
||||
arrayPath: string,
|
||||
index: number,
|
||||
validateAfter: boolean = false
|
||||
) {
|
||||
// 1) VALUES: remove at index
|
||||
const currValues = getIn(formik.values, arrayPath);
|
||||
const nextValues = spliceArray(currValues, index);
|
||||
formik.setFieldValue(arrayPath, nextValues, false);
|
||||
|
||||
// 2) ERRORS: remove the same index (if array exists)
|
||||
const currErrors = getIn(formik.errors, arrayPath);
|
||||
if (Array.isArray(currErrors)) {
|
||||
const nextErrors = spliceArray(currErrors, index);
|
||||
formik.setErrors(setIn(formik.errors, arrayPath, nextErrors));
|
||||
}
|
||||
|
||||
// 3) TOUCHED: remove the same index (if array exists)
|
||||
const currTouched = getIn(formik.touched, arrayPath);
|
||||
if (Array.isArray(currTouched)) {
|
||||
const nextTouched = spliceArray(currTouched, index);
|
||||
formik.setTouched(setIn(formik.touched, arrayPath, nextTouched), false);
|
||||
}
|
||||
|
||||
// 4) (optional) revalidate to rebuild a perfectly clean error tree
|
||||
if (validateAfter) {
|
||||
const newErrors = await formik.validateForm();
|
||||
formik.setErrors(newErrors);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user