Skip to content

Commit

Permalink
fix(firestore): iOS nested FieldValues not serialized in update() (#139)
Browse files Browse the repository at this point in the history
* fix(firestore): iOS nested FieldValues not serialized in update()

* Fix top level FieldValue values become `{}`
  • Loading branch information
delaneyb committed Oct 12, 2022
1 parent 47170af commit 7f6da0b
Showing 1 changed file with 11 additions and 24 deletions.
35 changes: 11 additions & 24 deletions packages/firebase-firestore/index.ios.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,31 +140,19 @@ function serializeItems(value) {
return value;
}

function createDictionary(field: any, value?: any, moreFieldsAndValues?: any) {
const data = {};
if (data && !value && !moreFieldsAndValues) {
Object.entries(field).forEach((item) => {
const key = <any>item[0];
const value = <any>item[1];
if (key instanceof FieldPath) {
data[key.native as any] = value?.native || value;
function createDictionary(dataOrField: any, fieldPathValue?: any, moreFieldsAndValues?: any) {
// TODO: Correctly handle FieldPaths used as keys or passed in the dataOrField and
// moreFieldsAndValues params e.g. new FieldPath(['test', '123']) will currently result in an
// object like { "<FIRFieldPath: 0x283f94640>": "value" }
const data = {}
const assignKeyValue = (key, val) => data[key instanceof FieldPath ? key.native : key] = serializeItems(val);
if (!fieldPathValue && !moreFieldsAndValues) {
Object.entries(dataOrField).forEach((item) => assignKeyValue(item[0], item[1]));
} else {
data[key] = value?.native || value;
}
});
} else {
if (field instanceof FieldPath) {
data[field.native as any] = value?.native || value;
} else {
data[field] = value?.native || value;
}

assignKeyValue(dataOrField, fieldPathValue);
if (Array.isArray(moreFieldsAndValues)) {
for (let i = 0; i < moreFieldsAndValues.length; i += 2) {
const key = moreFieldsAndValues[i];
const value = moreFieldsAndValues[i + 1];
data[key?.native || key] = value?.native || value;
}
Object.entries(Object.fromEntries(moreFieldsAndValues))
.forEach(([key, value]) => assignKeyValue(key, value));
}
}

Expand Down Expand Up @@ -202,7 +190,6 @@ export class Transaction implements ITransaction {
update<T extends DocumentData = DocumentData, K extends keyof T = string>(documentRef: DocumentReference<T>, field: K | FieldPath, value: T[K], moreFieldsAndValues: any[]): Transaction;
update(documentRef: any, field: any, value?: any, moreFieldsAndValues?: any): Transaction {
const data = createDictionary(field, value, moreFieldsAndValues);

return Transaction.fromNative(this._native.updateDataForDocument(data as any, documentRef?.native));
}

Expand Down

0 comments on commit 7f6da0b

Please sign in to comment.