diff --git a/package-lock.json b/package-lock.json index 999951f..1ed116d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,9 @@ "name": "react-query-external-sync", "version": "2.2.3", "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, "devDependencies": { "@babel/core": "^7.23.9", "@babel/preset-env": "^7.23.9", @@ -2563,6 +2566,12 @@ "node": ">=0.10.0" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", diff --git a/package.json b/package.json index 4b7d895..355dc62 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,9 @@ ], "author": "LovesWorking (https://github.com/LovesWorking)", "license": "MIT", - "dependencies": {}, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, "peerDependencies": { "@tanstack/react-query": "^4.0.0 || ^5.0.0", "react": "^18 || ^19", diff --git a/src/react-query-external-sync/hooks/useDynamicAsyncStorageQueries.ts b/src/react-query-external-sync/hooks/useDynamicAsyncStorageQueries.ts index a682c42..e2fe4a3 100644 --- a/src/react-query-external-sync/hooks/useDynamicAsyncStorageQueries.ts +++ b/src/react-query-external-sync/hooks/useDynamicAsyncStorageQueries.ts @@ -1,6 +1,6 @@ import { useEffect, useMemo, useState } from 'react'; import { QueryClient, useQueries } from '@tanstack/react-query'; - +import isEqual from 'fast-deep-equal'; import { storageQueryKeys } from './storageQueryKeys'; /** @@ -171,7 +171,7 @@ export function useDynamicAsyncStorageQueries({ // Only compare if we have cached data (avoid false positives after cache clear) if (cachedData !== undefined) { // Compare values (deep comparison for objects) - const valuesAreDifferent = JSON.stringify(currentValue) !== JSON.stringify(cachedData); + const valuesAreDifferent = !isEqual(currentValue, cachedData); if (valuesAreDifferent) { console.log('🔄 [AsyncStorage Hook] Value changed for key:', key); diff --git a/src/react-query-external-sync/hooks/useDynamicSecureStorageQueries.ts b/src/react-query-external-sync/hooks/useDynamicSecureStorageQueries.ts index b972b52..1f5182f 100644 --- a/src/react-query-external-sync/hooks/useDynamicSecureStorageQueries.ts +++ b/src/react-query-external-sync/hooks/useDynamicSecureStorageQueries.ts @@ -2,6 +2,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { QueryClient, useQueries } from '@tanstack/react-query'; import { storageQueryKeys } from './storageQueryKeys'; +import isEqual from "fast-deep-equal"; /** * SecureStore interface that matches expo-secure-store API @@ -247,7 +248,7 @@ export function useDynamicSecureStorageQueries({ // Only compare if we have cached data (avoid false positives after cache clear) if (cachedData !== undefined) { // Deep comparison using a more robust method - const valuesAreDifferent = !deepEqual(currentValue, cachedData); + const valuesAreDifferent = !isEqual(currentValue, cachedData); if (valuesAreDifferent) { console.log('🔄 [SecureStore Hook] Value changed for key:', key); @@ -308,24 +309,4 @@ export function useDynamicSecureStorageQueries({ } return queries; -} - -// Helper function for deep equality comparison -function deepEqual(a: unknown, b: unknown): boolean { - if (a === b) return true; - - if (a === null || b === null || a === undefined || b === undefined) { - return a === b; - } - - if (typeof a !== typeof b) return false; - - if (typeof a !== 'object') return a === b; - - // For objects, use JSON comparison as fallback but handle edge cases - try { - return JSON.stringify(a) === JSON.stringify(b); - } catch { - return false; - } -} +} \ No newline at end of file