From baafde20f3881358916d2d4042244617b48007b3 Mon Sep 17 00:00:00 2001 From: Anish Roy <6275anishroy@gmail.com> Date: Fri, 17 Nov 2023 10:46:33 +0530 Subject: [PATCH] use Set if updating a nested field --- src/atoms/tableScope/rowActions.ts | 19 ++++++---- src/hooks/useFirestoreCollectionWithAtom.ts | 41 ++++++++++++++------- src/types/table.d.ts | 3 +- 3 files changed, 41 insertions(+), 22 deletions(-) diff --git a/src/atoms/tableScope/rowActions.ts b/src/atoms/tableScope/rowActions.ts index a54ce5e3..9f1834a0 100644 --- a/src/atoms/tableScope/rowActions.ts +++ b/src/atoms/tableScope/rowActions.ts @@ -407,12 +407,6 @@ export const updateFieldAtom = atom( } // Otherwise, apply the update - // Check if nested path - if (fieldName.split(".").length > 1) { - const p = tableRows.find((r) => r._rowy_ref.path === path); - // add the parent object - _set(update, fieldName.split(".")[0], _get(p, fieldName.split(".")[0])); - } _set(update, fieldName, value); } @@ -493,17 +487,26 @@ export const updateFieldAtom = atom( row._rowy_ref.path, omitRowyFields(newRowValues), deleteField ? [fieldName] : [], - arrayTableData + { + ...arrayTableData, + // using set if we are updating a nested field + useSet: fieldName.split(".").length > 1, + } ); } } // Otherwise, update single field in database and write audit update field else { + console.log("newRowValues", fieldName); await updateRowDb( row._rowy_ref.path, omitRowyFields(dbUpdate), deleteField ? [fieldName] : [], - arrayTableData + { + ...arrayTableData, + // using set if we are updating a nested field + useSet: fieldName.split(".").length > 1, + } ); } diff --git a/src/hooks/useFirestoreCollectionWithAtom.ts b/src/hooks/useFirestoreCollectionWithAtom.ts index fd0fa39e..7fa98059 100644 --- a/src/hooks/useFirestoreCollectionWithAtom.ts +++ b/src/hooks/useFirestoreCollectionWithAtom.ts @@ -256,22 +256,37 @@ export function useFirestoreCollectionWithAtom< // set the atom’s value to a function that updates a doc in the collection if (updateDocAtom) { setUpdateDocAtom( - () => async (path: string, update: T, deleteFields?: string[]) => { - const updateToDb = { ...update }; + () => + async ( + path: string, + update: T, + deleteFields?: string[], + options?: { + useSet?: boolean; + } + ) => { + const updateToDb = { ...update }; - if (Array.isArray(deleteFields)) { - for (const field of deleteFields) { - set(updateToDb as any, field, deleteField()); + if (Array.isArray(deleteFields)) { + for (const field of deleteFields) { + set(updateToDb as any, field, deleteField()); + } + } + + if (options?.useSet) { + return await setDoc(doc(firebaseDb, path), updateToDb, { + merge: true, + }); + } + + try { + return await updateDoc(doc(firebaseDb, path), updateToDb); + } catch (e) { + return await setDoc(doc(firebaseDb, path), updateToDb, { + merge: true, + }); } } - try { - return await updateDoc(doc(firebaseDb, path), updateToDb); - } catch (e) { - return await setDoc(doc(firebaseDb, path), updateToDb, { - merge: true, - }); - } - } ); } diff --git a/src/types/table.d.ts b/src/types/table.d.ts index 3ed4b7c3..12dee2d4 100644 --- a/src/types/table.d.ts +++ b/src/types/table.d.ts @@ -26,13 +26,14 @@ export type UpdateDocFunction = ( * @param path - The full path to the doc * @param update - The updates to be deeply merged with the existing doc. Note arrays should be ovewritten to match Firestore set with merge behavior * @param deleteFields - Optionally, fields to be deleted from the doc. Access nested fields with dot notation + * @param options - Optionally, filed to pass extra data to the function * @returns Promise */ export type UpdateCollectionDocFunction = ( path: string, update: Partial, deleteFields?: string[], - options?: ArrayTableRowData + options?: ArrayTableRowData & { useSet?: boolean } ) => Promise; /**