From a40af023bf615a9c54e4007c9bb00c2632e1f4d4 Mon Sep 17 00:00:00 2001 From: Andrew Meyer Date: Fri, 1 Sep 2023 13:43:08 +0200 Subject: [PATCH 1/5] Make useObject compatible with undefined objects * If somehow an object returns undefined, re-renders would be skipped * Added tests for proving that re-renders occur when the database is cleared * Removed 11.0.0-rc from peer-dependency --- packages/realm-react/package.json | 4 ++-- .../src/__tests__/useObjectRender.test.tsx | 18 ++++++++++++++++++ .../src/__tests__/useQueryRender.test.tsx | 19 +++++++++++++++++++ packages/realm-react/src/useObject.tsx | 6 +++--- 4 files changed, 42 insertions(+), 5 deletions(-) diff --git a/packages/realm-react/package.json b/packages/realm-react/package.json index 93a6d68527..baf224c639 100644 --- a/packages/realm-react/package.json +++ b/packages/realm-react/package.json @@ -70,13 +70,13 @@ "react": "18.2.0", "react-native": "0.71.7", "react-test-renderer": "18.2.0", - "realm": "*", + "realm": "^11.0.0-rc.0", "rollup-plugin-dts": "^5.0.0", "ts-jest": "^29.0.5" }, "peerDependencies": { "react": ">=17.0.2", - "realm": "^12.0.0-browser || ^12.0.0 || ^12.0.0-rc || ^11.0.0-rc || ^11.0.0" + "realm": "^12.0.0-browser || ^12.0.0 || ^12.0.0-rc || ^11.0.0" }, "optionalDependencies": { "@babel/runtime": ">=7", diff --git a/packages/realm-react/src/__tests__/useObjectRender.test.tsx b/packages/realm-react/src/__tests__/useObjectRender.test.tsx index fc138fcc07..d17230eb0b 100644 --- a/packages/realm-react/src/__tests__/useObjectRender.test.tsx +++ b/packages/realm-react/src/__tests__/useObjectRender.test.tsx @@ -438,6 +438,24 @@ describe("useObject: rendering objects with a Realm.List property", () => { fireEvent.press(rerenderButton); expect(objectChangeCounter).toHaveBeenCalledTimes(expectedCount); }); + it("will rerender when the realm database is cleared", async () => { + await setupTest(); + + const initialCount = 2; + + expect(objectChangeCounter).toHaveBeenCalledTimes(initialCount); + + await act(async () => { + testRealm.write(() => { + testRealm.deleteAll(); + }); + forceSynchronousNotifications(testRealm); + }); + + await new Promise((resolve) => setTimeout(resolve, 1000)); + + expect(objectChangeCounter).toHaveBeenCalledTimes(initialCount + 1); + }); }); describe("rendering objects with a Realm.List property", () => { diff --git a/packages/realm-react/src/__tests__/useQueryRender.test.tsx b/packages/realm-react/src/__tests__/useQueryRender.test.tsx index 9b391b27d0..839ab8d349 100644 --- a/packages/realm-react/src/__tests__/useQueryRender.test.tsx +++ b/packages/realm-react/src/__tests__/useQueryRender.test.tsx @@ -443,4 +443,23 @@ describe.each` fireEvent.press(rerenderButton); expect(queryObjectChangeCounter).toHaveBeenCalledTimes(1); }); + + it("will rerender when the realm database is cleared", async () => { + await setupTest({ queryType }); + + const initialCount = 1; + + expect(queryObjectChangeCounter).toHaveBeenCalledTimes(initialCount); + + await act(async () => { + testRealm.write(() => { + testRealm.deleteAll(); + }); + forceSynchronousNotifications(testRealm); + }); + + await new Promise((resolve) => setTimeout(resolve, 1000)); + + expect(queryObjectChangeCounter).toHaveBeenCalledTimes(initialCount + 1); + }); }); diff --git a/packages/realm-react/src/useObject.tsx b/packages/realm-react/src/useObject.tsx index 985de52352..c9e89b5021 100644 --- a/packages/realm-react/src/useObject.tsx +++ b/packages/realm-react/src/useObject.tsx @@ -56,7 +56,7 @@ export function createUseObject(useRealm: () => Realm) { // Ref: https://github.com/facebook/react/issues/14490 const cachedObjectRef = useRef(null); - if (cachedObjectRef.current === null) { + if (!cachedObjectRef.current) { cachedObjectRef.current = createCachedObject({ object: originalObject ?? null, realm, @@ -81,7 +81,7 @@ export function createUseObject(useRealm: () => Realm) { // Re-instantiate the cachedObject if the primaryKey has changed or the originalObject has gone from null to not null if ( !arePrimaryKeysIdentical(primaryKey, primaryKeyRef.current) || - (originalObjectRef.current === null && originalObject !== null) + (!originalObjectRef.current && originalObject) ) { cachedObjectRef.current = createCachedObject({ object: originalObject ?? null, @@ -138,7 +138,7 @@ export function createUseObject(useRealm: () => Realm) { }, [realm, type, forceRerender]); // If the object has been deleted or doesn't exist for the given primary key, just return null - if (object === null || object?.isValid() === false) { + if (!object || object?.isValid() === false) { return null; } From aa28e66dce9d662c3286ba38897efeaaaac8f6a1 Mon Sep 17 00:00:00 2001 From: Andrew Meyer Date: Fri, 1 Sep 2023 13:47:38 +0200 Subject: [PATCH 2/5] Update CHANGELOG --- packages/realm-react/CHANGELOG.md | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/realm-react/CHANGELOG.md b/packages/realm-react/CHANGELOG.md index 2a8045c40f..fe725c93ea 100644 --- a/packages/realm-react/CHANGELOG.md +++ b/packages/realm-react/CHANGELOG.md @@ -7,18 +7,14 @@ * None ### Fixed -* ([#????](https://github.com/realm/realm-js/issues/????), since v?.?.?) -* None +* `useObject` will now re-render if the result of `objectForPrimaryKey` is `null` or `undefined`. ([#6101](https://github.com/realm/realm-js/issues/6101)) ### Compatibility -* React Native >= v0.71.4 -* Realm Studio v14.0.0. -* File format: generates Realms with format v23 (reads and upgrades file format v5 or later for non-synced Realm, upgrades file format v10 or later for synced Realms). +* React Native >= v0.68.0 +* Realm >= 11.0.0 ### Internal - - - +* Removed `11.0.0-rc` from compatible versions. ## 0.6.0 (2023-08-23) From c01900b868d3de8bbe7c6fc063cb553df672d1b3 Mon Sep 17 00:00:00 2001 From: Andrew Meyer Date: Fri, 1 Sep 2023 13:52:25 +0200 Subject: [PATCH 3/5] Revert realm version update --- packages/realm-react/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/realm-react/package.json b/packages/realm-react/package.json index baf224c639..0447a96eac 100644 --- a/packages/realm-react/package.json +++ b/packages/realm-react/package.json @@ -70,7 +70,7 @@ "react": "18.2.0", "react-native": "0.71.7", "react-test-renderer": "18.2.0", - "realm": "^11.0.0-rc.0", + "realm": "*", "rollup-plugin-dts": "^5.0.0", "ts-jest": "^29.0.5" }, From 75e2abfa50d5655fcc701fcf91f424cb73e9b344 Mon Sep 17 00:00:00 2001 From: Andrew Meyer Date: Fri, 1 Sep 2023 13:57:37 +0200 Subject: [PATCH 4/5] Fix compatibility --- COMPATIBILITY.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/COMPATIBILITY.md b/COMPATIBILITY.md index 05c23c1330..c95d86abca 100644 --- a/COMPATIBILITY.md +++ b/COMPATIBILITY.md @@ -23,9 +23,9 @@ | 11.2.0 | >= 0.4.0 | >= 0.70.0 | 47 | ✅ | >= 7 | >= 13 (excluding 19) | | 11.1.0 | >= 0.4.0 | >= 0.70.0 | 47 | ✅ | >= 7 | >= 13 | | 11.0.0 | >= 0.4.0 | >= 0.70.0 | 47 | ✅ | >= 7 | >= 13 | -| 11.0.0-rc.2 | >= 0.4.0 | >= 0.70.0 | N/A | ✅ | >= 7 | >= 13 | -| 11.0.0-rc.1 | >= 0.4.0 | >= 0.69.0 < 0.70.0 | 46 | ✅ | >= 7 | >= 13 | -| 11.0.0-rc.0 | >= 0.4.0 | >= 0.66.0 < 0.69.0 | 45 | ✅ | >= 7 | >= 13 | +| 11.0.0-rc.2 | >= 0.3.0 | >= 0.70.0 | N/A | ✅ | >= 7 | >= 13 | +| 11.0.0-rc.1 | >= 0.3.0 | >= 0.69.0 < 0.70.0 | 46 | ✅ | >= 7 | >= 13 | +| 11.0.0-rc.0 | >= 0.3.0 | >= 0.66.0 < 0.69.0 | 45 | ✅ | >= 7 | >= 13 | | 10.24.0 | >= 0.3.0 | >= 0.64.0 | 44 | ❌ | >= 7 | >= 13 | | 10.23.0 | >= 0.3.0 | >= 0.64.0 | 44 | ❌ | >= 7 | >= 13 | | 10.22.0 | >= 0.3.0 | >= 0.64.0 | 44 | ❌ | >= 7 | >= 13 | From e25183a825f055f0a81cc95bccfe46d463c66cb5 Mon Sep 17 00:00:00 2001 From: Andrew Meyer Date: Mon, 4 Sep 2023 09:55:17 +0200 Subject: [PATCH 5/5] Apply suggestions from code review Co-authored-by: LJ <81748770+elle-j@users.noreply.github.com> --- packages/realm-react/src/__tests__/useObjectRender.test.tsx | 1 - packages/realm-react/src/useObject.tsx | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/realm-react/src/__tests__/useObjectRender.test.tsx b/packages/realm-react/src/__tests__/useObjectRender.test.tsx index d17230eb0b..e72a0e9a86 100644 --- a/packages/realm-react/src/__tests__/useObjectRender.test.tsx +++ b/packages/realm-react/src/__tests__/useObjectRender.test.tsx @@ -452,7 +452,6 @@ describe("useObject: rendering objects with a Realm.List property", () => { forceSynchronousNotifications(testRealm); }); - await new Promise((resolve) => setTimeout(resolve, 1000)); expect(objectChangeCounter).toHaveBeenCalledTimes(initialCount + 1); }); diff --git a/packages/realm-react/src/useObject.tsx b/packages/realm-react/src/useObject.tsx index c9e89b5021..f10ec3c672 100644 --- a/packages/realm-react/src/useObject.tsx +++ b/packages/realm-react/src/useObject.tsx @@ -138,7 +138,7 @@ export function createUseObject(useRealm: () => Realm) { }, [realm, type, forceRerender]); // If the object has been deleted or doesn't exist for the given primary key, just return null - if (!object || object?.isValid() === false) { + if (!object?.isValid()) { return null; }