@livestore/react 0.0.0-snapshot-8d3edf87cb1e88c7b67c5f3ea9d0b307253c33df
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/README.md +1 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/LiveStoreContext.d.ts +7 -0
- package/dist/LiveStoreContext.d.ts.map +1 -0
- package/dist/LiveStoreContext.js +13 -0
- package/dist/LiveStoreContext.js.map +1 -0
- package/dist/LiveStoreProvider.d.ts +49 -0
- package/dist/LiveStoreProvider.d.ts.map +1 -0
- package/dist/LiveStoreProvider.js +168 -0
- package/dist/LiveStoreProvider.js.map +1 -0
- package/dist/LiveStoreProvider.test.d.ts +2 -0
- package/dist/LiveStoreProvider.test.d.ts.map +1 -0
- package/dist/LiveStoreProvider.test.js +62 -0
- package/dist/LiveStoreProvider.test.js.map +1 -0
- package/dist/__tests__/fixture.d.ts +567 -0
- package/dist/__tests__/fixture.d.ts.map +1 -0
- package/dist/__tests__/fixture.js +61 -0
- package/dist/__tests__/fixture.js.map +1 -0
- package/dist/experimental/components/LiveList.d.ts +21 -0
- package/dist/experimental/components/LiveList.d.ts.map +1 -0
- package/dist/experimental/components/LiveList.js +31 -0
- package/dist/experimental/components/LiveList.js.map +1 -0
- package/dist/experimental/mod.d.ts +2 -0
- package/dist/experimental/mod.d.ts.map +1 -0
- package/dist/experimental/mod.js +2 -0
- package/dist/experimental/mod.js.map +1 -0
- package/dist/mod.d.ts +8 -0
- package/dist/mod.d.ts.map +1 -0
- package/dist/mod.js +8 -0
- package/dist/mod.js.map +1 -0
- package/dist/useAtom.d.ts +10 -0
- package/dist/useAtom.d.ts.map +1 -0
- package/dist/useAtom.js +37 -0
- package/dist/useAtom.js.map +1 -0
- package/dist/useQuery.d.ts +9 -0
- package/dist/useQuery.d.ts.map +1 -0
- package/dist/useQuery.js +88 -0
- package/dist/useQuery.js.map +1 -0
- package/dist/useQuery.test.d.ts +2 -0
- package/dist/useQuery.test.d.ts.map +1 -0
- package/dist/useQuery.test.js +51 -0
- package/dist/useQuery.test.js.map +1 -0
- package/dist/useRow.d.ts +46 -0
- package/dist/useRow.d.ts.map +1 -0
- package/dist/useRow.js +96 -0
- package/dist/useRow.js.map +1 -0
- package/dist/useRow.test.d.ts +2 -0
- package/dist/useRow.test.d.ts.map +1 -0
- package/dist/useRow.test.js +212 -0
- package/dist/useRow.test.js.map +1 -0
- package/dist/useTemporaryQuery.d.ts +22 -0
- package/dist/useTemporaryQuery.d.ts.map +1 -0
- package/dist/useTemporaryQuery.js +75 -0
- package/dist/useTemporaryQuery.js.map +1 -0
- package/dist/useTemporaryQuery.test.d.ts +2 -0
- package/dist/useTemporaryQuery.test.d.ts.map +1 -0
- package/dist/useTemporaryQuery.test.js +59 -0
- package/dist/useTemporaryQuery.test.js.map +1 -0
- package/dist/utils/stack-info.d.ts +4 -0
- package/dist/utils/stack-info.d.ts.map +1 -0
- package/dist/utils/stack-info.js +11 -0
- package/dist/utils/stack-info.js.map +1 -0
- package/dist/utils/useStateRefWithReactiveInput.d.ts +13 -0
- package/dist/utils/useStateRefWithReactiveInput.d.ts.map +1 -0
- package/dist/utils/useStateRefWithReactiveInput.js +38 -0
- package/dist/utils/useStateRefWithReactiveInput.js.map +1 -0
- package/package.json +54 -0
- package/src/LiveStoreContext.ts +19 -0
- package/src/LiveStoreProvider.test.tsx +109 -0
- package/src/LiveStoreProvider.tsx +295 -0
- package/src/__snapshots__/useRow.test.tsx.snap +359 -0
- package/src/__tests__/fixture.tsx +119 -0
- package/src/ambient.d.ts +2 -0
- package/src/experimental/components/LiveList.tsx +84 -0
- package/src/experimental/mod.ts +1 -0
- package/src/mod.ts +13 -0
- package/src/useAtom.ts +55 -0
- package/src/useQuery.test.tsx +82 -0
- package/src/useQuery.ts +122 -0
- package/src/useRow.test.tsx +346 -0
- package/src/useRow.ts +182 -0
- package/src/useTemporaryQuery.test.tsx +98 -0
- package/src/useTemporaryQuery.ts +131 -0
- package/src/utils/stack-info.ts +13 -0
- package/src/utils/useStateRefWithReactiveInput.ts +51 -0
- package/tsconfig.json +20 -0
- package/vitest.config.js +17 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { computed } from '@livestore/livestore';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { useQuery } from '../../useQuery.js';
|
|
4
|
+
import { useTemporaryQuery } from '../../useTemporaryQuery.js';
|
|
5
|
+
/**
|
|
6
|
+
* This component is a helper component for rendering a list of items for a LiveQuery of an array of items.
|
|
7
|
+
* The idea is that instead of letting React handle the rendering of the items array directly,
|
|
8
|
+
* we derive a item LiveQuery for each item which moves the reactivity to the item level when a single item changes.
|
|
9
|
+
*
|
|
10
|
+
* In the future we want to make this component even more efficient by using incremental rendering (https://github.com/livestorejs/livestore/pull/55)
|
|
11
|
+
* e.g. when an item is added/removed/moved to only re-render the affected DOM nodes.
|
|
12
|
+
*/
|
|
13
|
+
export const LiveList = ({ items$, renderItem, getKey }) => {
|
|
14
|
+
const [hasMounted, setHasMounted] = React.useState(false);
|
|
15
|
+
React.useEffect(() => setHasMounted(true), []);
|
|
16
|
+
const keysCb = React.useCallback(() => computed((get) => get(items$).map(getKey)), [getKey, items$]);
|
|
17
|
+
const keys = useTemporaryQuery(keysCb, 'fixed');
|
|
18
|
+
const arr = React.useMemo(() => keys.map((key) =>
|
|
19
|
+
// TODO figure out a way so that `item$` returns an ordered lookup map to more efficiently find the item by key
|
|
20
|
+
[key, computed((get) => get(items$).find((item) => getKey(item, 0) === key))]), [getKey, items$, keys]);
|
|
21
|
+
return (React.createElement(React.Fragment, null, arr.map(([key, item$], index) => (React.createElement(ItemWrapperMemo, { key: key, itemKey: key, "item$": item$, opts: { isInitialListRender: !hasMounted, index }, renderItem: renderItem })))));
|
|
22
|
+
};
|
|
23
|
+
const ItemWrapper = ({ item$, opts, renderItem, }) => {
|
|
24
|
+
const item = useQuery(item$);
|
|
25
|
+
return React.createElement(React.Fragment, null, renderItem(item, opts));
|
|
26
|
+
};
|
|
27
|
+
const ItemWrapperMemo = React.memo(ItemWrapper, (prev, next) => prev.itemKey === next.itemKey &&
|
|
28
|
+
prev.renderItem === prev.renderItem &&
|
|
29
|
+
prev.opts.index === next.opts.index &&
|
|
30
|
+
prev.opts.isInitialListRender === next.opts.isInitialListRender);
|
|
31
|
+
//# sourceMappingURL=LiveList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiveList.js","sourceRoot":"","sources":["../../../src/experimental/components/LiveList.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAgB9D;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAwB,EAAmB,EAAE;IACxG,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEzD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAE9C,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACpG,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CACvB,GAAG,EAAE,CACH,IAAI,CAAC,GAAG,CACN,CAAC,GAAG,EAAE,EAAE;IACN,+GAA+G;IAC/G,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,GAAG,CAAE,CAAqB,CAAU,CAC9G,EACH,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CACvB,CAAA;IAED,OAAO,CACL,0CACG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAChC,oBAAC,eAAe,IACd,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,GAAG,WACL,KAAK,EACZ,IAAI,EAAE,EAAE,mBAAmB,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,EACjD,UAAU,EAAE,UAAU,GACtB,CACH,CAAC,CACD,CACJ,CAAA;AACH,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,CAAS,EAC3B,KAAK,EACL,IAAI,EACJ,UAAU,GAMX,EAAE,EAAE;IACH,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAE5B,OAAO,0CAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAI,CAAA;AACtC,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAChC,WAAW,EACX,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CACb,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO;IAC7B,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU;IACnC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK;IACnC,IAAI,CAAC,IAAI,CAAC,mBAAmB,KAAK,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAC5C,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/experimental/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/experimental/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAsB,MAAM,0BAA0B,CAAA"}
|
package/dist/mod.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { LiveStoreContext, useStore } from './LiveStoreContext.js';
|
|
2
|
+
export { LiveStoreProvider } from './LiveStoreProvider.js';
|
|
3
|
+
export { useQuery } from './useQuery.js';
|
|
4
|
+
export { useTemporaryQuery } from './useTemporaryQuery.js';
|
|
5
|
+
export { useStackInfo } from './utils/stack-info.js';
|
|
6
|
+
export { useRow, type StateSetters, type SetStateAction, type Dispatch, type UseRowResult as UseStateResult, } from './useRow.js';
|
|
7
|
+
export { useAtom } from './useAtom.js';
|
|
8
|
+
//# sourceMappingURL=mod.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EACL,MAAM,EACN,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,YAAY,IAAI,cAAc,GACpC,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA"}
|
package/dist/mod.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { LiveStoreContext, useStore } from './LiveStoreContext.js';
|
|
2
|
+
export { LiveStoreProvider } from './LiveStoreProvider.js';
|
|
3
|
+
export { useQuery } from './useQuery.js';
|
|
4
|
+
export { useTemporaryQuery } from './useTemporaryQuery.js';
|
|
5
|
+
export { useStackInfo } from './utils/stack-info.js';
|
|
6
|
+
export { useRow, } from './useRow.js';
|
|
7
|
+
export { useAtom } from './useAtom.js';
|
|
8
|
+
//# sourceMappingURL=mod.js.map
|
package/dist/mod.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EACL,MAAM,GAKP,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type QueryInfoCol, type QueryInfoRow } from '@livestore/common';
|
|
2
|
+
import type { DbSchema } from '@livestore/common/schema';
|
|
3
|
+
import type { LiveQuery } from '@livestore/livestore';
|
|
4
|
+
import type { Dispatch, SetStateAction } from './useRow.js';
|
|
5
|
+
export declare const useAtom: <TQuery extends LiveQuery<any, QueryInfoRow<TTableDef> | QueryInfoCol<TTableDef, any>>, TTableDef extends DbSchema.TableDef<DbSchema.DefaultSqliteTableDefConstrained, boolean, DbSchema.TableOptions & {
|
|
6
|
+
deriveMutations: {
|
|
7
|
+
enabled: true;
|
|
8
|
+
};
|
|
9
|
+
}>>(query$: TQuery) => [value: TQuery["__result!"], setValue: Dispatch<SetStateAction<Partial<TQuery["__result!"]>>>];
|
|
10
|
+
//# sourceMappingURL=useAtom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAtom.d.ts","sourceRoot":"","sources":["../src/useAtom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAKrD,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE3D,eAAO,MAAM,OAAO,GAClB,MAAM,SAAS,SAAS,CAAC,GAAG,EAAE,YAAY,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,EACrF,SAAS,SAAS,QAAQ,CAAC,QAAQ,CACjC,QAAQ,CAAC,gCAAgC,EACzC,OAAO,EACP,QAAQ,CAAC,YAAY,GAAG;IAAE,eAAe,EAAE;QAAE,OAAO,EAAE,IAAI,CAAA;KAAE,CAAA;CAAE,CAC/D,UAEO,MAAM,KACb,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAoC/F,CAAA"}
|
package/dist/useAtom.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useStore } from './LiveStoreContext.js';
|
|
3
|
+
import { useQueryRef } from './useQuery.js';
|
|
4
|
+
export const useAtom = (query$) => {
|
|
5
|
+
const query$Ref = useQueryRef(query$);
|
|
6
|
+
const { store } = useStore();
|
|
7
|
+
// TODO make API equivalent to useRow
|
|
8
|
+
const setValue = React.useMemo(() => {
|
|
9
|
+
return (newValueOrFn) => {
|
|
10
|
+
const newValue = typeof newValueOrFn === 'function' ? newValueOrFn(query$Ref.current) : newValueOrFn;
|
|
11
|
+
if (query$.queryInfo._tag === 'Row') {
|
|
12
|
+
if (query$.queryInfo.table.options.isSingleton && query$.queryInfo.table.isSingleColumn) {
|
|
13
|
+
store.mutate(query$.queryInfo.table.update(newValue));
|
|
14
|
+
}
|
|
15
|
+
else if (query$.queryInfo.table.options.isSingleColumn) {
|
|
16
|
+
store.mutate(query$.queryInfo.table.update({ where: { id: query$.queryInfo.id }, values: { value: newValue } }));
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
store.mutate(query$.queryInfo.table.update({ where: { id: query$.queryInfo.id }, values: newValue }));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
if (query$.queryInfo.table.options.isSingleton && query$.queryInfo.table.isSingleColumn) {
|
|
24
|
+
store.mutate(query$.queryInfo.table.update({ [query$.queryInfo.column]: newValue }));
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
store.mutate(query$.queryInfo.table.update({
|
|
28
|
+
where: { id: query$.queryInfo.id },
|
|
29
|
+
values: { [query$.queryInfo.column]: newValue },
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}, [query$.queryInfo, query$Ref, store]);
|
|
35
|
+
return [query$Ref.current, setValue];
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=useAtom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAtom.js","sourceRoot":"","sources":["../src/useAtom.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAG3C,MAAM,CAAC,MAAM,OAAO,GAAG,CAQrB,MAAc,EACkF,EAAE;IAClG,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;IAErC,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,CAAA;IAE5B,qCAAqC;IACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAgD,GAAG,EAAE;QACjF,OAAO,CAAC,YAAiB,EAAE,EAAE;YAC3B,MAAM,QAAQ,GAAG,OAAO,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAA;YAEpG,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBACpC,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;oBACxF,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;gBACvD,CAAC;qBAAM,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;oBACzD,KAAK,CAAC,MAAM,CACV,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CACnG,CAAA;gBACH,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;gBACvG,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;oBACxF,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;gBACtF,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,MAAM,CACV,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;wBAC5B,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE;wBAClC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE;qBAChD,CAAC,CACH,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAA;IAExC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AACtC,CAAC,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { GetResult, LiveQueryAny } from '@livestore/livestore';
|
|
2
|
+
import * as otel from '@opentelemetry/api';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
export declare const useQuery: <TQuery extends LiveQueryAny>(query: TQuery) => GetResult<TQuery>;
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
*/
|
|
8
|
+
export declare const useQueryRef: <TQuery extends LiveQueryAny>(query$: TQuery, parentOtelContext?: otel.Context) => React.MutableRefObject<GetResult<TQuery>>;
|
|
9
|
+
//# sourceMappingURL=useQuery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../src/useQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAGnE,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAA;AAkBzB,eAAO,MAAM,QAAQ,GAAI,MAAM,SAAS,YAAY,SAAS,MAAM,KAAG,SAAS,CAAC,MAAM,CAA+B,CAAA;AAErH;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,SAAS,YAAY,UAC7C,MAAM,sBACM,IAAI,CAAC,OAAO,KAC/B,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,CA2F1C,CAAA"}
|
package/dist/useQuery.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { extractStackInfoFromStackTrace, stackInfoToString } from '@livestore/livestore';
|
|
2
|
+
import { deepEqual, indent } from '@livestore/utils';
|
|
3
|
+
import * as otel from '@opentelemetry/api';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import { useStore } from './LiveStoreContext.js';
|
|
6
|
+
import { originalStackLimit } from './utils/stack-info.js';
|
|
7
|
+
import { useStateRefWithReactiveInput } from './utils/useStateRefWithReactiveInput.js';
|
|
8
|
+
/**
|
|
9
|
+
* NOTE Some folks have suggested to use `React.useSyncExternalStore`, however, it's not doing anything special
|
|
10
|
+
* for what's needed here, so we handle everything manually.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* This is needed because the `React.useMemo` call below, can sometimes be called multiple times 🤷,
|
|
14
|
+
* so we need to "cache" the fact that we've already started a span for this component.
|
|
15
|
+
* The map entry is being removed again in the `React.useEffect` call below.
|
|
16
|
+
*/
|
|
17
|
+
const spanAlreadyStartedCache = new Map();
|
|
18
|
+
export const useQuery = (query) => useQueryRef(query).current;
|
|
19
|
+
/**
|
|
20
|
+
*
|
|
21
|
+
*/
|
|
22
|
+
export const useQueryRef = (query$, parentOtelContext) => {
|
|
23
|
+
const { store } = useStore();
|
|
24
|
+
React.useDebugValue(`LiveStore:useQuery:${query$.id}:${query$.label}`);
|
|
25
|
+
// console.debug(`LiveStore:useQuery:${query$.id}:${query$.label}`)
|
|
26
|
+
const stackInfo = React.useMemo(() => {
|
|
27
|
+
Error.stackTraceLimit = 10;
|
|
28
|
+
// eslint-disable-next-line unicorn/error-message
|
|
29
|
+
const stack = new Error().stack;
|
|
30
|
+
Error.stackTraceLimit = originalStackLimit;
|
|
31
|
+
return extractStackInfoFromStackTrace(stack);
|
|
32
|
+
}, []);
|
|
33
|
+
// The following `React.useMemo` and `React.useEffect` calls are used to start and end a span for the lifetime of this component.
|
|
34
|
+
const { span, otelContext } = React.useMemo(() => {
|
|
35
|
+
const existingSpan = spanAlreadyStartedCache.get(query$);
|
|
36
|
+
if (existingSpan !== undefined)
|
|
37
|
+
return existingSpan;
|
|
38
|
+
const span = store.otel.tracer.startSpan(`LiveStore:useQuery:${query$.label}`, { attributes: { label: query$.label, stackInfo: JSON.stringify(stackInfo) } }, parentOtelContext ?? store.otel.queriesSpanContext);
|
|
39
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
40
|
+
spanAlreadyStartedCache.set(query$, { span, otelContext });
|
|
41
|
+
return { span, otelContext };
|
|
42
|
+
}, [parentOtelContext, query$, stackInfo, store.otel.queriesSpanContext, store.otel.tracer]);
|
|
43
|
+
const initialResult = React.useMemo(() => {
|
|
44
|
+
try {
|
|
45
|
+
return query$.run(otelContext, {
|
|
46
|
+
_tag: 'react',
|
|
47
|
+
api: 'useQuery',
|
|
48
|
+
label: query$.label,
|
|
49
|
+
stackInfo,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
catch (cause) {
|
|
53
|
+
throw new Error(`\
|
|
54
|
+
[@livestore/react:useQuery] Error running query: ${cause.name}
|
|
55
|
+
|
|
56
|
+
Query: ${query$.label}
|
|
57
|
+
|
|
58
|
+
React trace:
|
|
59
|
+
|
|
60
|
+
${indent(stackInfoToString(stackInfo), 4)}
|
|
61
|
+
|
|
62
|
+
Stack trace:
|
|
63
|
+
`, { cause });
|
|
64
|
+
}
|
|
65
|
+
}, [otelContext, query$, stackInfo]);
|
|
66
|
+
// We know the query has a result by the time we use it; so we can synchronously populate a default state
|
|
67
|
+
const [valueRef, setValue] = useStateRefWithReactiveInput(initialResult);
|
|
68
|
+
React.useEffect(() => () => {
|
|
69
|
+
spanAlreadyStartedCache.delete(query$);
|
|
70
|
+
span.end();
|
|
71
|
+
}, [query$, span]);
|
|
72
|
+
// Subscribe to future updates for this query
|
|
73
|
+
React.useEffect(() => {
|
|
74
|
+
query$.activeSubscriptions.add(stackInfo);
|
|
75
|
+
return store.subscribe(query$, (newValue) => {
|
|
76
|
+
// NOTE: we return a reference to the result object within LiveStore;
|
|
77
|
+
// this implies that app code must not mutate the results, or else
|
|
78
|
+
// there may be weird reactivity bugs.
|
|
79
|
+
if (deepEqual(newValue, valueRef.current) === false) {
|
|
80
|
+
setValue(newValue);
|
|
81
|
+
}
|
|
82
|
+
}, () => {
|
|
83
|
+
query$.activeSubscriptions.delete(stackInfo);
|
|
84
|
+
}, { label: query$.label, otelContext });
|
|
85
|
+
}, [stackInfo, query$, setValue, store, valueRef, otelContext, span]);
|
|
86
|
+
return valueRef;
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=useQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQuery.js","sourceRoot":"","sources":["../src/useQuery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQuery.test.d.ts","sourceRoot":"","sources":["../src/useQuery.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { querySQL } from '@livestore/livestore';
|
|
2
|
+
import { Effect, Schema } from '@livestore/utils/effect';
|
|
3
|
+
import { renderHook } from '@testing-library/react';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import { describe, expect, it } from 'vitest';
|
|
6
|
+
import { makeTodoMvcReact, tables, todos } from './__tests__/fixture.js';
|
|
7
|
+
import * as LiveStoreReact from './mod.js';
|
|
8
|
+
describe('useQuery', () => {
|
|
9
|
+
it('simple', () => Effect.gen(function* () {
|
|
10
|
+
const { wrapper, store, makeRenderCount } = yield* makeTodoMvcReact();
|
|
11
|
+
const renderCount = makeRenderCount();
|
|
12
|
+
const allTodos$ = querySQL(`select * from todos`, { schema: Schema.Array(tables.todos.schema) });
|
|
13
|
+
const { result } = renderHook(() => {
|
|
14
|
+
renderCount.inc();
|
|
15
|
+
return LiveStoreReact.useQuery(allTodos$);
|
|
16
|
+
}, { wrapper });
|
|
17
|
+
expect(result.current.length).toBe(0);
|
|
18
|
+
expect(renderCount.val).toBe(1);
|
|
19
|
+
React.act(() => store.mutate(todos.insert({ id: 't1', text: 'buy milk', completed: false })));
|
|
20
|
+
expect(result.current.length).toBe(1);
|
|
21
|
+
expect(result.current[0].text).toBe('buy milk');
|
|
22
|
+
expect(renderCount.val).toBe(2);
|
|
23
|
+
}).pipe(Effect.scoped, Effect.tapCauseLogPretty, Effect.runPromise));
|
|
24
|
+
it('same `useQuery` hook invoked with different queries', () => Effect.gen(function* () {
|
|
25
|
+
const { wrapper, store, makeRenderCount } = yield* makeTodoMvcReact();
|
|
26
|
+
const renderCount = makeRenderCount();
|
|
27
|
+
const todo1$ = querySQL(`select * from todos where id = 't1'`, {
|
|
28
|
+
label: 'libraryTracksView1',
|
|
29
|
+
schema: Schema.Array(tables.todos.schema),
|
|
30
|
+
});
|
|
31
|
+
const todo2$ = querySQL(`select * from todos where id = 't2'`, {
|
|
32
|
+
label: 'libraryTracksView2',
|
|
33
|
+
schema: Schema.Array(tables.todos.schema),
|
|
34
|
+
});
|
|
35
|
+
store.mutate(todos.insert({ id: 't1', text: 'buy milk', completed: false }), todos.insert({ id: 't2', text: 'buy eggs', completed: false }));
|
|
36
|
+
const { result, rerender } = renderHook((todoId) => {
|
|
37
|
+
renderCount.inc();
|
|
38
|
+
const query$ = React.useMemo(() => (todoId === 't1' ? todo1$ : todo2$), [todoId]);
|
|
39
|
+
return LiveStoreReact.useQuery(query$)[0].text;
|
|
40
|
+
}, { wrapper, initialProps: 't1' });
|
|
41
|
+
expect(result.current).toBe('buy milk');
|
|
42
|
+
expect(renderCount.val).toBe(1);
|
|
43
|
+
React.act(() => store.mutate(todos.update({ where: { id: 't1' }, values: { text: 'buy soy milk' } })));
|
|
44
|
+
expect(result.current).toBe('buy soy milk');
|
|
45
|
+
expect(renderCount.val).toBe(2);
|
|
46
|
+
rerender('t2');
|
|
47
|
+
expect(result.current).toBe('buy eggs');
|
|
48
|
+
expect(renderCount.val).toBe(3);
|
|
49
|
+
}).pipe(Effect.scoped, Effect.tapCauseLogPretty, Effect.runPromise));
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=useQuery.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQuery.test.js","sourceRoot":"","sources":["../src/useQuery.test.tsx"],"names":[],"mappings":"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"}
|
package/dist/useRow.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { QueryInfo } from '@livestore/common';
|
|
2
|
+
import { SessionIdSymbol } from '@livestore/common';
|
|
3
|
+
import { DbSchema } from '@livestore/common/schema';
|
|
4
|
+
import type { LiveQuery, ReactivityGraph, RowResult } from '@livestore/livestore';
|
|
5
|
+
export type UseRowResult<TTableDef extends DbSchema.TableDef> = [
|
|
6
|
+
row: RowResult<TTableDef>,
|
|
7
|
+
setRow: StateSetters<TTableDef>,
|
|
8
|
+
query$: LiveQuery<RowResult<TTableDef>, QueryInfo>
|
|
9
|
+
];
|
|
10
|
+
export type UseRowOptionsDefaulValues<TTableDef extends DbSchema.TableDef> = {
|
|
11
|
+
defaultValues?: Partial<RowResult<TTableDef>>;
|
|
12
|
+
};
|
|
13
|
+
export type UseRowOptionsBase = {
|
|
14
|
+
reactivityGraph?: ReactivityGraph;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Similar to `React.useState` but returns a tuple of `[row, setRow, query$]` for a given table where ...
|
|
18
|
+
*
|
|
19
|
+
* - `row` is the current value of the row (fully decoded according to the table schema)
|
|
20
|
+
* - `setRow` is a function that can be used to update the row (values will be encoded according to the table schema)
|
|
21
|
+
* - `query$` is a `LiveQuery` that e.g. can be used to subscribe to changes to the row
|
|
22
|
+
*
|
|
23
|
+
* If the table is a singleton table, `useRow` can be called without an `id` argument. Otherwise, the `id` argument is required.
|
|
24
|
+
*/
|
|
25
|
+
export declare const useRow: {
|
|
26
|
+
<TTableDef extends DbSchema.TableDef<DbSchema.DefaultSqliteTableDef, boolean, DbSchema.TableOptions & {
|
|
27
|
+
isSingleton: true;
|
|
28
|
+
deriveMutations: {
|
|
29
|
+
enabled: true;
|
|
30
|
+
};
|
|
31
|
+
}>>(table: TTableDef, options?: UseRowOptionsBase): UseRowResult<TTableDef>;
|
|
32
|
+
<TTableDef extends DbSchema.TableDef<DbSchema.DefaultSqliteTableDef, boolean, DbSchema.TableOptions & {
|
|
33
|
+
isSingleton: false;
|
|
34
|
+
deriveMutations: {
|
|
35
|
+
enabled: true;
|
|
36
|
+
};
|
|
37
|
+
}>>(table: TTableDef, id: string | SessionIdSymbol, options?: UseRowOptionsBase & UseRowOptionsDefaulValues<TTableDef>): UseRowResult<TTableDef>;
|
|
38
|
+
};
|
|
39
|
+
export type Dispatch<A> = (action: A) => void;
|
|
40
|
+
export type SetStateAction<S> = S | ((previousValue: S) => S);
|
|
41
|
+
export type StateSetters<TTableDef extends DbSchema.TableDef> = TTableDef['isSingleColumn'] extends true ? Dispatch<SetStateAction<RowResult<TTableDef>>> : {
|
|
42
|
+
[K in keyof RowResult<TTableDef>]: Dispatch<SetStateAction<RowResult<TTableDef>[K]>>;
|
|
43
|
+
} & {
|
|
44
|
+
setMany: Dispatch<SetStateAction<Partial<RowResult<TTableDef>>>>;
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=useRow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRow.d.ts","sourceRoot":"","sources":["../src/useRow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEnD,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAUjF,MAAM,MAAM,YAAY,CAAC,SAAS,SAAS,QAAQ,CAAC,QAAQ,IAAI;IAC9D,GAAG,EAAE,SAAS,CAAC,SAAS,CAAC;IACzB,MAAM,EAAE,YAAY,CAAC,SAAS,CAAC;IAC/B,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;CACnD,CAAA;AAED,MAAM,MAAM,yBAAyB,CAAC,SAAS,SAAS,QAAQ,CAAC,QAAQ,IAAI;IAC3E,aAAa,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAA;CAC9C,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,eAAe,CAAC,EAAE,eAAe,CAAA;CAClC,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,EAAE;IACnB,CACE,SAAS,SAAS,QAAQ,CAAC,QAAQ,CACjC,QAAQ,CAAC,qBAAqB,EAC9B,OAAO,EACP,QAAQ,CAAC,YAAY,GAAG;QAAE,WAAW,EAAE,IAAI,CAAC;QAAC,eAAe,EAAE;YAAE,OAAO,EAAE,IAAI,CAAA;SAAE,CAAA;KAAE,CAClF,EAED,KAAK,EAAE,SAAS,EAChB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,YAAY,CAAC,SAAS,CAAC,CAAA;IAC1B,CACE,SAAS,SAAS,QAAQ,CAAC,QAAQ,CACjC,QAAQ,CAAC,qBAAqB,EAC9B,OAAO,EACP,QAAQ,CAAC,YAAY,GAAG;QAAE,WAAW,EAAE,KAAK,CAAC;QAAC,eAAe,EAAE;YAAE,OAAO,EAAE,IAAI,CAAA;SAAE,CAAA;KAAE,CACnF,EAED,KAAK,EAAE,SAAS,EAEhB,EAAE,EAAE,MAAM,GAAG,eAAe,EAC5B,OAAO,CAAC,EAAE,iBAAiB,GAAG,yBAAyB,CAAC,SAAS,CAAC,GACjE,YAAY,CAAC,SAAS,CAAC,CAAA;CA+G3B,CAAA;AAED,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAA;AAC7C,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;AAE7D,MAAM,MAAM,YAAY,CAAC,SAAS,SAAS,QAAQ,CAAC,QAAQ,IAAI,SAAS,CAAC,gBAAgB,CAAC,SAAS,IAAI,GACpG,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,GAC9C;KACG,CAAC,IAAI,MAAM,SAAS,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACrF,GAAG;IACF,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;CACjE,CAAA"}
|
package/dist/useRow.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { SessionIdSymbol } from '@livestore/common';
|
|
2
|
+
import { DbSchema } from '@livestore/common/schema';
|
|
3
|
+
import { rowQuery } from '@livestore/livestore';
|
|
4
|
+
import { shouldNeverHappen } from '@livestore/utils';
|
|
5
|
+
import { ReadonlyRecord } from '@livestore/utils/effect';
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import { useStore } from './LiveStoreContext.js';
|
|
8
|
+
import { useQueryRef } from './useQuery.js';
|
|
9
|
+
import { useMakeTemporaryQuery } from './useTemporaryQuery.js';
|
|
10
|
+
/**
|
|
11
|
+
* Similar to `React.useState` but returns a tuple of `[row, setRow, query$]` for a given table where ...
|
|
12
|
+
*
|
|
13
|
+
* - `row` is the current value of the row (fully decoded according to the table schema)
|
|
14
|
+
* - `setRow` is a function that can be used to update the row (values will be encoded according to the table schema)
|
|
15
|
+
* - `query$` is a `LiveQuery` that e.g. can be used to subscribe to changes to the row
|
|
16
|
+
*
|
|
17
|
+
* If the table is a singleton table, `useRow` can be called without an `id` argument. Otherwise, the `id` argument is required.
|
|
18
|
+
*/
|
|
19
|
+
export const useRow = (table, idOrOptions, options_) => {
|
|
20
|
+
const sqliteTableDef = table.sqliteDef;
|
|
21
|
+
const id = typeof idOrOptions === 'string' || idOrOptions === SessionIdSymbol ? idOrOptions : undefined;
|
|
22
|
+
const options = typeof idOrOptions === 'string' || idOrOptions === SessionIdSymbol ? options_ : idOrOptions;
|
|
23
|
+
const { defaultValues, reactivityGraph } = options ?? {};
|
|
24
|
+
const tableName = table.sqliteDef.name;
|
|
25
|
+
if (DbSchema.tableHasDerivedMutations(table) === false) {
|
|
26
|
+
shouldNeverHappen(`useRow called on table "${tableName}" which does not have 'deriveMutations: true' set`);
|
|
27
|
+
}
|
|
28
|
+
const { store } = useStore();
|
|
29
|
+
if (store.schema.tables.has(table.sqliteDef.name) === false &&
|
|
30
|
+
table.sqliteDef.name.startsWith('__livestore') === false) {
|
|
31
|
+
shouldNeverHappen(`Table "${table.sqliteDef.name}" not found in schema`);
|
|
32
|
+
}
|
|
33
|
+
// console.debug('useRow', tableName, id)
|
|
34
|
+
const idStr = id === SessionIdSymbol ? 'session' : id;
|
|
35
|
+
const { query$, otelContext } = useMakeTemporaryQuery((otelContext) => DbSchema.tableIsSingleton(table)
|
|
36
|
+
? rowQuery(table, { otelContext, reactivityGraph })
|
|
37
|
+
: rowQuery(table, id, {
|
|
38
|
+
otelContext,
|
|
39
|
+
defaultValues: defaultValues,
|
|
40
|
+
reactivityGraph,
|
|
41
|
+
}), [idStr, tableName], {
|
|
42
|
+
otel: {
|
|
43
|
+
spanName: `LiveStore:useRow:${tableName}${idStr === undefined ? '' : `:${idStr}`}`,
|
|
44
|
+
attributes: { id: idStr },
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
const query$Ref = useQueryRef(query$, otelContext);
|
|
48
|
+
const setState = React.useMemo(() => {
|
|
49
|
+
if (table.isSingleColumn) {
|
|
50
|
+
return (newValueOrFn) => {
|
|
51
|
+
const newValue = typeof newValueOrFn === 'function' ? newValueOrFn(query$Ref.current) : newValueOrFn;
|
|
52
|
+
if (query$Ref.current === newValue)
|
|
53
|
+
return;
|
|
54
|
+
// NOTE we need to account for the short-hand syntax for single-column+singleton tables
|
|
55
|
+
if (table.options.isSingleton) {
|
|
56
|
+
store.mutate(table.update(newValue));
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
store.mutate(table.update({ where: { id }, values: { value: newValue } }));
|
|
60
|
+
}
|
|
61
|
+
// store.mutate(updateMutationForQueryInfo(query$.queryInfo!, { value: newValue }))
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
const setState = // TODO: do we have a better type for the values that can go in SQLite?
|
|
66
|
+
ReadonlyRecord.map(sqliteTableDef.columns, (column, columnName) => (newValueOrFn) => {
|
|
67
|
+
const newValue =
|
|
68
|
+
// @ts-expect-error TODO fix typing
|
|
69
|
+
typeof newValueOrFn === 'function' ? newValueOrFn(query$Ref.current[columnName]) : newValueOrFn;
|
|
70
|
+
// Don't update the state if it's the same as the value already seen in the component
|
|
71
|
+
// @ts-expect-error TODO fix typing
|
|
72
|
+
if (query$Ref.current[columnName] === newValue)
|
|
73
|
+
return;
|
|
74
|
+
store.mutate(table.update({ where: { id: id ?? 'singleton' }, values: { [columnName]: newValue } }));
|
|
75
|
+
// store.mutate(updateMutationForQueryInfo(query$.queryInfo!, { [columnName]: newValue }))
|
|
76
|
+
});
|
|
77
|
+
setState.setMany = (columnValuesOrFn) => {
|
|
78
|
+
const columnValues =
|
|
79
|
+
// @ts-expect-error TODO fix typing
|
|
80
|
+
typeof columnValuesOrFn === 'function' ? columnValuesOrFn(query$Ref.current) : columnValuesOrFn;
|
|
81
|
+
// TODO use hashing instead
|
|
82
|
+
// Don't update the state if it's the same as the value already seen in the component
|
|
83
|
+
if (
|
|
84
|
+
// @ts-expect-error TODO fix typing
|
|
85
|
+
Object.entries(columnValues).every(([columnName, value]) => query$Ref.current[columnName] === value)) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
store.mutate(table.update({ where: { id: id ?? 'singleton' }, values: columnValues }));
|
|
89
|
+
// store.mutate(updateMutationForQueryInfo(query$.queryInfo!, columnValues))
|
|
90
|
+
};
|
|
91
|
+
return setState;
|
|
92
|
+
}
|
|
93
|
+
}, [id, query$Ref, sqliteTableDef.columns, store, table]);
|
|
94
|
+
return [query$Ref.current, setState, query$];
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=useRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRow.js","sourceRoot":"","sources":["../src/useRow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRow.test.d.ts","sourceRoot":"","sources":["../src/useRow.test.tsx"],"names":[],"mappings":""}
|