From 596071da5ca325b772ba76d4998a1c99fa58d7f7 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 26 Nov 2020 15:58:02 +1100 Subject: [PATCH] SideDrawer form: Reset fields when firestore doc updates --- .../components/SideDrawer/Form/Autosave.tsx | 36 ++++++++++--------- www/src/components/SideDrawer/Form/Reset.tsx | 29 +++++++++++++++ www/src/components/SideDrawer/Form/index.tsx | 21 ++++++----- 3 files changed, 59 insertions(+), 27 deletions(-) create mode 100644 www/src/components/SideDrawer/Form/Reset.tsx diff --git a/www/src/components/SideDrawer/Form/Autosave.tsx b/www/src/components/SideDrawer/Form/Autosave.tsx index 893bf9c1..ceaa0374 100644 --- a/www/src/components/SideDrawer/Form/Autosave.tsx +++ b/www/src/components/SideDrawer/Form/Autosave.tsx @@ -6,42 +6,43 @@ import _omitBy from "lodash/omitBy"; import _isUndefined from "lodash/isUndefined"; import _reduce from "lodash/reduce"; -import { Control, useWatch } from "react-hook-form"; +import { Control, UseFormMethods, useWatch } from "react-hook-form"; import { Values } from "./utils"; import { useAppContext } from "contexts/AppContext"; import { useFiretableContext, firetableUser } from "contexts/FiretableContext"; +import { FiretableState } from "hooks/useFiretable"; export interface IAutosaveProps { control: Control; - defaultValues: Values; docRef: firebase.firestore.DocumentReference; row: any; + reset: UseFormMethods["reset"]; } +const getEditables = (values: Values, tableState?: FiretableState) => + _pick( + values, + (tableState && + (Array.isArray(tableState?.columns) + ? tableState?.columns + : Object.values(tableState?.columns) + ).map((c) => c.key)) ?? + [] + ); + export default function Autosave({ control, - defaultValues, docRef, row, + reset, }: IAutosaveProps) { const { currentUser } = useAppContext(); const { tableState } = useFiretableContext(); const values = useWatch({ control }); - const getEditables = (value) => - _pick( - value, - (tableState && - (Array.isArray(tableState?.columns) - ? tableState?.columns - : Object.values(tableState?.columns) - ).map((c) => c.key)) ?? - [] - ); - - const [debouncedValue] = useDebounce(getEditables(values), 1000, { + const [debouncedValue] = useDebounce(getEditables(values, tableState), 1000, { equalityFn: _isEqual, }); @@ -68,7 +69,10 @@ export default function Autosave({ _ft_updatedBy, updatedBy: _ft_updatedBy, }) - .then(() => console.log("Updated row", row.ref.id, updatedValues)); + .then(() => { + console.log("Updated row", row.ref.id, updatedValues); + reset(); + }); }, [debouncedValue]); return null; diff --git a/www/src/components/SideDrawer/Form/Reset.tsx b/www/src/components/SideDrawer/Form/Reset.tsx new file mode 100644 index 00000000..6a1e77b1 --- /dev/null +++ b/www/src/components/SideDrawer/Form/Reset.tsx @@ -0,0 +1,29 @@ +import React, { useEffect } from "react"; +import { UseFormMethods } from "react-hook-form"; + +import { Values } from "./utils"; + +export interface IResetProps + extends Pick { + defaultValues: Values; +} + +export default function Reset({ + defaultValues, + formState, + reset, + getValues, +}: IResetProps) { + useEffect(() => { + const resetValues = { ...defaultValues }; + for (const [field, isDirty] of Object.entries(formState.dirtyFields)) { + if (isDirty) { + console.log(field, resetValues[field], getValues(field)); + resetValues[field] = getValues(field); + } + } + reset(resetValues, { isDirty: true, dirtyFields: true }); + }, [JSON.stringify(defaultValues)]); + + return null; +} diff --git a/www/src/components/SideDrawer/Form/index.tsx b/www/src/components/SideDrawer/Form/index.tsx index 9fc07c8d..f13a3ef5 100644 --- a/www/src/components/SideDrawer/Form/index.tsx +++ b/www/src/components/SideDrawer/Form/index.tsx @@ -9,6 +9,7 @@ import { Values } from "./utils"; import { getFieldProp } from "components/fields"; import { IFieldConfig } from "components/fields/types"; import Autosave from "./Autosave"; +import Reset from "./Reset"; import FieldWrapper from "./FieldWrapper"; import { useAppContext } from "contexts/AppContext"; @@ -39,13 +40,10 @@ export default function Form({ values }: IFormProps) { const { ref: docRef, ...rowValues } = values; const defaultValues = { ...initialValues, ...rowValues }; - const { control } = useForm({ mode: "onBlur", defaultValues }); - - // Update field values when Firestore document updates - // useEffect(() => { - // console.log("RESET", defaultValues); - // reset(defaultValues); - // }, [reset, JSON.stringify(rowValues)]); + const { control, reset, formState, getValues, handleSubmit } = useForm({ + mode: "onBlur", + defaultValues, + }); // const { sideDrawerRef } = useFiretableContext(); // useEffect(() => { @@ -61,11 +59,12 @@ export default function Form({ values }: IFormProps) { return (
- +