Skip to content

Commit 3aabcdf

Browse files
authored
Merge pull request #7 from mayank1513/readability
Enhance readability
2 parents afe30a1 + a2969bc commit 3aabcdf

File tree

3 files changed

+27
-22
lines changed

3 files changed

+27
-22
lines changed

.github/workflows/sync.yml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
name: Sync
22

3-
on:
4-
push:
5-
branches: [main]
3+
on: [push, pull_request]
64

75
jobs:
86
sync:

packages/persist-and-sync/__tests__/index.test.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,11 @@ describe.concurrent("Setting state", () => {
1616
expect(result.current.count).toBe(5);
1717
expect(localStorage.getItem("example")).toBe('{"count":5}');
1818
});
19+
20+
test("test exclude key", async ({ expect }) => {
21+
const { result } = renderHook(() => useCookieStore());
22+
act(() => result.current.set_Count(6));
23+
expect(result.current._count).toBe(6);
24+
expect(localStorage.getItem("example")).not.toBe('{"count":6}');
25+
});
1926
});

packages/persist-and-sync/src/index.ts

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,16 @@ export type PersistNSyncOptionsType = {
77
include?: (string | RegExp)[];
88
exclude?: (string | RegExp)[];
99
storage?: "localStorage" | "sessionStorage" | "cookies";
10+
/** @defaultValue 100 */
11+
initDelay?: number;
1012
};
1113
type PersistNSyncType = <T>(
1214
f: StateCreator<T, [], []>,
1315
options: PersistNSyncOptionsType,
1416
) => StateCreator<T, [], []>;
1517

18+
const DEFAULT_INIT_DELAY = 100;
19+
1620
function getItem(options: PersistNSyncOptionsType) {
1721
const { storage } = options;
1822
if (storage === "cookies") {
@@ -46,7 +50,8 @@ export const persistNSync: PersistNSyncType = (stateCreator, options) => (set, g
4650
const { name } = options;
4751
const savedState = getItem(options);
4852
/** timeout 0 is enough. timeout 100 is added to avoid server and client render content mismatch error */
49-
if (savedState) setTimeout(() => set({ ...get(), ...JSON.parse(savedState) }), 100);
53+
const delay = options.initDelay === undefined ? DEFAULT_INIT_DELAY : options.initDelay;
54+
if (savedState) setTimeout(() => set({ ...get(), ...JSON.parse(savedState) }), delay);
5055

5156
const set_: typeof set = (newStateOrPartialOrFunction, replace) => {
5257
set(newStateOrPartialOrFunction, replace);
@@ -55,10 +60,7 @@ export const persistNSync: PersistNSyncType = (stateCreator, options) => (set, g
5560
};
5661

5762
window.addEventListener("storage", e => {
58-
if (e.key === name) {
59-
const newState = JSON.parse(e.newValue || "{}");
60-
set({ ...get(), ...newState });
61-
}
63+
if (e.key === name) set({ ...get(), ...JSON.parse(e.newValue || "{}") });
6264
});
6365
return stateCreator(set_, get, store);
6466
};
@@ -76,22 +78,12 @@ const getKeysToPersistAndSyncMemoised = (() => {
7678
const { exclude, include } = options;
7779

7880
const keysToInlcude = include?.length
79-
? keys.filter(key => {
80-
for (const patternOrKey of include) {
81-
if (typeof patternOrKey === "string" && key === patternOrKey) return true;
82-
else if (patternOrKey instanceof RegExp && patternOrKey.test(key)) return true;
83-
}
84-
return false;
85-
})
81+
? keys.filter(key => matchPatternOrKey(key, include))
8682
: keys;
8783

88-
const keysToPersistAndSync = keysToInlcude.filter(key => {
89-
for (const patternOrKey of exclude || []) {
90-
if (typeof patternOrKey === "string" && key === patternOrKey) return false;
91-
else if (patternOrKey instanceof RegExp && patternOrKey.test(key)) return false;
92-
}
93-
return true;
94-
});
84+
const keysToPersistAndSync = keysToInlcude.filter(
85+
key => !matchPatternOrKey(key, exclude || []),
86+
);
9587
return keysToPersistAndSync;
9688
};
9789

@@ -103,6 +95,14 @@ const getKeysToPersistAndSyncMemoised = (() => {
10395
};
10496
})();
10597

98+
function matchPatternOrKey(key: string, patterns: (string | RegExp)[]) {
99+
for (const patternOrKey of patterns) {
100+
if (typeof patternOrKey === "string" && key === patternOrKey) return true;
101+
else if (patternOrKey instanceof RegExp && patternOrKey.test(key)) return true;
102+
}
103+
return false;
104+
}
105+
106106
function saveAndSync({ newState, options }: SaveAndSyncProps) {
107107
const keysToPersistAndSync = getKeysToPersistAndSyncMemoised(Object.keys(newState), options);
108108

0 commit comments

Comments
 (0)