diff --git a/packages/firebase-firestore/index.ios.ts b/packages/firebase-firestore/index.ios.ts index 72b60260..34c1f641 100644 --- a/packages/firebase-firestore/index.ios.ts +++ b/packages/firebase-firestore/index.ios.ts @@ -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 = item[0]; - const value = 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 { "": "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)); } } @@ -202,7 +190,6 @@ export class Transaction implements ITransaction { update(documentRef: DocumentReference, 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)); }