@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.
@@ -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,GAiDc,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,GAyCc,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"}
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"}
@@ -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
- useEffect(() => {
24
- // 1. Reset data immediately when the where condition changes
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 [...prev, ...event.data];
44
+ return merge(prev, event.data);
37
45
  case 'Delete':
38
- return prev.filter((x) => !event.data.some((d) => deepEqual(d, x)));
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 update = event.data.find((d) => deepEqual(d.old, item));
42
- return update ? update.new : item;
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
- useEffect(() => {
59
- // Reset data when the query changes
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
- // For a single record, Get/Add always replaces
67
- return event.data;
78
+ return Array.isArray(event.data) ? event.data[0] : event.data;
68
79
  case 'Delete':
69
- if (event.data.old && deepEqual(event.data.old, prev))
70
- return undefined;
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 update = event.data.find((d) => deepEqual(d.old, prev));
74
- if (update)
75
- return update.new;
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inflector/aura",
3
- "version": "0.2.13",
3
+ "version": "0.2.14",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",