Skip to content
This repository was archived by the owner on Apr 4, 2023. It is now read-only.

Commit 427d0b0

Browse files
Application crashes when using arrayUnion from firestore #985
1 parent aef69eb commit 427d0b0

File tree

8 files changed

+773
-294
lines changed

8 files changed

+773
-294
lines changed

demo-ng/app/tabs/firestore/firestore.component.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,8 +235,8 @@ export class FirestoreComponent {
235235
last: "Updated From 'arrayUnion'",
236236
fieldToDelete: firestore.FieldValue.delete(),
237237
updateTs: firebase.firestore().FieldValue().serverTimestamp(),
238-
// just fyi - both these work:
239-
colors: firestore.FieldValue.arrayUnion(["red", "blue"])
238+
// just fyi - both of these work:
239+
colors: firestore.FieldValue.arrayUnion("red", "blue")
240240
// colors: firebase.firestore().FieldValue().arrayUnion(["red", "blue"])
241241
})
242242
.then(() => console.log("Woofie updated from 'arrayUnion'"))
@@ -248,7 +248,7 @@ export class FirestoreComponent {
248248
.update({
249249
last: "Updated From 'arrayRemove'",
250250
updateTs: firebase.firestore().FieldValue().serverTimestamp(),
251-
colors: firebase.firestore().FieldValue().arrayRemove(["red"])
251+
colors: firebase.firestore().FieldValue().arrayRemove("red")
252252
})
253253
.then(() => console.log("Woofie updated from 'arrayRemove'"))
254254
.catch(err => console.log("Updating Woofie from 'arrayRemove' failed, error: " + JSON.stringify(err)));

docs/FIRESTORE.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,9 +238,15 @@ If your document contains an array field, you can use `arrayUnion()` and `arrayR
238238
`arrayUnion()` adds elements to an array but only elements not already present:
239239

240240
```typescript
241+
import { firestore } from "nativescript-plugin-firebase";
242+
const firebase = require("nativescript-plugin-firebase/app");
243+
241244
firebase.firestore().collection("dogs").doc("fave")
242245
.update({
243-
colors: firebase.firestore().FieldValue().arrayUnion(["red", "blue"])
246+
// you can either use this syntax:
247+
colors1: firebase.firestore().FieldValue().arrayUnion("red", "blue"),
248+
//.. or this one:
249+
colors2: firestore.FieldValue.arrayUnion("red", "blue")
244250
});
245251
```
246252

@@ -249,7 +255,7 @@ firebase.firestore().collection("dogs").doc("fave")
249255
```typescript
250256
firebase.firestore().collection("dogs").doc("fave")
251257
.update({
252-
colors: firebase.firestore().FieldValue().arrayRemove(["red"])
258+
colors: firebase.firestore().FieldValue().arrayRemove("red")
253259
});
254260
```
255261

src/app/firestore/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ export namespace firestore {
1717
value: undefined,
1818
serverTimestamp: () => "SERVER_TIMESTAMP",
1919
delete: () => "DELETE_FIELD",
20-
arrayUnion: (fields: Array<any>) => new firebase.firestore.FieldValue("ARRAY_UNION", fields),
21-
arrayRemove: (fields: Array<any>) => new firebase.firestore.FieldValue("ARRAY_REMOVE", fields)
20+
arrayUnion: (...elements: any[]) => new firebase.firestore.FieldValue("ARRAY_UNION", elements),
21+
arrayRemove: (...elements: any[]) => new firebase.firestore.FieldValue("ARRAY_REMOVE", elements)
2222
};
2323
}
2424

src/firebase-common.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ export class FieldValue {
1616

1717
static serverTimestamp = () => "SERVER_TIMESTAMP";
1818
static delete = () => "DELETE_FIELD";
19-
static arrayUnion = (fields: Array<any>) => new FieldValue("ARRAY_UNION", fields);
20-
static arrayRemove = (fields: Array<any>) => new FieldValue("ARRAY_REMOVE", fields);
19+
static arrayUnion = (...elements: any[]) => new FieldValue("ARRAY_UNION", elements);
20+
static arrayRemove = (...elements: any[]) => new FieldValue("ARRAY_REMOVE", elements);
2121
}
2222

2323
export class GeoPoint {

src/firebase.android.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,10 @@ firebase.toHashMap = obj => {
118118
} else if (obj[property] instanceof FieldValue) {
119119
const fieldValue: FieldValue = obj[property];
120120
if (fieldValue.type === "ARRAY_UNION") {
121-
node.put(property, com.google.firebase.firestore.FieldValue.arrayUnion(fieldValue.value));
121+
// nested arrays are not allowed, so harden against wrong usage: arrayUnion(["foo", "bar"]) vs arrayUnion("foo", "bar")
122+
node.put(property, com.google.firebase.firestore.FieldValue.arrayUnion(Array.isArray(fieldValue.value[0]) ? fieldValue.value[0] : fieldValue.value));
122123
} else if (fieldValue.type === "ARRAY_REMOVE") {
123-
node.put(property, com.google.firebase.firestore.FieldValue.arrayRemove(fieldValue.value));
124+
node.put(property, com.google.firebase.firestore.FieldValue.arrayRemove(Array.isArray(fieldValue.value[0]) ? fieldValue.value[0] : fieldValue.value));
124125
} else {
125126
console.log("You found a bug! Please report an issue at https://github.com/EddyVerbruggen/nativescript-plugin-firebase/issues, mention fieldValue.type = '" + fieldValue.type + "'. Thanks!");
126127
}

src/firebase.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -726,8 +726,8 @@ export namespace firestore {
726726

727727
static serverTimestamp: () => "SERVER_TIMESTAMP";
728728
static delete: () => "DELETE_FIELD";
729-
static arrayUnion: (fields: Array<any>) => FieldValue;
730-
static arrayRemove: (fields: Array<any>) => FieldValue;
729+
static arrayUnion: (...elements: any[]) => FieldValue;
730+
static arrayRemove: (...elements: any[]) => FieldValue;
731731
}
732732

733733
export interface SnapshotListenOptions {

src/firebase.ios.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1825,9 +1825,10 @@ function fixSpecialField(item): any {
18251825
} else if (item instanceof FieldValue) {
18261826
const fieldValue: FieldValue = item;
18271827
if (fieldValue.type === "ARRAY_UNION") {
1828-
return FIRFieldValue.fieldValueForArrayUnion(fieldValue.value);
1828+
// nested arrays are not allowed, so harden against wrong usage: arrayUnion(["foo", "bar"]) vs arrayUnion("foo", "bar")
1829+
return FIRFieldValue.fieldValueForArrayUnion(Array.isArray(fieldValue.value[0]) ? fieldValue.value[0] : fieldValue.value);
18291830
} else if (fieldValue.type === "ARRAY_REMOVE") {
1830-
return FIRFieldValue.fieldValueForArrayRemove(fieldValue.value);
1831+
return FIRFieldValue.fieldValueForArrayRemove(Array.isArray(fieldValue.value[0]) ? fieldValue.value[0] : fieldValue.value);
18311832
} else {
18321833
console.log("You found a bug! Please report an issue at https://github.com/EddyVerbruggen/nativescript-plugin-firebase/issues, mention fieldValue.type = '" + fieldValue.type + "'. Thanks!");
18331834
}

0 commit comments

Comments
 (0)