@tanstack/react-db 0.0.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/README.md +3 -0
- package/dist/cjs/index.cjs +22 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/index.d.cts +5 -0
- package/dist/cjs/useLiveQuery.cjs +32 -0
- package/dist/cjs/useLiveQuery.cjs.map +1 -0
- package/dist/cjs/useLiveQuery.d.cts +6 -0
- package/dist/cjs/useOptimisticMutation.cjs +17 -0
- package/dist/cjs/useOptimisticMutation.cjs.map +1 -0
- package/dist/cjs/useOptimisticMutation.d.cts +5 -0
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.js +11 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/useLiveQuery.d.ts +6 -0
- package/dist/esm/useLiveQuery.js +32 -0
- package/dist/esm/useLiveQuery.js.map +1 -0
- package/dist/esm/useOptimisticMutation.d.ts +5 -0
- package/dist/esm/useOptimisticMutation.js +17 -0
- package/dist/esm/useOptimisticMutation.js.map +1 -0
- package/package.json +65 -0
- package/src/index.ts +10 -0
- package/src/useLiveQuery.ts +54 -0
- package/src/useOptimisticMutation.ts +15 -0
package/README.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const useOptimisticMutation = require("./useOptimisticMutation.cjs");
|
|
4
|
+
const useLiveQuery = require("./useLiveQuery.cjs");
|
|
5
|
+
const db = require("@tanstack/db");
|
|
6
|
+
exports.useOptimisticMutation = useOptimisticMutation.useOptimisticMutation;
|
|
7
|
+
exports.useLiveQuery = useLiveQuery.useLiveQuery;
|
|
8
|
+
Object.defineProperty(exports, "Collection", {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
get: () => db.Collection
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "createTransaction", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: () => db.createTransaction
|
|
15
|
+
});
|
|
16
|
+
Object.keys(db).forEach((k) => {
|
|
17
|
+
if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
get: () => db[k]
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const react = require("react");
|
|
4
|
+
const reactStore = require("@tanstack/react-store");
|
|
5
|
+
const db = require("@tanstack/db");
|
|
6
|
+
function useLiveQuery(queryFn, deps = []) {
|
|
7
|
+
const [restart, forceRestart] = react.useState(0);
|
|
8
|
+
const compiledQuery = react.useMemo(() => {
|
|
9
|
+
const query = queryFn(db.queryBuilder());
|
|
10
|
+
const compiled = db.compileQuery(query);
|
|
11
|
+
compiled.start();
|
|
12
|
+
return compiled;
|
|
13
|
+
}, [...deps, restart]);
|
|
14
|
+
const state = reactStore.useStore(compiledQuery.results.derivedState);
|
|
15
|
+
const data = reactStore.useStore(compiledQuery.results.derivedArray);
|
|
16
|
+
react.useEffect(() => {
|
|
17
|
+
if (compiledQuery.state === `stopped`) {
|
|
18
|
+
forceRestart((count) => {
|
|
19
|
+
return count += 1;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
return () => {
|
|
23
|
+
compiledQuery.stop();
|
|
24
|
+
};
|
|
25
|
+
}, [compiledQuery]);
|
|
26
|
+
return {
|
|
27
|
+
state,
|
|
28
|
+
data
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
exports.useLiveQuery = useLiveQuery;
|
|
32
|
+
//# sourceMappingURL=useLiveQuery.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLiveQuery.cjs","sources":["../../src/useLiveQuery.ts"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\"\nimport { useStore } from \"@tanstack/react-store\"\nimport { compileQuery, queryBuilder } from \"@tanstack/db\"\nimport type {\n Context,\n InitialQueryBuilder,\n QueryBuilder,\n ResultsFromContext,\n Schema,\n} from \"@tanstack/db\"\n\nexport interface UseLiveQueryReturn<T extends object> {\n state: Map<string, T>\n data: Array<T>\n}\n\nexport function useLiveQuery<\n TResultContext extends Context<Schema> = Context<Schema>,\n>(\n queryFn: (\n q: InitialQueryBuilder<Context<Schema>>\n ) => QueryBuilder<TResultContext>,\n deps: Array<unknown> = []\n): UseLiveQueryReturn<ResultsFromContext<TResultContext>> {\n const [restart, forceRestart] = useState(0)\n\n const compiledQuery = useMemo(() => {\n const query = queryFn(queryBuilder())\n const compiled = compileQuery(query)\n compiled.start()\n return compiled\n }, [...deps, restart])\n\n const state = useStore(compiledQuery.results.derivedState)\n const data = useStore(compiledQuery.results.derivedArray)\n\n // Clean up on unmount\n useEffect(() => {\n if (compiledQuery.state === `stopped`) {\n forceRestart((count) => {\n return (count += 1)\n })\n }\n\n return () => {\n compiledQuery.stop()\n }\n }, [compiledQuery])\n\n return {\n state,\n data,\n }\n}\n"],"names":["useState","useMemo","queryBuilder","compileQuery","useStore","useEffect"],"mappings":";;;;;AAgBO,SAAS,aAGd,SAGA,OAAuB,IACiC;AACxD,QAAM,CAAC,SAAS,YAAY,IAAIA,MAAAA,SAAS,CAAC;AAEpC,QAAA,gBAAgBC,MAAAA,QAAQ,MAAM;AAC5B,UAAA,QAAQ,QAAQC,GAAAA,cAAc;AAC9B,UAAA,WAAWC,gBAAa,KAAK;AACnC,aAAS,MAAM;AACR,WAAA;AAAA,EAAA,GACN,CAAC,GAAG,MAAM,OAAO,CAAC;AAErB,QAAM,QAAQC,WAAA,SAAS,cAAc,QAAQ,YAAY;AACzD,QAAM,OAAOA,WAAA,SAAS,cAAc,QAAQ,YAAY;AAGxDC,QAAAA,UAAU,MAAM;AACV,QAAA,cAAc,UAAU,WAAW;AACrC,mBAAa,CAAC,UAAU;AACtB,eAAQ,SAAS;AAAA,MAAA,CAClB;AAAA,IAAA;AAGH,WAAO,MAAM;AACX,oBAAc,KAAK;AAAA,IACrB;AAAA,EAAA,GACC,CAAC,aAAa,CAAC;AAEX,SAAA;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Context, InitialQueryBuilder, QueryBuilder, ResultsFromContext, Schema } from '@tanstack/db';
|
|
2
|
+
export interface UseLiveQueryReturn<T extends object> {
|
|
3
|
+
state: Map<string, T>;
|
|
4
|
+
data: Array<T>;
|
|
5
|
+
}
|
|
6
|
+
export declare function useLiveQuery<TResultContext extends Context<Schema> = Context<Schema>>(queryFn: (q: InitialQueryBuilder<Context<Schema>>) => QueryBuilder<TResultContext>, deps?: Array<unknown>): UseLiveQueryReturn<ResultsFromContext<TResultContext>>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const db = require("@tanstack/db");
|
|
4
|
+
function useOptimisticMutation(config) {
|
|
5
|
+
return {
|
|
6
|
+
mutate: (callback) => {
|
|
7
|
+
const transaction = db.createTransaction(config);
|
|
8
|
+
transaction.mutate(callback);
|
|
9
|
+
return transaction;
|
|
10
|
+
},
|
|
11
|
+
createTransaction: () => {
|
|
12
|
+
return db.createTransaction({ ...config, autoCommit: false });
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
exports.useOptimisticMutation = useOptimisticMutation;
|
|
17
|
+
//# sourceMappingURL=useOptimisticMutation.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOptimisticMutation.cjs","sources":["../../src/useOptimisticMutation.ts"],"sourcesContent":["import { createTransaction } from \"@tanstack/db\"\nimport type { Transaction, TransactionConfig } from \"@tanstack/db\"\n\nexport function useOptimisticMutation(config: TransactionConfig) {\n return {\n mutate: (callback: () => void): Transaction => {\n const transaction = createTransaction(config)\n transaction.mutate(callback)\n return transaction\n },\n createTransaction: (): Transaction => {\n return createTransaction({ ...config, autoCommit: false })\n },\n }\n}\n"],"names":["createTransaction"],"mappings":";;;AAGO,SAAS,sBAAsB,QAA2B;AACxD,SAAA;AAAA,IACL,QAAQ,CAAC,aAAsC;AACvC,YAAA,cAAcA,qBAAkB,MAAM;AAC5C,kBAAY,OAAO,QAAQ;AACpB,aAAA;AAAA,IACT;AAAA,IACA,mBAAmB,MAAmB;AACpC,aAAOA,qBAAkB,EAAE,GAAG,QAAQ,YAAY,OAAO;AAAA,IAAA;AAAA,EAE7D;AACF;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { useOptimisticMutation } from "./useOptimisticMutation.js";
|
|
2
|
+
import { useLiveQuery } from "./useLiveQuery.js";
|
|
3
|
+
export * from "@tanstack/db";
|
|
4
|
+
import { Collection, createTransaction } from "@tanstack/db";
|
|
5
|
+
export {
|
|
6
|
+
Collection,
|
|
7
|
+
createTransaction,
|
|
8
|
+
useLiveQuery,
|
|
9
|
+
useOptimisticMutation
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Context, InitialQueryBuilder, QueryBuilder, ResultsFromContext, Schema } from '@tanstack/db';
|
|
2
|
+
export interface UseLiveQueryReturn<T extends object> {
|
|
3
|
+
state: Map<string, T>;
|
|
4
|
+
data: Array<T>;
|
|
5
|
+
}
|
|
6
|
+
export declare function useLiveQuery<TResultContext extends Context<Schema> = Context<Schema>>(queryFn: (q: InitialQueryBuilder<Context<Schema>>) => QueryBuilder<TResultContext>, deps?: Array<unknown>): UseLiveQueryReturn<ResultsFromContext<TResultContext>>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { useState, useMemo, useEffect } from "react";
|
|
2
|
+
import { useStore } from "@tanstack/react-store";
|
|
3
|
+
import { queryBuilder, compileQuery } from "@tanstack/db";
|
|
4
|
+
function useLiveQuery(queryFn, deps = []) {
|
|
5
|
+
const [restart, forceRestart] = useState(0);
|
|
6
|
+
const compiledQuery = useMemo(() => {
|
|
7
|
+
const query = queryFn(queryBuilder());
|
|
8
|
+
const compiled = compileQuery(query);
|
|
9
|
+
compiled.start();
|
|
10
|
+
return compiled;
|
|
11
|
+
}, [...deps, restart]);
|
|
12
|
+
const state = useStore(compiledQuery.results.derivedState);
|
|
13
|
+
const data = useStore(compiledQuery.results.derivedArray);
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
if (compiledQuery.state === `stopped`) {
|
|
16
|
+
forceRestart((count) => {
|
|
17
|
+
return count += 1;
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return () => {
|
|
21
|
+
compiledQuery.stop();
|
|
22
|
+
};
|
|
23
|
+
}, [compiledQuery]);
|
|
24
|
+
return {
|
|
25
|
+
state,
|
|
26
|
+
data
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export {
|
|
30
|
+
useLiveQuery
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=useLiveQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLiveQuery.js","sources":["../../src/useLiveQuery.ts"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\"\nimport { useStore } from \"@tanstack/react-store\"\nimport { compileQuery, queryBuilder } from \"@tanstack/db\"\nimport type {\n Context,\n InitialQueryBuilder,\n QueryBuilder,\n ResultsFromContext,\n Schema,\n} from \"@tanstack/db\"\n\nexport interface UseLiveQueryReturn<T extends object> {\n state: Map<string, T>\n data: Array<T>\n}\n\nexport function useLiveQuery<\n TResultContext extends Context<Schema> = Context<Schema>,\n>(\n queryFn: (\n q: InitialQueryBuilder<Context<Schema>>\n ) => QueryBuilder<TResultContext>,\n deps: Array<unknown> = []\n): UseLiveQueryReturn<ResultsFromContext<TResultContext>> {\n const [restart, forceRestart] = useState(0)\n\n const compiledQuery = useMemo(() => {\n const query = queryFn(queryBuilder())\n const compiled = compileQuery(query)\n compiled.start()\n return compiled\n }, [...deps, restart])\n\n const state = useStore(compiledQuery.results.derivedState)\n const data = useStore(compiledQuery.results.derivedArray)\n\n // Clean up on unmount\n useEffect(() => {\n if (compiledQuery.state === `stopped`) {\n forceRestart((count) => {\n return (count += 1)\n })\n }\n\n return () => {\n compiledQuery.stop()\n }\n }, [compiledQuery])\n\n return {\n state,\n data,\n }\n}\n"],"names":[],"mappings":";;;AAgBO,SAAS,aAGd,SAGA,OAAuB,IACiC;AACxD,QAAM,CAAC,SAAS,YAAY,IAAI,SAAS,CAAC;AAEpC,QAAA,gBAAgB,QAAQ,MAAM;AAC5B,UAAA,QAAQ,QAAQ,cAAc;AAC9B,UAAA,WAAW,aAAa,KAAK;AACnC,aAAS,MAAM;AACR,WAAA;AAAA,EAAA,GACN,CAAC,GAAG,MAAM,OAAO,CAAC;AAErB,QAAM,QAAQ,SAAS,cAAc,QAAQ,YAAY;AACzD,QAAM,OAAO,SAAS,cAAc,QAAQ,YAAY;AAGxD,YAAU,MAAM;AACV,QAAA,cAAc,UAAU,WAAW;AACrC,mBAAa,CAAC,UAAU;AACtB,eAAQ,SAAS;AAAA,MAAA,CAClB;AAAA,IAAA;AAGH,WAAO,MAAM;AACX,oBAAc,KAAK;AAAA,IACrB;AAAA,EAAA,GACC,CAAC,aAAa,CAAC;AAEX,SAAA;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createTransaction } from "@tanstack/db";
|
|
2
|
+
function useOptimisticMutation(config) {
|
|
3
|
+
return {
|
|
4
|
+
mutate: (callback) => {
|
|
5
|
+
const transaction = createTransaction(config);
|
|
6
|
+
transaction.mutate(callback);
|
|
7
|
+
return transaction;
|
|
8
|
+
},
|
|
9
|
+
createTransaction: () => {
|
|
10
|
+
return createTransaction({ ...config, autoCommit: false });
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
useOptimisticMutation
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=useOptimisticMutation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOptimisticMutation.js","sources":["../../src/useOptimisticMutation.ts"],"sourcesContent":["import { createTransaction } from \"@tanstack/db\"\nimport type { Transaction, TransactionConfig } from \"@tanstack/db\"\n\nexport function useOptimisticMutation(config: TransactionConfig) {\n return {\n mutate: (callback: () => void): Transaction => {\n const transaction = createTransaction(config)\n transaction.mutate(callback)\n return transaction\n },\n createTransaction: (): Transaction => {\n return createTransaction({ ...config, autoCommit: false })\n },\n }\n}\n"],"names":[],"mappings":";AAGO,SAAS,sBAAsB,QAA2B;AACxD,SAAA;AAAA,IACL,QAAQ,CAAC,aAAsC;AACvC,YAAA,cAAc,kBAAkB,MAAM;AAC5C,kBAAY,OAAO,QAAQ;AACpB,aAAA;AAAA,IACT;AAAA,IACA,mBAAmB,MAAmB;AACpC,aAAO,kBAAkB,EAAE,GAAG,QAAQ,YAAY,OAAO;AAAA,IAAA;AAAA,EAE7D;AACF;"}
|
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tanstack/react-db",
|
|
3
|
+
"description": "React integration for @tanstack/db",
|
|
4
|
+
"version": "0.0.1",
|
|
5
|
+
"author": "Kyle Mathews",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/TanStack/db.git",
|
|
10
|
+
"directory": "packages/react-db"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://tanstack.com/db",
|
|
13
|
+
"keywords": [
|
|
14
|
+
"optimistic",
|
|
15
|
+
"react",
|
|
16
|
+
"typescript"
|
|
17
|
+
],
|
|
18
|
+
"packageManager": "pnpm@10.5.2",
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@tanstack/db": "workspace:*",
|
|
21
|
+
"@tanstack/react-store": "^0.7.0",
|
|
22
|
+
"use-sync-external-store": "^1.2.0"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@electric-sql/client": "1.0.0",
|
|
26
|
+
"@testing-library/react": "^16.2.0",
|
|
27
|
+
"@types/react": "^19.0.12",
|
|
28
|
+
"@types/react-dom": "^19.0.3",
|
|
29
|
+
"@types/use-sync-external-store": "^0.0.6",
|
|
30
|
+
"@vitest/coverage-istanbul": "^3.0.9",
|
|
31
|
+
"react": "^19.0.0",
|
|
32
|
+
"react-dom": "^19.0.0"
|
|
33
|
+
},
|
|
34
|
+
"exports": {
|
|
35
|
+
".": {
|
|
36
|
+
"import": {
|
|
37
|
+
"types": "./dist/esm/index.d.ts",
|
|
38
|
+
"default": "./dist/esm/index.js"
|
|
39
|
+
},
|
|
40
|
+
"require": {
|
|
41
|
+
"types": "./dist/cjs/index.d.cts",
|
|
42
|
+
"default": "./dist/cjs/index.cjs"
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"./package.json": "./package.json"
|
|
46
|
+
},
|
|
47
|
+
"files": [
|
|
48
|
+
"dist",
|
|
49
|
+
"src"
|
|
50
|
+
],
|
|
51
|
+
"main": "dist/cjs/index.cjs",
|
|
52
|
+
"module": "dist/esm/index.js",
|
|
53
|
+
"peerDependencies": {
|
|
54
|
+
"react": ">=16.8.0"
|
|
55
|
+
},
|
|
56
|
+
"scripts": {
|
|
57
|
+
"build": "vite build",
|
|
58
|
+
"dev": "vite build --watch",
|
|
59
|
+
"test": "npx vitest --run",
|
|
60
|
+
"lint": "eslint . --fix"
|
|
61
|
+
},
|
|
62
|
+
"sideEffects": false,
|
|
63
|
+
"type": "module",
|
|
64
|
+
"types": "dist/esm/index.d.ts"
|
|
65
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Re-export all public APIs
|
|
2
|
+
export * from "./useOptimisticMutation"
|
|
3
|
+
export * from "./useLiveQuery"
|
|
4
|
+
|
|
5
|
+
// Re-export everything from @tanstack/db
|
|
6
|
+
export * from "@tanstack/db"
|
|
7
|
+
|
|
8
|
+
// Re-export some stuff explicitly to ensure the type & value is exported
|
|
9
|
+
export { Collection } from "@tanstack/db"
|
|
10
|
+
export { createTransaction } from "@tanstack/db"
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { useEffect, useMemo, useState } from "react"
|
|
2
|
+
import { useStore } from "@tanstack/react-store"
|
|
3
|
+
import { compileQuery, queryBuilder } from "@tanstack/db"
|
|
4
|
+
import type {
|
|
5
|
+
Context,
|
|
6
|
+
InitialQueryBuilder,
|
|
7
|
+
QueryBuilder,
|
|
8
|
+
ResultsFromContext,
|
|
9
|
+
Schema,
|
|
10
|
+
} from "@tanstack/db"
|
|
11
|
+
|
|
12
|
+
export interface UseLiveQueryReturn<T extends object> {
|
|
13
|
+
state: Map<string, T>
|
|
14
|
+
data: Array<T>
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function useLiveQuery<
|
|
18
|
+
TResultContext extends Context<Schema> = Context<Schema>,
|
|
19
|
+
>(
|
|
20
|
+
queryFn: (
|
|
21
|
+
q: InitialQueryBuilder<Context<Schema>>
|
|
22
|
+
) => QueryBuilder<TResultContext>,
|
|
23
|
+
deps: Array<unknown> = []
|
|
24
|
+
): UseLiveQueryReturn<ResultsFromContext<TResultContext>> {
|
|
25
|
+
const [restart, forceRestart] = useState(0)
|
|
26
|
+
|
|
27
|
+
const compiledQuery = useMemo(() => {
|
|
28
|
+
const query = queryFn(queryBuilder())
|
|
29
|
+
const compiled = compileQuery(query)
|
|
30
|
+
compiled.start()
|
|
31
|
+
return compiled
|
|
32
|
+
}, [...deps, restart])
|
|
33
|
+
|
|
34
|
+
const state = useStore(compiledQuery.results.derivedState)
|
|
35
|
+
const data = useStore(compiledQuery.results.derivedArray)
|
|
36
|
+
|
|
37
|
+
// Clean up on unmount
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
if (compiledQuery.state === `stopped`) {
|
|
40
|
+
forceRestart((count) => {
|
|
41
|
+
return (count += 1)
|
|
42
|
+
})
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return () => {
|
|
46
|
+
compiledQuery.stop()
|
|
47
|
+
}
|
|
48
|
+
}, [compiledQuery])
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
state,
|
|
52
|
+
data,
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createTransaction } from "@tanstack/db"
|
|
2
|
+
import type { Transaction, TransactionConfig } from "@tanstack/db"
|
|
3
|
+
|
|
4
|
+
export function useOptimisticMutation(config: TransactionConfig) {
|
|
5
|
+
return {
|
|
6
|
+
mutate: (callback: () => void): Transaction => {
|
|
7
|
+
const transaction = createTransaction(config)
|
|
8
|
+
transaction.mutate(callback)
|
|
9
|
+
return transaction
|
|
10
|
+
},
|
|
11
|
+
createTransaction: (): Transaction => {
|
|
12
|
+
return createTransaction({ ...config, autoCommit: false })
|
|
13
|
+
},
|
|
14
|
+
}
|
|
15
|
+
}
|