@verdant-web/react 40.1.0 → 40.2.1
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/dist/esm/{hooks.test.js → generation.test.js} +1 -1
- package/dist/esm/generation.test.js.map +1 -0
- package/dist/esm/hooks.d.ts +0 -1
- package/dist/esm/hooks.js +26 -54
- package/dist/esm/hooks.js.map +1 -1
- package/dist/esm/watch.d.ts +5 -0
- package/dist/esm/watch.js +100 -0
- package/dist/esm/watch.js.map +1 -0
- package/dist/esm/watch.test.d.ts +1 -0
- package/dist/esm/watch.test.js +148 -0
- package/dist/esm/watch.test.js.map +1 -0
- package/package.json +7 -4
- package/src/hooks.tsx +43 -67
- package/src/watch.test.tsx +222 -0
- package/src/watch.ts +141 -0
- package/dist/esm/hooks.test.js.map +0 -1
- /package/dist/esm/{hooks.test.d.ts → generation.test.d.ts} +0 -0
- /package/src/{hooks.test.ts → generation.test.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generation.test.js","sourceRoot":"","sources":["../../src/generation.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACtE,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;YACjC,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE;gBACP,EAAE,EAAE;oBACH,IAAI,EAAE,QAAQ;iBACd;gBACD,IAAI,EAAE;oBACL,IAAI,EAAE,QAAQ;iBACd;aACD;SACD,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;YACjC,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE;gBACP,EAAE,EAAE;oBACH,IAAI,EAAE,QAAQ;iBACd;gBACD,KAAK,EAAE;oBACN,IAAI,EAAE,QAAQ;iBACd;aACD;SACD,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,CAAC;YACzB,OAAO,EAAE,CAAC;YACV,WAAW,EAAE;gBACZ,OAAO;gBACP,OAAO;aACP;SACD,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;QAEtC,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
package/dist/esm/hooks.d.ts
CHANGED
package/dist/esm/hooks.js
CHANGED
|
@@ -11,16 +11,16 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
11
11
|
};
|
|
12
12
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
13
|
import { stableStringify, } from '@verdant-web/common';
|
|
14
|
-
import {
|
|
15
|
-
import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore, } from 'react';
|
|
14
|
+
import { createContext, use, useCallback, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore, } from 'react';
|
|
16
15
|
import { suspend } from 'suspend-react';
|
|
17
16
|
import { useSyncExternalStoreWithSelector } from 'use-sync-external-store/with-selector.js';
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
import { useWatch } from './watch.js';
|
|
18
|
+
function queryIsInitializing(query) {
|
|
19
|
+
return query.status === 'initial' || query.status === 'initializing';
|
|
20
20
|
}
|
|
21
|
-
function
|
|
21
|
+
function useLiveQueryResult(liveQuery, disableSuspense = false) {
|
|
22
22
|
// suspend if the query doesn't have a valid result set yet.
|
|
23
|
-
if (!disableSuspense && liveQuery &&
|
|
23
|
+
if (!disableSuspense && liveQuery && queryIsInitializing(liveQuery)) {
|
|
24
24
|
suspend(() => liveQuery.resolved, [liveQuery]);
|
|
25
25
|
}
|
|
26
26
|
return useSyncExternalStore((callback) => {
|
|
@@ -62,39 +62,11 @@ export function createHooks(schema, options = {}) {
|
|
|
62
62
|
var _a;
|
|
63
63
|
const Context = (_a = options.Context) !== null && _a !== void 0 ? _a : createContext(null);
|
|
64
64
|
function useStorage() {
|
|
65
|
-
const ctx =
|
|
65
|
+
const ctx = use(Context);
|
|
66
66
|
if (!ctx) {
|
|
67
67
|
throw new Error('No verdant provider was found');
|
|
68
68
|
}
|
|
69
|
-
return suspend(() => ctx.readyPromise, [
|
|
70
|
-
}
|
|
71
|
-
function useWatch(liveObject, options) {
|
|
72
|
-
return useSyncExternalStore((handler) => {
|
|
73
|
-
if (liveObject) {
|
|
74
|
-
if ('isFile' in liveObject) {
|
|
75
|
-
return liveObject.subscribe('change', handler);
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
if (options === null || options === void 0 ? void 0 : options.deep) {
|
|
79
|
-
return liveObject.subscribe('change', handler);
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
return liveObject.subscribe('change', handler);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return () => { };
|
|
87
|
-
}, () => {
|
|
88
|
-
if (liveObject) {
|
|
89
|
-
if (liveObject instanceof EntityFile) {
|
|
90
|
-
return liveObject.url;
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
return liveObject.getAll();
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
return undefined;
|
|
97
|
-
});
|
|
69
|
+
return suspend(() => ctx.readyPromise, [`verdant_${ctx.namespace}`]);
|
|
98
70
|
}
|
|
99
71
|
function useOnChange(liveObject, handler, options) {
|
|
100
72
|
const handlerRef = useRef(handler);
|
|
@@ -146,7 +118,7 @@ export function createHooks(schema, options = {}) {
|
|
|
146
118
|
return () => {
|
|
147
119
|
unsubs.forEach((unsub) => unsub());
|
|
148
120
|
};
|
|
149
|
-
}, () => { var _a; return (peerId ? (_a = storage.sync.presence.peers[peerId]) !== null && _a !== void 0 ? _a : null : null); });
|
|
121
|
+
}, () => { var _a; return (peerId ? ((_a = storage.sync.presence.peers[peerId]) !== null && _a !== void 0 ? _a : null) : null); });
|
|
150
122
|
}
|
|
151
123
|
function useFindPeer(query, options) {
|
|
152
124
|
const storage = useStorage();
|
|
@@ -425,7 +397,7 @@ export function createHooks(schema, options = {}) {
|
|
|
425
397
|
useField,
|
|
426
398
|
Context,
|
|
427
399
|
Provider: (_a) => {
|
|
428
|
-
var { value, children, sync } = _a, rest = __rest(_a, ["value", "children", "sync"]);
|
|
400
|
+
var { value, children, sync, fallback } = _a, rest = __rest(_a, ["value", "children", "sync", "fallback"]);
|
|
429
401
|
// auto-open storage when used in provider
|
|
430
402
|
useMemo(() => {
|
|
431
403
|
value.open();
|
|
@@ -441,16 +413,16 @@ export function createHooks(schema, options = {}) {
|
|
|
441
413
|
const storage = useStorage();
|
|
442
414
|
const liveQuery = useMemo(() => {
|
|
443
415
|
return skip ? null : storage[pluralName].get(id);
|
|
444
|
-
}, [id, skip]);
|
|
445
|
-
const data =
|
|
416
|
+
}, [id, skip, storage]);
|
|
417
|
+
const data = useLiveQueryResult(liveQuery);
|
|
446
418
|
return data;
|
|
447
419
|
};
|
|
448
420
|
hooks[getOneHookName + 'Unsuspended'] = function useIndividualUnsuspended(id, { skip } = {}) {
|
|
449
421
|
const storage = useStorage();
|
|
450
422
|
const liveQuery = useMemo(() => {
|
|
451
423
|
return skip ? null : storage[pluralName].get(id);
|
|
452
|
-
}, [id, skip]);
|
|
453
|
-
const data =
|
|
424
|
+
}, [id, skip, storage]);
|
|
425
|
+
const data = useLiveQueryResult(liveQuery, true);
|
|
454
426
|
const status = useLiveQueryStatus(liveQuery);
|
|
455
427
|
return { data, status };
|
|
456
428
|
};
|
|
@@ -460,8 +432,8 @@ export function createHooks(schema, options = {}) {
|
|
|
460
432
|
const index = useStableIndex(unstableIndex);
|
|
461
433
|
const liveQuery = useMemo(() => {
|
|
462
434
|
return skip ? null : storage[pluralName].findOne({ index, key });
|
|
463
|
-
}, [index, skip]);
|
|
464
|
-
const data =
|
|
435
|
+
}, [index, skip, storage, key]);
|
|
436
|
+
const data = useLiveQueryResult(liveQuery);
|
|
465
437
|
return data;
|
|
466
438
|
};
|
|
467
439
|
hooks[findOneHookName + 'Unsuspended'] = function useOneUnsuspended({ skip, index: unstableIndex, key, } = {}) {
|
|
@@ -469,8 +441,8 @@ export function createHooks(schema, options = {}) {
|
|
|
469
441
|
const index = useStableIndex(unstableIndex);
|
|
470
442
|
const liveQuery = useMemo(() => {
|
|
471
443
|
return skip ? null : storage[pluralName].findOne({ index, key });
|
|
472
|
-
}, [index, skip]);
|
|
473
|
-
const data =
|
|
444
|
+
}, [index, skip, storage, key]);
|
|
445
|
+
const data = useLiveQueryResult(liveQuery, true);
|
|
474
446
|
const status = useLiveQueryStatus(liveQuery);
|
|
475
447
|
return { data, status };
|
|
476
448
|
};
|
|
@@ -480,8 +452,8 @@ export function createHooks(schema, options = {}) {
|
|
|
480
452
|
const index = useStableIndex(unstableIndex);
|
|
481
453
|
// assumptions: this query getter is fast and returns the same
|
|
482
454
|
// query identity for subsequent calls.
|
|
483
|
-
const liveQuery = useMemo(() => (skip ? null : storage[pluralName].findAll({ index, key })), [index, skip]);
|
|
484
|
-
const data =
|
|
455
|
+
const liveQuery = useMemo(() => (skip ? null : storage[pluralName].findAll({ index, key })), [index, skip, storage, key]);
|
|
456
|
+
const data = useLiveQueryResult(liveQuery);
|
|
485
457
|
return data || [];
|
|
486
458
|
};
|
|
487
459
|
hooks[getAllHookName + 'Unsuspended'] = function useAllUnsuspended({ index: unstableIndex, skip, key, } = {}) {
|
|
@@ -489,8 +461,8 @@ export function createHooks(schema, options = {}) {
|
|
|
489
461
|
const index = useStableIndex(unstableIndex);
|
|
490
462
|
// assumptions: this query getter is fast and returns the same
|
|
491
463
|
// query identity for subsequent calls.
|
|
492
|
-
const liveQuery = useMemo(() => (skip ? null : storage[pluralName].findAll({ index, key })), [index, skip]);
|
|
493
|
-
const data =
|
|
464
|
+
const liveQuery = useMemo(() => (skip ? null : storage[pluralName].findAll({ index, key })), [index, skip, storage, key]);
|
|
465
|
+
const data = useLiveQueryResult(liveQuery, true) || [];
|
|
494
466
|
const status = useLiveQueryStatus(liveQuery);
|
|
495
467
|
return { data, status };
|
|
496
468
|
};
|
|
@@ -507,8 +479,8 @@ export function createHooks(schema, options = {}) {
|
|
|
507
479
|
pageSize,
|
|
508
480
|
page: 0,
|
|
509
481
|
key: key || getAllPaginatedHookName,
|
|
510
|
-
}), [index, skip, pageSize]);
|
|
511
|
-
const data =
|
|
482
|
+
}), [index, skip, pageSize, storage, key]);
|
|
483
|
+
const data = useLiveQueryResult(liveQuery, suspend === false);
|
|
512
484
|
const status = useLiveQueryStatus(liveQuery);
|
|
513
485
|
const tools = useMemo(() => ({
|
|
514
486
|
next: () => liveQuery === null || liveQuery === void 0 ? void 0 : liveQuery.nextPage(),
|
|
@@ -536,8 +508,8 @@ export function createHooks(schema, options = {}) {
|
|
|
536
508
|
index,
|
|
537
509
|
pageSize,
|
|
538
510
|
key: key || getAllInfiniteHookName,
|
|
539
|
-
}), [index, skip, pageSize]);
|
|
540
|
-
const data =
|
|
511
|
+
}), [index, skip, pageSize, storage, key]);
|
|
512
|
+
const data = useLiveQueryResult(liveQuery, suspend === false);
|
|
541
513
|
const status = useLiveQueryStatus(liveQuery);
|
|
542
514
|
const tools = useMemo(() => ({
|
|
543
515
|
loadMore: () => liveQuery === null || liveQuery === void 0 ? void 0 : liveQuery.loadMore(),
|
package/dist/esm/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/hooks.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/hooks.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { useLayoutEffect, useMemo, useRef, useSyncExternalStore } from 'react';
|
|
2
|
+
const OBSERVATION_INFO = Symbol('OBSERVATION_INFO');
|
|
3
|
+
// largely inspired by Valtio (https://github.com/pmndrs/valtio/blob/main/src/react.ts)
|
|
4
|
+
export function useWatch(entity, options) {
|
|
5
|
+
const lastSnapshot = useRef(null);
|
|
6
|
+
const observationInfo = useMemo(() => ({ accessedKeys: new Set(), accessedIndex: false }), [entity]);
|
|
7
|
+
const currSnapshot = useSyncExternalStore((handler) => {
|
|
8
|
+
if (entity) {
|
|
9
|
+
// this may seem superfluous but TS can't infer that
|
|
10
|
+
// both types have the same event key.
|
|
11
|
+
if ('isFile' in entity) {
|
|
12
|
+
return entity.subscribe('change', handler);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
if (options === null || options === void 0 ? void 0 : options.deep) {
|
|
16
|
+
return entity.subscribe('changeDeep', handler);
|
|
17
|
+
}
|
|
18
|
+
return entity.subscribe('change', handler);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return () => { };
|
|
22
|
+
}, () => {
|
|
23
|
+
if (!entity) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
if ('isFile' in entity) {
|
|
27
|
+
return entity.url;
|
|
28
|
+
}
|
|
29
|
+
// if deep is true, always re-render. otherwise, if we don't have a
|
|
30
|
+
// prior snapshot, always re-render.
|
|
31
|
+
const prevSnapshot = lastSnapshot.current;
|
|
32
|
+
if ((options === null || options === void 0 ? void 0 : options.deep) || (options === null || options === void 0 ? void 0 : options.untracked) || !prevSnapshot) {
|
|
33
|
+
return entity.getAll();
|
|
34
|
+
}
|
|
35
|
+
// if prior snapshot is equal to current, we don't have to check for changes;
|
|
36
|
+
// we know they're identical. Entity returns a new object reference on change,
|
|
37
|
+
// but keeps the old one if nothing changed.
|
|
38
|
+
const destructured = entity.getAll();
|
|
39
|
+
if (prevSnapshot === destructured) {
|
|
40
|
+
return prevSnapshot;
|
|
41
|
+
}
|
|
42
|
+
// check for changes to observed values
|
|
43
|
+
if (hasObservedChanged(observationInfo, prevSnapshot, destructured)) {
|
|
44
|
+
return destructured;
|
|
45
|
+
}
|
|
46
|
+
return prevSnapshot;
|
|
47
|
+
}, () => {
|
|
48
|
+
if (!entity)
|
|
49
|
+
return null;
|
|
50
|
+
if ('isFile' in entity)
|
|
51
|
+
return entity.url;
|
|
52
|
+
return entity.getAll();
|
|
53
|
+
});
|
|
54
|
+
useLayoutEffect(() => {
|
|
55
|
+
if (typeof currSnapshot !== 'string') {
|
|
56
|
+
lastSnapshot.current = currSnapshot;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
if (currSnapshot && typeof currSnapshot !== 'string') {
|
|
60
|
+
return createProxy(currSnapshot, observationInfo);
|
|
61
|
+
}
|
|
62
|
+
return currSnapshot;
|
|
63
|
+
}
|
|
64
|
+
function createProxy(destructured, observationInfo) {
|
|
65
|
+
const proxy = new Proxy(destructured, {
|
|
66
|
+
get(target, key, receiver) {
|
|
67
|
+
if (key === OBSERVATION_INFO) {
|
|
68
|
+
return observationInfo;
|
|
69
|
+
}
|
|
70
|
+
if (typeof key === 'number') {
|
|
71
|
+
observationInfo.accessedIndex = true;
|
|
72
|
+
}
|
|
73
|
+
else if (typeof key === 'string') {
|
|
74
|
+
observationInfo.accessedKeys.add(key);
|
|
75
|
+
}
|
|
76
|
+
return Reflect.get(target, key, receiver);
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
return proxy;
|
|
80
|
+
}
|
|
81
|
+
function hasObservedChanged(observationInfo, prev, next) {
|
|
82
|
+
// if index was accessed, re-render on any change.
|
|
83
|
+
if (observationInfo.accessedIndex) {
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
// if no keys were accessed, we just always re-render on change. this is relevant
|
|
87
|
+
// to the nullable document usage patterns -- the user may not even
|
|
88
|
+
// store a reference to the returned value, so we can't track changes.
|
|
89
|
+
if (observationInfo.accessedKeys.size === 0) {
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
// otherwise, compare values of accessed keys.
|
|
93
|
+
for (const key of observationInfo.accessedKeys) {
|
|
94
|
+
if (prev[key] !== next[key]) {
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { ClientDescriptor, createMigration, schema, } from '@verdant-web/store';
|
|
3
|
+
import { Suspense } from 'react';
|
|
4
|
+
import { afterAll, beforeAll, expect, it } from 'vitest';
|
|
5
|
+
import { render } from 'vitest-browser-react';
|
|
6
|
+
import { createHooks } from './hooks.js';
|
|
7
|
+
const testSchema = schema({
|
|
8
|
+
version: 1,
|
|
9
|
+
collections: {
|
|
10
|
+
posts: schema.collection({
|
|
11
|
+
name: 'post',
|
|
12
|
+
primaryKey: 'id',
|
|
13
|
+
fields: {
|
|
14
|
+
id: schema.fields.id(),
|
|
15
|
+
content: schema.fields.string({ default: '' }),
|
|
16
|
+
comments: schema.fields.array({
|
|
17
|
+
items: schema.fields.object({
|
|
18
|
+
properties: {
|
|
19
|
+
id: schema.fields.id(),
|
|
20
|
+
content: schema.fields.string({ default: '' }),
|
|
21
|
+
},
|
|
22
|
+
}),
|
|
23
|
+
}),
|
|
24
|
+
attachment: schema.fields.file({ nullable: true }),
|
|
25
|
+
},
|
|
26
|
+
}),
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
const hooks = createHooks(testSchema);
|
|
30
|
+
let clientDesc;
|
|
31
|
+
let client;
|
|
32
|
+
beforeAll(async () => {
|
|
33
|
+
clientDesc = new ClientDescriptor({
|
|
34
|
+
schema: testSchema,
|
|
35
|
+
oldSchemas: [testSchema],
|
|
36
|
+
migrations: [createMigration(testSchema)],
|
|
37
|
+
namespace: 'watch-test',
|
|
38
|
+
});
|
|
39
|
+
client = await clientDesc.open();
|
|
40
|
+
});
|
|
41
|
+
afterAll(() => client.close());
|
|
42
|
+
function renderWithProvider(content) {
|
|
43
|
+
return render(content, {
|
|
44
|
+
wrapper: ({ children }) => (_jsx(Suspense, { children: _jsx(hooks.Provider, { value: clientDesc, children: _jsx(Suspense, { fallback: _jsx("div", { "data-testid": "suspense", children: "Loading..." }), children: children }) }) })),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
it('should only re-render when observed keys change', async () => {
|
|
48
|
+
// seed the initial post
|
|
49
|
+
const testPost = await client.posts.put({});
|
|
50
|
+
let renderCount = 0;
|
|
51
|
+
const ObserverTest = () => {
|
|
52
|
+
const { content } = hooks.useWatch(testPost);
|
|
53
|
+
renderCount++;
|
|
54
|
+
return (_jsx("div", { children: _jsx("div", { "data-testid": "content", children: content }) }));
|
|
55
|
+
};
|
|
56
|
+
const screen = renderWithProvider(_jsx(ObserverTest, {}));
|
|
57
|
+
await expect.element(screen.getByTestId('content')).toBeVisible();
|
|
58
|
+
// record initial render count
|
|
59
|
+
const initialRenderCount = renderCount;
|
|
60
|
+
// when changing content, the component should re-render
|
|
61
|
+
testPost.set('content', 'hello world');
|
|
62
|
+
await expect
|
|
63
|
+
.element(screen.getByTestId('content'))
|
|
64
|
+
.toHaveTextContent('hello world');
|
|
65
|
+
expect(renderCount).toBeGreaterThan(initialRenderCount);
|
|
66
|
+
const updatedRenderCount = renderCount;
|
|
67
|
+
// when changing comments, the component should not re-render
|
|
68
|
+
testPost.set('comments', [{ id: '1', content: 'comment' }]);
|
|
69
|
+
await expect
|
|
70
|
+
.element(screen.getByTestId('content'))
|
|
71
|
+
.toHaveTextContent('hello world');
|
|
72
|
+
expect(renderCount).toBe(updatedRenderCount);
|
|
73
|
+
});
|
|
74
|
+
it('should support files', async () => {
|
|
75
|
+
// seed the initial post
|
|
76
|
+
const testPost = await client.posts.put({
|
|
77
|
+
attachment: new File([''], 'test.txt', { type: 'text/plain' }),
|
|
78
|
+
});
|
|
79
|
+
const testFile = testPost.get('attachment');
|
|
80
|
+
const FileTest = () => {
|
|
81
|
+
const url = hooks.useWatch(testFile);
|
|
82
|
+
return (_jsx("div", { children: _jsx("div", { "data-testid": "file", children: url }) }));
|
|
83
|
+
};
|
|
84
|
+
const screen = renderWithProvider(_jsx(FileTest, {}));
|
|
85
|
+
await expect.element(screen.getByTestId('file')).toHaveTextContent('blob:');
|
|
86
|
+
});
|
|
87
|
+
it('should support deep watching', async () => {
|
|
88
|
+
// seed the initial post
|
|
89
|
+
const testPost = await client.posts.put({
|
|
90
|
+
comments: [{ content: 'comment' }],
|
|
91
|
+
});
|
|
92
|
+
const DeepTest = () => {
|
|
93
|
+
const { comments } = hooks.useWatch(testPost, { deep: true });
|
|
94
|
+
return (_jsx("div", { children: _jsx("div", { "data-testid": "comments", children: comments.map((c) => c.get('content')).join(', ') }) }));
|
|
95
|
+
};
|
|
96
|
+
const screen = renderWithProvider(_jsx(DeepTest, {}));
|
|
97
|
+
await expect
|
|
98
|
+
.element(screen.getByTestId('comments'))
|
|
99
|
+
.toHaveTextContent('comment');
|
|
100
|
+
// when changing content, the component should re-render
|
|
101
|
+
testPost.get('comments').push({ content: 'hello world' });
|
|
102
|
+
await expect
|
|
103
|
+
.element(screen.getByTestId('comments'))
|
|
104
|
+
.toHaveTextContent('comment, hello world');
|
|
105
|
+
});
|
|
106
|
+
it('should handle null entities', async () => {
|
|
107
|
+
const Test = () => {
|
|
108
|
+
hooks.useWatch(null);
|
|
109
|
+
return (_jsx("div", { children: _jsx("div", { "data-testid": "content" }) }));
|
|
110
|
+
};
|
|
111
|
+
const screen = renderWithProvider(_jsx(Test, {}));
|
|
112
|
+
await expect.element(screen.getByTestId('content')).toBeEmptyDOMElement();
|
|
113
|
+
});
|
|
114
|
+
it('should handle documents being deleted', async () => {
|
|
115
|
+
const docId = 'test-id';
|
|
116
|
+
// TODO: rework this to use actual hook queries once https://github.com/vitest-dev/vitest-browser-react/issues/9
|
|
117
|
+
// is addressed upstream.
|
|
118
|
+
let testPost = null;
|
|
119
|
+
const DeleteTest = ({ post }) => {
|
|
120
|
+
hooks.useWatch(post);
|
|
121
|
+
if (post) {
|
|
122
|
+
return _jsx("div", { "data-testid": "content", children: post.get('content') });
|
|
123
|
+
}
|
|
124
|
+
return _jsx("div", { "data-testid": "content" });
|
|
125
|
+
};
|
|
126
|
+
const screen = await renderWithProvider(_jsx(DeleteTest, { post: testPost }));
|
|
127
|
+
await expect.element(screen.getByTestId('content')).toBeEmptyDOMElement();
|
|
128
|
+
testPost = await client.posts.put({ id: docId, content: 'hello' });
|
|
129
|
+
await screen.rerender(_jsx(DeleteTest, { post: testPost }));
|
|
130
|
+
await expect
|
|
131
|
+
.element(screen.getByTestId('content'))
|
|
132
|
+
.toHaveTextContent('hello');
|
|
133
|
+
await client.posts.delete(docId);
|
|
134
|
+
testPost = null;
|
|
135
|
+
await screen.rerender(_jsx(DeleteTest, { post: testPost }));
|
|
136
|
+
await expect.element(screen.getByTestId('content')).toBeEmptyDOMElement();
|
|
137
|
+
testPost = await client.posts.put({ id: docId, content: 'world' });
|
|
138
|
+
await screen.rerender(_jsx(DeleteTest, { post: testPost }));
|
|
139
|
+
await expect
|
|
140
|
+
.element(screen.getByTestId('content'))
|
|
141
|
+
.toHaveTextContent('world');
|
|
142
|
+
// it reacts to changes on the document
|
|
143
|
+
testPost.set('content', 'hello');
|
|
144
|
+
await expect
|
|
145
|
+
.element(screen.getByTestId('content'))
|
|
146
|
+
.toHaveTextContent('hello');
|
|
147
|
+
});
|
|
148
|
+
//# sourceMappingURL=watch.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.test.js","sourceRoot":"","sources":["../../src/watch.test.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@verdant-web/react",
|
|
3
|
-
"version": "40.1
|
|
3
|
+
"version": "40.2.1",
|
|
4
4
|
"access": "public",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -21,18 +21,21 @@
|
|
|
21
21
|
"react": "^19.0.0"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"suspend-react": "^0.
|
|
24
|
+
"suspend-react": "^0.1.3",
|
|
25
25
|
"use-sync-external-store": "^1.2.0",
|
|
26
26
|
"@verdant-web/common": "2.7.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@types/react": "^19.0.1",
|
|
30
30
|
"@types/use-sync-external-store": "^0.0.6",
|
|
31
|
+
"@vitest/browser": "^2.1.8",
|
|
31
32
|
"fake-indexeddb": "^5.0.1",
|
|
32
|
-
"
|
|
33
|
+
"playwright": "^1.49.1",
|
|
34
|
+
"prettier": "^3.0.3",
|
|
33
35
|
"react": "^19.0.0",
|
|
34
36
|
"typescript": "^5.4.2",
|
|
35
|
-
"vitest": "^2.
|
|
37
|
+
"vitest": "^2.1.8",
|
|
38
|
+
"vitest-browser-react": "^0.0.4",
|
|
36
39
|
"@verdant-web/store": "4.1.0"
|
|
37
40
|
},
|
|
38
41
|
"scripts": {
|
package/src/hooks.tsx
CHANGED
|
@@ -4,22 +4,22 @@ import {
|
|
|
4
4
|
StorageSchema,
|
|
5
5
|
} from '@verdant-web/common';
|
|
6
6
|
import {
|
|
7
|
-
|
|
8
|
-
SyncTransportMode,
|
|
9
|
-
StorageDescriptor,
|
|
10
|
-
UserInfo,
|
|
11
|
-
Entity,
|
|
7
|
+
Client,
|
|
12
8
|
ClientWithCollections,
|
|
9
|
+
Entity,
|
|
13
10
|
EntityFile,
|
|
14
|
-
|
|
11
|
+
Query,
|
|
15
12
|
QueryStatus,
|
|
13
|
+
StorageDescriptor,
|
|
14
|
+
SyncTransportMode,
|
|
15
|
+
UserInfo,
|
|
16
16
|
} from '@verdant-web/store';
|
|
17
17
|
import {
|
|
18
18
|
ChangeEvent,
|
|
19
19
|
createContext,
|
|
20
|
-
HTMLAttributes,
|
|
21
20
|
HTMLProps,
|
|
22
21
|
ReactNode,
|
|
22
|
+
use,
|
|
23
23
|
useCallback,
|
|
24
24
|
useContext,
|
|
25
25
|
useEffect,
|
|
@@ -30,13 +30,17 @@ import {
|
|
|
30
30
|
} from 'react';
|
|
31
31
|
import { suspend } from 'suspend-react';
|
|
32
32
|
import { useSyncExternalStoreWithSelector } from 'use-sync-external-store/with-selector.js';
|
|
33
|
+
import { useWatch } from './watch.js';
|
|
33
34
|
|
|
34
|
-
function
|
|
35
|
-
return
|
|
35
|
+
function queryIsInitializing(query: Query<any>) {
|
|
36
|
+
return query.status === 'initial' || query.status === 'initializing';
|
|
36
37
|
}
|
|
37
|
-
function
|
|
38
|
+
function useLiveQueryResult(
|
|
39
|
+
liveQuery: Query<any> | null,
|
|
40
|
+
disableSuspense = false,
|
|
41
|
+
) {
|
|
38
42
|
// suspend if the query doesn't have a valid result set yet.
|
|
39
|
-
if (!disableSuspense && liveQuery &&
|
|
43
|
+
if (!disableSuspense && liveQuery && queryIsInitializing(liveQuery)) {
|
|
40
44
|
suspend(() => liveQuery.resolved, [liveQuery]);
|
|
41
45
|
}
|
|
42
46
|
return useSyncExternalStore(
|
|
@@ -94,44 +98,14 @@ export function createHooks<Presence = any, Profile = any>(
|
|
|
94
98
|
createContext<StorageDescriptor<Presence, Profile> | null>(null);
|
|
95
99
|
|
|
96
100
|
function useStorage(): ClientWithCollections {
|
|
97
|
-
const ctx =
|
|
101
|
+
const ctx = use(Context);
|
|
98
102
|
if (!ctx) {
|
|
99
103
|
throw new Error('No verdant provider was found');
|
|
100
104
|
}
|
|
101
|
-
return suspend(
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
liveObject: Entity | EntityFile | null,
|
|
106
|
-
options?: { deep?: boolean },
|
|
107
|
-
) {
|
|
108
|
-
return useSyncExternalStore(
|
|
109
|
-
(handler) => {
|
|
110
|
-
if (liveObject) {
|
|
111
|
-
if ('isFile' in liveObject) {
|
|
112
|
-
return liveObject.subscribe('change', handler);
|
|
113
|
-
} else {
|
|
114
|
-
if (options?.deep) {
|
|
115
|
-
return liveObject.subscribe('change', handler);
|
|
116
|
-
} else {
|
|
117
|
-
return liveObject.subscribe('change', handler);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
return () => {};
|
|
122
|
-
},
|
|
123
|
-
() => {
|
|
124
|
-
if (liveObject) {
|
|
125
|
-
if (liveObject instanceof EntityFile) {
|
|
126
|
-
return liveObject.url;
|
|
127
|
-
} else {
|
|
128
|
-
return liveObject.getAll();
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
return undefined;
|
|
133
|
-
},
|
|
134
|
-
);
|
|
105
|
+
return suspend(
|
|
106
|
+
() => ctx.readyPromise,
|
|
107
|
+
[`verdant_${ctx.namespace}`],
|
|
108
|
+
) as ClientWithCollections;
|
|
135
109
|
}
|
|
136
110
|
|
|
137
111
|
function useOnChange(
|
|
@@ -203,7 +177,7 @@ export function createHooks<Presence = any, Profile = any>(
|
|
|
203
177
|
unsubs.forEach((unsub) => unsub());
|
|
204
178
|
};
|
|
205
179
|
},
|
|
206
|
-
() => (peerId ? storage.sync.presence.peers[peerId] ?? null : null),
|
|
180
|
+
() => (peerId ? (storage.sync.presence.peers[peerId] ?? null) : null),
|
|
207
181
|
);
|
|
208
182
|
}
|
|
209
183
|
|
|
@@ -418,8 +392,8 @@ export function createHooks<Presence = any, Profile = any>(
|
|
|
418
392
|
fieldSchema.type === 'boolean'
|
|
419
393
|
? key
|
|
420
394
|
: value === null || value === undefined
|
|
421
|
-
|
|
422
|
-
|
|
395
|
+
? ''
|
|
396
|
+
: `${value}`;
|
|
423
397
|
const props: HTMLProps<HTMLInputElement> = {
|
|
424
398
|
onChange: (e: ChangeEvent<HTMLInputElement>) => {
|
|
425
399
|
if (fieldSchema.type === 'number') {
|
|
@@ -598,11 +572,13 @@ export function createHooks<Presence = any, Profile = any>(
|
|
|
598
572
|
value,
|
|
599
573
|
children,
|
|
600
574
|
sync,
|
|
575
|
+
fallback,
|
|
601
576
|
...rest
|
|
602
577
|
}: {
|
|
603
578
|
children?: ReactNode;
|
|
604
579
|
value: StorageDescriptor;
|
|
605
580
|
sync?: boolean;
|
|
581
|
+
fallback?: ReactNode;
|
|
606
582
|
}) => {
|
|
607
583
|
// auto-open storage when used in provider
|
|
608
584
|
useMemo(() => {
|
|
@@ -628,8 +604,8 @@ export function createHooks<Presence = any, Profile = any>(
|
|
|
628
604
|
const storage = useStorage();
|
|
629
605
|
const liveQuery = useMemo(() => {
|
|
630
606
|
return skip ? null : storage[pluralName].get(id);
|
|
631
|
-
}, [id, skip]);
|
|
632
|
-
const data =
|
|
607
|
+
}, [id, skip, storage]);
|
|
608
|
+
const data = useLiveQueryResult(liveQuery);
|
|
633
609
|
|
|
634
610
|
return data;
|
|
635
611
|
};
|
|
@@ -640,8 +616,8 @@ export function createHooks<Presence = any, Profile = any>(
|
|
|
640
616
|
const storage = useStorage();
|
|
641
617
|
const liveQuery = useMemo(() => {
|
|
642
618
|
return skip ? null : storage[pluralName].get(id);
|
|
643
|
-
}, [id, skip]);
|
|
644
|
-
const data =
|
|
619
|
+
}, [id, skip, storage]);
|
|
620
|
+
const data = useLiveQueryResult(liveQuery, true);
|
|
645
621
|
const status = useLiveQueryStatus(liveQuery);
|
|
646
622
|
|
|
647
623
|
return { data, status };
|
|
@@ -661,8 +637,8 @@ export function createHooks<Presence = any, Profile = any>(
|
|
|
661
637
|
const index = useStableIndex(unstableIndex);
|
|
662
638
|
const liveQuery = useMemo(() => {
|
|
663
639
|
return skip ? null : storage[pluralName].findOne({ index, key });
|
|
664
|
-
}, [index, skip]);
|
|
665
|
-
const data =
|
|
640
|
+
}, [index, skip, storage, key]);
|
|
641
|
+
const data = useLiveQueryResult(liveQuery);
|
|
666
642
|
return data;
|
|
667
643
|
};
|
|
668
644
|
hooks[findOneHookName + 'Unsuspended'] = function useOneUnsuspended({
|
|
@@ -678,8 +654,8 @@ export function createHooks<Presence = any, Profile = any>(
|
|
|
678
654
|
const index = useStableIndex(unstableIndex);
|
|
679
655
|
const liveQuery = useMemo(() => {
|
|
680
656
|
return skip ? null : storage[pluralName].findOne({ index, key });
|
|
681
|
-
}, [index, skip]);
|
|
682
|
-
const data =
|
|
657
|
+
}, [index, skip, storage, key]);
|
|
658
|
+
const data = useLiveQueryResult(liveQuery, true);
|
|
683
659
|
const status = useLiveQueryStatus(liveQuery);
|
|
684
660
|
|
|
685
661
|
return { data, status };
|
|
@@ -701,9 +677,9 @@ export function createHooks<Presence = any, Profile = any>(
|
|
|
701
677
|
// query identity for subsequent calls.
|
|
702
678
|
const liveQuery = useMemo(
|
|
703
679
|
() => (skip ? null : storage[pluralName].findAll({ index, key })),
|
|
704
|
-
[index, skip],
|
|
680
|
+
[index, skip, storage, key],
|
|
705
681
|
);
|
|
706
|
-
const data =
|
|
682
|
+
const data = useLiveQueryResult(liveQuery);
|
|
707
683
|
return data || [];
|
|
708
684
|
};
|
|
709
685
|
hooks[getAllHookName + 'Unsuspended'] = function useAllUnsuspended({
|
|
@@ -721,9 +697,9 @@ export function createHooks<Presence = any, Profile = any>(
|
|
|
721
697
|
// query identity for subsequent calls.
|
|
722
698
|
const liveQuery = useMemo(
|
|
723
699
|
() => (skip ? null : storage[pluralName].findAll({ index, key })),
|
|
724
|
-
[index, skip],
|
|
700
|
+
[index, skip, storage, key],
|
|
725
701
|
);
|
|
726
|
-
const data =
|
|
702
|
+
const data = useLiveQueryResult(liveQuery, true) || [];
|
|
727
703
|
const status = useLiveQueryStatus(liveQuery);
|
|
728
704
|
|
|
729
705
|
return { data, status };
|
|
@@ -756,10 +732,10 @@ export function createHooks<Presence = any, Profile = any>(
|
|
|
756
732
|
pageSize,
|
|
757
733
|
page: 0,
|
|
758
734
|
key: key || getAllPaginatedHookName,
|
|
759
|
-
|
|
760
|
-
[index, skip, pageSize],
|
|
735
|
+
}),
|
|
736
|
+
[index, skip, pageSize, storage, key],
|
|
761
737
|
);
|
|
762
|
-
const data =
|
|
738
|
+
const data = useLiveQueryResult(liveQuery, suspend === false);
|
|
763
739
|
const status = useLiveQueryStatus(liveQuery);
|
|
764
740
|
|
|
765
741
|
const tools = useMemo(
|
|
@@ -809,10 +785,10 @@ export function createHooks<Presence = any, Profile = any>(
|
|
|
809
785
|
index,
|
|
810
786
|
pageSize,
|
|
811
787
|
key: key || getAllInfiniteHookName,
|
|
812
|
-
|
|
813
|
-
[index, skip, pageSize],
|
|
788
|
+
}),
|
|
789
|
+
[index, skip, pageSize, storage, key],
|
|
814
790
|
);
|
|
815
|
-
const data =
|
|
791
|
+
const data = useLiveQueryResult(liveQuery, suspend === false);
|
|
816
792
|
const status = useLiveQueryStatus(liveQuery);
|
|
817
793
|
|
|
818
794
|
const tools = useMemo(
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ClientDescriptor,
|
|
3
|
+
ClientWithCollections,
|
|
4
|
+
createMigration,
|
|
5
|
+
schema,
|
|
6
|
+
} from '@verdant-web/store';
|
|
7
|
+
import { Suspense } from 'react';
|
|
8
|
+
import { afterAll, beforeAll, expect, it } from 'vitest';
|
|
9
|
+
import { render } from 'vitest-browser-react';
|
|
10
|
+
import { createHooks } from './hooks.js';
|
|
11
|
+
|
|
12
|
+
const testSchema = schema({
|
|
13
|
+
version: 1,
|
|
14
|
+
collections: {
|
|
15
|
+
posts: schema.collection({
|
|
16
|
+
name: 'post',
|
|
17
|
+
primaryKey: 'id',
|
|
18
|
+
fields: {
|
|
19
|
+
id: schema.fields.id(),
|
|
20
|
+
content: schema.fields.string({ default: '' }),
|
|
21
|
+
comments: schema.fields.array({
|
|
22
|
+
items: schema.fields.object({
|
|
23
|
+
properties: {
|
|
24
|
+
id: schema.fields.id(),
|
|
25
|
+
content: schema.fields.string({ default: '' }),
|
|
26
|
+
},
|
|
27
|
+
}),
|
|
28
|
+
}),
|
|
29
|
+
attachment: schema.fields.file({ nullable: true }),
|
|
30
|
+
},
|
|
31
|
+
}),
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const hooks = createHooks(testSchema);
|
|
36
|
+
|
|
37
|
+
let clientDesc: ClientDescriptor;
|
|
38
|
+
let client: ClientWithCollections;
|
|
39
|
+
beforeAll(async () => {
|
|
40
|
+
clientDesc = new ClientDescriptor({
|
|
41
|
+
schema: testSchema,
|
|
42
|
+
oldSchemas: [testSchema],
|
|
43
|
+
migrations: [createMigration(testSchema)],
|
|
44
|
+
namespace: 'watch-test',
|
|
45
|
+
});
|
|
46
|
+
client = await (clientDesc.open() as Promise<ClientWithCollections>);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
afterAll(() => client.close());
|
|
50
|
+
|
|
51
|
+
function renderWithProvider(content: React.ReactElement) {
|
|
52
|
+
return render(content, {
|
|
53
|
+
wrapper: ({ children }) => (
|
|
54
|
+
<Suspense>
|
|
55
|
+
<hooks.Provider value={clientDesc}>
|
|
56
|
+
<Suspense fallback={<div data-testid="suspense">Loading...</div>}>
|
|
57
|
+
{children}
|
|
58
|
+
</Suspense>
|
|
59
|
+
</hooks.Provider>
|
|
60
|
+
</Suspense>
|
|
61
|
+
),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
it('should only re-render when observed keys change', async () => {
|
|
66
|
+
// seed the initial post
|
|
67
|
+
const testPost = await client.posts.put({});
|
|
68
|
+
|
|
69
|
+
let renderCount = 0;
|
|
70
|
+
|
|
71
|
+
const ObserverTest = () => {
|
|
72
|
+
const { content } = hooks.useWatch(testPost);
|
|
73
|
+
|
|
74
|
+
renderCount++;
|
|
75
|
+
|
|
76
|
+
return (
|
|
77
|
+
<div>
|
|
78
|
+
<div data-testid="content">{content}</div>
|
|
79
|
+
</div>
|
|
80
|
+
);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const screen = renderWithProvider(<ObserverTest />);
|
|
84
|
+
|
|
85
|
+
await expect.element(screen.getByTestId('content')).toBeVisible();
|
|
86
|
+
|
|
87
|
+
// record initial render count
|
|
88
|
+
const initialRenderCount = renderCount;
|
|
89
|
+
|
|
90
|
+
// when changing content, the component should re-render
|
|
91
|
+
testPost.set('content', 'hello world');
|
|
92
|
+
|
|
93
|
+
await expect
|
|
94
|
+
.element(screen.getByTestId('content'))
|
|
95
|
+
.toHaveTextContent('hello world');
|
|
96
|
+
expect(renderCount).toBeGreaterThan(initialRenderCount);
|
|
97
|
+
|
|
98
|
+
const updatedRenderCount = renderCount;
|
|
99
|
+
|
|
100
|
+
// when changing comments, the component should not re-render
|
|
101
|
+
testPost.set('comments', [{ id: '1', content: 'comment' }]);
|
|
102
|
+
|
|
103
|
+
await expect
|
|
104
|
+
.element(screen.getByTestId('content'))
|
|
105
|
+
.toHaveTextContent('hello world');
|
|
106
|
+
expect(renderCount).toBe(updatedRenderCount);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('should support files', async () => {
|
|
110
|
+
// seed the initial post
|
|
111
|
+
const testPost = await client.posts.put({
|
|
112
|
+
attachment: new File([''], 'test.txt', { type: 'text/plain' }),
|
|
113
|
+
});
|
|
114
|
+
const testFile = testPost.get('attachment');
|
|
115
|
+
|
|
116
|
+
const FileTest = () => {
|
|
117
|
+
const url = hooks.useWatch(testFile);
|
|
118
|
+
|
|
119
|
+
return (
|
|
120
|
+
<div>
|
|
121
|
+
<div data-testid="file">{url}</div>
|
|
122
|
+
</div>
|
|
123
|
+
);
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
const screen = renderWithProvider(<FileTest />);
|
|
127
|
+
await expect.element(screen.getByTestId('file')).toHaveTextContent('blob:');
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('should support deep watching', async () => {
|
|
131
|
+
// seed the initial post
|
|
132
|
+
const testPost = await client.posts.put({
|
|
133
|
+
comments: [{ content: 'comment' }],
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
const DeepTest = () => {
|
|
137
|
+
const { comments } = hooks.useWatch(testPost, { deep: true });
|
|
138
|
+
|
|
139
|
+
return (
|
|
140
|
+
<div>
|
|
141
|
+
<div data-testid="comments">
|
|
142
|
+
{comments.map((c: any) => c.get('content')).join(', ')}
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
);
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
const screen = renderWithProvider(<DeepTest />);
|
|
149
|
+
|
|
150
|
+
await expect
|
|
151
|
+
.element(screen.getByTestId('comments'))
|
|
152
|
+
.toHaveTextContent('comment');
|
|
153
|
+
|
|
154
|
+
// when changing content, the component should re-render
|
|
155
|
+
testPost.get('comments').push({ content: 'hello world' });
|
|
156
|
+
|
|
157
|
+
await expect
|
|
158
|
+
.element(screen.getByTestId('comments'))
|
|
159
|
+
.toHaveTextContent('comment, hello world');
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('should handle null entities', async () => {
|
|
163
|
+
const Test = () => {
|
|
164
|
+
hooks.useWatch(null);
|
|
165
|
+
|
|
166
|
+
return (
|
|
167
|
+
<div>
|
|
168
|
+
<div data-testid="content" />
|
|
169
|
+
</div>
|
|
170
|
+
);
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
const screen = renderWithProvider(<Test />);
|
|
174
|
+
await expect.element(screen.getByTestId('content')).toBeEmptyDOMElement();
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('should handle documents being deleted', async () => {
|
|
178
|
+
const docId = 'test-id';
|
|
179
|
+
// TODO: rework this to use actual hook queries once https://github.com/vitest-dev/vitest-browser-react/issues/9
|
|
180
|
+
// is addressed upstream.
|
|
181
|
+
let testPost: any = null;
|
|
182
|
+
|
|
183
|
+
const DeleteTest = ({ post }: { post: any }) => {
|
|
184
|
+
hooks.useWatch(post);
|
|
185
|
+
|
|
186
|
+
if (post) {
|
|
187
|
+
return <div data-testid="content">{post.get('content')}</div>;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
return <div data-testid="content" />;
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
const screen = await renderWithProvider(<DeleteTest post={testPost} />);
|
|
194
|
+
await expect.element(screen.getByTestId('content')).toBeEmptyDOMElement();
|
|
195
|
+
|
|
196
|
+
testPost = await client.posts.put({ id: docId, content: 'hello' });
|
|
197
|
+
await screen.rerender(<DeleteTest post={testPost} />);
|
|
198
|
+
|
|
199
|
+
await expect
|
|
200
|
+
.element(screen.getByTestId('content'))
|
|
201
|
+
.toHaveTextContent('hello');
|
|
202
|
+
|
|
203
|
+
await client.posts.delete(docId);
|
|
204
|
+
testPost = null;
|
|
205
|
+
await screen.rerender(<DeleteTest post={testPost} />);
|
|
206
|
+
|
|
207
|
+
await expect.element(screen.getByTestId('content')).toBeEmptyDOMElement();
|
|
208
|
+
|
|
209
|
+
testPost = await client.posts.put({ id: docId, content: 'world' });
|
|
210
|
+
await screen.rerender(<DeleteTest post={testPost} />);
|
|
211
|
+
|
|
212
|
+
await expect
|
|
213
|
+
.element(screen.getByTestId('content'))
|
|
214
|
+
.toHaveTextContent('world');
|
|
215
|
+
|
|
216
|
+
// it reacts to changes on the document
|
|
217
|
+
testPost.set('content', 'hello');
|
|
218
|
+
|
|
219
|
+
await expect
|
|
220
|
+
.element(screen.getByTestId('content'))
|
|
221
|
+
.toHaveTextContent('hello');
|
|
222
|
+
});
|
package/src/watch.ts
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { Entity, EntityFile } from '@verdant-web/store';
|
|
2
|
+
import { useLayoutEffect, useMemo, useRef, useSyncExternalStore } from 'react';
|
|
3
|
+
|
|
4
|
+
const OBSERVATION_INFO = Symbol('OBSERVATION_INFO');
|
|
5
|
+
|
|
6
|
+
type ObservationInfo = {
|
|
7
|
+
accessedKeys: Set<string>;
|
|
8
|
+
accessedIndex: boolean;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
// largely inspired by Valtio (https://github.com/pmndrs/valtio/blob/main/src/react.ts)
|
|
12
|
+
export function useWatch(
|
|
13
|
+
entity: Entity | EntityFile | null,
|
|
14
|
+
options?: { deep?: boolean; untracked?: boolean },
|
|
15
|
+
) {
|
|
16
|
+
const lastSnapshot = useRef<ProxiedDestructure | null>(null);
|
|
17
|
+
const observationInfo = useMemo(
|
|
18
|
+
() => ({ accessedKeys: new Set<string>(), accessedIndex: false }),
|
|
19
|
+
[entity],
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
const currSnapshot = useSyncExternalStore(
|
|
23
|
+
(handler) => {
|
|
24
|
+
if (entity) {
|
|
25
|
+
// this may seem superfluous but TS can't infer that
|
|
26
|
+
// both types have the same event key.
|
|
27
|
+
if ('isFile' in entity) {
|
|
28
|
+
return entity.subscribe('change', handler);
|
|
29
|
+
} else {
|
|
30
|
+
if (options?.deep) {
|
|
31
|
+
return entity.subscribe('changeDeep', handler);
|
|
32
|
+
}
|
|
33
|
+
return entity.subscribe('change', handler);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return () => {};
|
|
38
|
+
},
|
|
39
|
+
() => {
|
|
40
|
+
if (!entity) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
if ('isFile' in entity) {
|
|
44
|
+
return entity.url;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// if deep is true, always re-render. otherwise, if we don't have a
|
|
48
|
+
// prior snapshot, always re-render.
|
|
49
|
+
const prevSnapshot = lastSnapshot.current;
|
|
50
|
+
if (options?.deep || options?.untracked || !prevSnapshot) {
|
|
51
|
+
return entity.getAll();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// if prior snapshot is equal to current, we don't have to check for changes;
|
|
55
|
+
// we know they're identical. Entity returns a new object reference on change,
|
|
56
|
+
// but keeps the old one if nothing changed.
|
|
57
|
+
const destructured = entity.getAll();
|
|
58
|
+
if (prevSnapshot === destructured) {
|
|
59
|
+
return prevSnapshot;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// check for changes to observed values
|
|
63
|
+
if (hasObservedChanged(observationInfo, prevSnapshot, destructured)) {
|
|
64
|
+
return destructured;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return prevSnapshot;
|
|
68
|
+
},
|
|
69
|
+
() => {
|
|
70
|
+
if (!entity) return null;
|
|
71
|
+
if ('isFile' in entity) return entity.url;
|
|
72
|
+
return entity.getAll();
|
|
73
|
+
},
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
useLayoutEffect(() => {
|
|
77
|
+
if (typeof currSnapshot !== 'string') {
|
|
78
|
+
lastSnapshot.current = currSnapshot;
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
if (currSnapshot && typeof currSnapshot !== 'string') {
|
|
83
|
+
return createProxy(currSnapshot, observationInfo);
|
|
84
|
+
}
|
|
85
|
+
return currSnapshot;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
type ProxiedDestructure = {
|
|
89
|
+
[OBSERVATION_INFO]: { accessedKeys: Set<string>; accessedIndex: boolean };
|
|
90
|
+
[key: string]: any;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
function createProxy(
|
|
94
|
+
destructured: any,
|
|
95
|
+
observationInfo: ObservationInfo,
|
|
96
|
+
): ProxiedDestructure {
|
|
97
|
+
const proxy = new Proxy(destructured, {
|
|
98
|
+
get(target, key, receiver) {
|
|
99
|
+
if (key === OBSERVATION_INFO) {
|
|
100
|
+
return observationInfo;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (typeof key === 'number') {
|
|
104
|
+
observationInfo.accessedIndex = true;
|
|
105
|
+
} else if (typeof key === 'string') {
|
|
106
|
+
observationInfo.accessedKeys.add(key);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return Reflect.get(target, key, receiver);
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
return proxy as ProxiedDestructure;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function hasObservedChanged(
|
|
117
|
+
observationInfo: ObservationInfo,
|
|
118
|
+
prev: any,
|
|
119
|
+
next: any,
|
|
120
|
+
) {
|
|
121
|
+
// if index was accessed, re-render on any change.
|
|
122
|
+
if (observationInfo.accessedIndex) {
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// if no keys were accessed, we just always re-render on change. this is relevant
|
|
127
|
+
// to the nullable document usage patterns -- the user may not even
|
|
128
|
+
// store a reference to the returned value, so we can't track changes.
|
|
129
|
+
if (observationInfo.accessedKeys.size === 0) {
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// otherwise, compare values of accessed keys.
|
|
134
|
+
for (const key of observationInfo.accessedKeys) {
|
|
135
|
+
if (prev[key] !== next[key]) {
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.test.js","sourceRoot":"","sources":["../../src/hooks.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACtE,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;YACjC,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE;gBACP,EAAE,EAAE;oBACH,IAAI,EAAE,QAAQ;iBACd;gBACD,IAAI,EAAE;oBACL,IAAI,EAAE,QAAQ;iBACd;aACD;SACD,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;YACjC,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE;gBACP,EAAE,EAAE;oBACH,IAAI,EAAE,QAAQ;iBACd;gBACD,KAAK,EAAE;oBACN,IAAI,EAAE,QAAQ;iBACd;aACD;SACD,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,CAAC;YACzB,OAAO,EAAE,CAAC;YACV,WAAW,EAAE;gBACZ,OAAO;gBACP,OAAO;aACP;SACD,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;QAEtC,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
File without changes
|
|
File without changes
|