@inflector/aura 0.2.13 → 0.2.14
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/hooks/react.d.ts.map +1 -1
- package/dist/hooks/react.js +35 -25
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/hooks/react.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,IAAI,CAAA;AAI3C,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;AAkB5B,wBAAgB,QAAQ,CACtB,IAAI,SAAS,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAElF,KAAK,EAAE,IAAI,EACX,OAAO,CAAC,EAAE;IACR,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;CACnE,
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/hooks/react.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,IAAI,CAAA;AAI3C,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;AAkB5B,wBAAgB,QAAQ,CACtB,IAAI,SAAS,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAElF,KAAK,EAAE,IAAI,EACX,OAAO,CAAC,EAAE;IACR,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;CACnE,GA0Dc,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAChD;AAED,wBAAgB,SAAS,CACvB,IAAI,SAAS,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAElF,KAAK,EAAE,IAAI,EACX,OAAO,EAAE;IACP,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;CACnE,GA6Cc,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CACnD;AAED,eAAO,MAAM,OAAO,GAAI,UAAU,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;;;;;;;;;aAGjF,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,UAAU,GAAG,QAGvC,CAAA"}
|
package/dist/hooks/react.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useStore } from '@nanostores/react';
|
|
2
|
-
import { useEffect, useState } from 'react';
|
|
2
|
+
import { useEffect, useState, useRef } from 'react';
|
|
3
3
|
function deepEqual(a, b) {
|
|
4
4
|
if (a === b)
|
|
5
5
|
return true;
|
|
@@ -19,61 +19,71 @@ function deepEqual(a, b) {
|
|
|
19
19
|
}
|
|
20
20
|
export function useTable(table, Options) {
|
|
21
21
|
const [data, setData] = useState([]);
|
|
22
|
+
// 1. Keep the ref logic
|
|
22
23
|
const whereString = JSON.stringify(Options?.where);
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
const whereRef = useRef(whereString);
|
|
25
|
+
// 2. Cleanup: If the filter changed, clear the state immediately
|
|
26
|
+
// This happens during render to prevent showing old data
|
|
27
|
+
if (whereRef.current !== whereString) {
|
|
28
|
+
whereRef.current = whereString;
|
|
25
29
|
setData([]);
|
|
30
|
+
}
|
|
31
|
+
useEffect(() => {
|
|
26
32
|
const unsubscribe = table.Subscribe((event) => {
|
|
27
33
|
setData((prev) => {
|
|
34
|
+
// Helper to prevent duplicates (The "Upsert" logic)
|
|
35
|
+
const merge = (existing, incoming) => {
|
|
36
|
+
const incomingItems = Array.isArray(incoming) ? incoming : [incoming];
|
|
37
|
+
const filtered = existing.filter((ex) => !incomingItems.some((inc) => deepEqual(ex, inc)));
|
|
38
|
+
return [...filtered, ...incomingItems];
|
|
39
|
+
};
|
|
28
40
|
switch (event.action) {
|
|
29
41
|
case 'Get':
|
|
30
|
-
// 2. Replace the state for 'Get' (initial load)
|
|
31
|
-
// instead of appending to prevent duplicates on reconnections/re-runs
|
|
32
|
-
return Array.isArray(event.data) ? event.data : [event.data];
|
|
33
42
|
case 'Add':
|
|
34
|
-
return [...prev, event.data];
|
|
35
43
|
case 'AddMany':
|
|
36
|
-
return
|
|
44
|
+
return merge(prev, event.data);
|
|
37
45
|
case 'Delete':
|
|
38
|
-
|
|
46
|
+
const toDelete = Array.isArray(event.data) ? event.data : [event.data];
|
|
47
|
+
return prev.filter((x) => !toDelete.some((d) => deepEqual(d, x)));
|
|
39
48
|
case 'Update':
|
|
49
|
+
const updates = Array.isArray(event.data) ? event.data : [event.data];
|
|
40
50
|
return prev.map((item) => {
|
|
41
|
-
const
|
|
42
|
-
return
|
|
51
|
+
const found = updates.find((d) => deepEqual(d.old, item));
|
|
52
|
+
return found ? found.new : item;
|
|
43
53
|
});
|
|
44
54
|
default:
|
|
45
55
|
return prev;
|
|
46
56
|
}
|
|
47
57
|
});
|
|
48
58
|
}, Options?.where, true);
|
|
49
|
-
return () =>
|
|
50
|
-
unsubscribe();
|
|
51
|
-
};
|
|
59
|
+
return () => unsubscribe();
|
|
52
60
|
}, [table, whereString]);
|
|
53
61
|
return data;
|
|
54
62
|
}
|
|
55
63
|
export function useRecord(table, Options) {
|
|
56
64
|
const [data, setData] = useState(undefined);
|
|
65
|
+
// Ref logic for single record
|
|
57
66
|
const whereString = JSON.stringify(Options.where);
|
|
58
|
-
|
|
59
|
-
|
|
67
|
+
const whereRef = useRef(whereString);
|
|
68
|
+
if (whereRef.current !== whereString) {
|
|
69
|
+
whereRef.current = whereString;
|
|
60
70
|
setData(undefined);
|
|
71
|
+
}
|
|
72
|
+
useEffect(() => {
|
|
61
73
|
const unsubscribe = table.Subscribe((event) => {
|
|
62
74
|
setData((prev) => {
|
|
63
75
|
switch (event.action) {
|
|
64
76
|
case 'Get':
|
|
65
77
|
case 'Add':
|
|
66
|
-
|
|
67
|
-
return event.data;
|
|
78
|
+
return Array.isArray(event.data) ? event.data[0] : event.data;
|
|
68
79
|
case 'Delete':
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return prev;
|
|
80
|
+
const deleteList = Array.isArray(event.data) ? event.data : [event.data];
|
|
81
|
+
const isMatch = deleteList.some(d => deepEqual(d, prev) || deepEqual(d.old, prev));
|
|
82
|
+
return isMatch ? undefined : prev;
|
|
72
83
|
case 'Update':
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
return prev;
|
|
84
|
+
const updates = Array.isArray(event.data) ? event.data : [event.data];
|
|
85
|
+
const match = updates.find((d) => deepEqual(d.old, prev));
|
|
86
|
+
return match ? match.new : prev;
|
|
77
87
|
default:
|
|
78
88
|
return prev;
|
|
79
89
|
}
|