@rpcbase/client 0.107.0 → 0.110.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/hashState.js CHANGED
@@ -3,7 +3,8 @@ import {useState, useEffect, createContext, useContext, useCallback} from "react
3
3
  import LZString from "lz-string"
4
4
  import _isNil from "lodash/isNil"
5
5
  import _omitBy from "lodash/omitBy"
6
- import isEqual from "fast-deep-equal"
6
+
7
+ import isEqualValues from "./isEqualValues"
7
8
 
8
9
 
9
10
  const PAGE_NAVIGATION_EVENT = "RB_PAGE_NAVIGATION"
@@ -87,7 +88,7 @@ export const HashStateProvider = ({children}) => {
87
88
  ...parsed,
88
89
  }
89
90
  // apply only if changed
90
- if (!isEqual(hashState, newState)) {
91
+ if (!isEqualValues(hashState, newState)) {
91
92
  setHashState(newState)
92
93
  }
93
94
  }
@@ -0,0 +1,47 @@
1
+ /* @flow */
2
+ const isEqual = require("fast-deep-equal/react")
3
+
4
+
5
+ const isPlainObject = (obj) => {
6
+ return Object.prototype.toString.call(obj) === "[object Object]"
7
+ }
8
+
9
+ const sortValuesConsideringObjects = (values) => {
10
+ return values
11
+ .map(val => (isPlainObject(val) ? sortValuesConsideringObjects(Object.values(val)) : val))
12
+ .sort()
13
+ }
14
+
15
+ const isEqualValues = (a, b) => {
16
+ // Extract values and sort them if they belong to plain objects
17
+ const valsA = isPlainObject(a) ? sortValuesConsideringObjects(Object.values(a)) : a
18
+ const valsB = isPlainObject(b) ? sortValuesConsideringObjects(Object.values(b)) : b
19
+
20
+ if (valsA === null && valsB === null) {
21
+ return true
22
+ }
23
+
24
+ if (Array.isArray(valsA) || Array.isArray(valsB)) {
25
+ return isEqual(valsA, valsB)
26
+ }
27
+
28
+ // Check value count
29
+ if (valsA.length !== valsB.length) return false
30
+
31
+ // Compare the sorted arrays of values
32
+ for (let i = 0; i < valsA.length; i++) {
33
+ if (typeof valsA[i] === "object" && typeof valsB[i] === "object") {
34
+ if (!isEqualValues(valsA[i], valsB[i])) {
35
+ return false
36
+ }
37
+ } else {
38
+ if (!isEqual(valsA[i], valsB[i])) {
39
+ return false
40
+ }
41
+ }
42
+ }
43
+ return true
44
+ }
45
+
46
+
47
+ module.exports = isEqualValues
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpcbase/client",
3
- "version": "0.107.0",
3
+ "version": "0.110.0",
4
4
  "scripts": {
5
5
  "build-firebase": "webpack -c firebase/webpack.config.js",
6
6
  "build": "yarn build-firebase",
@@ -3,10 +3,10 @@ import assert from "assert"
3
3
  import {Platform} from "react-native"
4
4
  import {useCallback, useEffect, useState, useMemo, useId, useRef} from "react"
5
5
  import debug from "debug"
6
- import isEqual from "fast-deep-equal/react"
7
6
  import _omit from "lodash/omit"
8
7
  import LZString from "lz-string"
9
8
 
9
+ import isEqualValues from "../../isEqualValues"
10
10
  import get_uid from "../../auth/get_uid"
11
11
 
12
12
  import useData from "./useData"
@@ -142,7 +142,7 @@ const getUseQuery = (register_query) => (
142
142
  hasFirstReply.current = true
143
143
 
144
144
  // skip if we already have the data
145
- if (isEqual(data, newData)) {
145
+ if (isEqualValues(data, newData)) {
146
146
  applyContext(context)
147
147
  return
148
148
  }
@@ -158,7 +158,7 @@ const getUseQuery = (register_query) => (
158
158
  return
159
159
  }
160
160
 
161
- if (!isEqual(data, newData)) {
161
+ if (!isEqualValues(data, newData)) {
162
162
  applyContext(context)
163
163
  applyNewData(newData, context)
164
164
  } else {