@roko-app/instant-react-common 0.0.0-stage → 1.0.67-roko.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/.tshy/build.json +8 -0
- package/.tshy/commonjs.json +16 -0
- package/.tshy/esm.json +15 -0
- package/LICENSE +202 -0
- package/README.md +59 -2
- package/dist/commonjs/InstantReactAbstractDatabase.d.ts +283 -0
- package/dist/commonjs/InstantReactAbstractDatabase.d.ts.map +1 -0
- package/dist/commonjs/InstantReactAbstractDatabase.js +390 -0
- package/dist/commonjs/InstantReactAbstractDatabase.js.map +1 -0
- package/dist/commonjs/InstantReactRoom.d.ts +183 -0
- package/dist/commonjs/InstantReactRoom.d.ts.map +1 -0
- package/dist/commonjs/InstantReactRoom.js +290 -0
- package/dist/commonjs/InstantReactRoom.js.map +1 -0
- package/dist/commonjs/index.d.ts +5 -0
- package/dist/commonjs/index.d.ts.map +1 -0
- package/dist/commonjs/index.js +11 -0
- package/dist/commonjs/index.js.map +1 -0
- package/dist/commonjs/package.json +3 -0
- package/dist/commonjs/useInfiniteQuerySubscription.d.ts +28 -0
- package/dist/commonjs/useInfiniteQuerySubscription.d.ts.map +1 -0
- package/dist/commonjs/useInfiniteQuerySubscription.js +57 -0
- package/dist/commonjs/useInfiniteQuerySubscription.js.map +1 -0
- package/dist/commonjs/useQuery.d.ts +7 -0
- package/dist/commonjs/useQuery.d.ts.map +1 -0
- package/dist/commonjs/useQuery.js +79 -0
- package/dist/commonjs/useQuery.js.map +1 -0
- package/dist/commonjs/useTimeout.d.ts +5 -0
- package/dist/commonjs/useTimeout.d.ts.map +1 -0
- package/dist/commonjs/useTimeout.js +21 -0
- package/dist/commonjs/useTimeout.js.map +1 -0
- package/dist/commonjs/version.d.ts +3 -0
- package/dist/commonjs/version.d.ts.map +1 -0
- package/dist/commonjs/version.js +5 -0
- package/dist/commonjs/version.js.map +1 -0
- package/dist/esm/InstantReactAbstractDatabase.d.ts +283 -0
- package/dist/esm/InstantReactAbstractDatabase.d.ts.map +1 -0
- package/dist/esm/InstantReactAbstractDatabase.js +387 -0
- package/dist/esm/InstantReactAbstractDatabase.js.map +1 -0
- package/dist/esm/InstantReactRoom.d.ts +183 -0
- package/dist/esm/InstantReactRoom.d.ts.map +1 -0
- package/dist/esm/InstantReactRoom.js +281 -0
- package/dist/esm/InstantReactRoom.js.map +1 -0
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/useInfiniteQuerySubscription.d.ts +28 -0
- package/dist/esm/useInfiniteQuerySubscription.d.ts.map +1 -0
- package/dist/esm/useInfiniteQuerySubscription.js +54 -0
- package/dist/esm/useInfiniteQuerySubscription.js.map +1 -0
- package/dist/esm/useQuery.d.ts +7 -0
- package/dist/esm/useQuery.d.ts.map +1 -0
- package/dist/esm/useQuery.js +76 -0
- package/dist/esm/useQuery.js.map +1 -0
- package/dist/esm/useTimeout.d.ts +5 -0
- package/dist/esm/useTimeout.d.ts.map +1 -0
- package/dist/esm/useTimeout.js +18 -0
- package/dist/esm/useTimeout.js.map +1 -0
- package/dist/esm/version.d.ts +3 -0
- package/dist/esm/version.d.ts.map +1 -0
- package/dist/esm/version.js +3 -0
- package/dist/esm/version.js.map +1 -0
- package/dist/standalone/index.js +8718 -0
- package/dist/standalone/index.umd.cjs +36 -0
- package/package.json +43 -3
- package/src/InstantReactAbstractDatabase.tsx +510 -0
- package/src/InstantReactRoom.ts +451 -0
- package/src/index.ts +9 -0
- package/src/useInfiniteQuerySubscription.ts +128 -0
- package/src/useQuery.ts +124 -0
- package/src/useTimeout.ts +22 -0
- package/src/version.ts +3 -0
- package/tsconfig.cjs.dev.json +15 -0
- package/tsconfig.dev.json +14 -0
- package/tsconfig.json +12 -0
- package/vite.config.ts +35 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { weakHash, getInfiniteQueryInitialSnapshot, } from '@instantdb/core';
|
|
2
|
+
import { useCallback, useRef, useSyncExternalStore } from 'react';
|
|
3
|
+
const defaultState = {
|
|
4
|
+
error: undefined,
|
|
5
|
+
data: undefined,
|
|
6
|
+
isLoading: true,
|
|
7
|
+
canLoadNextPage: false,
|
|
8
|
+
};
|
|
9
|
+
export function useInfiniteQuerySubscription({ core, query, opts, }) {
|
|
10
|
+
const subRef = useRef(null);
|
|
11
|
+
const queryHash = weakHash(query);
|
|
12
|
+
const optsHash = weakHash(opts);
|
|
13
|
+
const snapshot = getInfiniteQueryInitialSnapshot(core, query, opts);
|
|
14
|
+
const stateCacheRef = useRef({
|
|
15
|
+
...snapshot,
|
|
16
|
+
isLoading: !snapshot.data && !snapshot.error,
|
|
17
|
+
});
|
|
18
|
+
const subscribe = useCallback((cb) => {
|
|
19
|
+
subRef.current = null;
|
|
20
|
+
const nextSnapshot = getInfiniteQueryInitialSnapshot(core, query, opts);
|
|
21
|
+
stateCacheRef.current = {
|
|
22
|
+
...nextSnapshot,
|
|
23
|
+
isLoading: !nextSnapshot.data && !nextSnapshot.error,
|
|
24
|
+
};
|
|
25
|
+
cb();
|
|
26
|
+
if (!query) {
|
|
27
|
+
return () => { };
|
|
28
|
+
}
|
|
29
|
+
const sub = core.subscribeInfiniteQuery(query, (resp) => {
|
|
30
|
+
stateCacheRef.current = {
|
|
31
|
+
...resp,
|
|
32
|
+
isLoading: false,
|
|
33
|
+
};
|
|
34
|
+
cb();
|
|
35
|
+
}, opts);
|
|
36
|
+
subRef.current = sub;
|
|
37
|
+
return () => {
|
|
38
|
+
sub.unsubscribe();
|
|
39
|
+
if (subRef.current === sub) {
|
|
40
|
+
subRef.current = null;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}, [queryHash, optsHash]);
|
|
44
|
+
const state = useSyncExternalStore(subscribe, () => stateCacheRef.current, () => defaultState);
|
|
45
|
+
const loadNextPage = () => {
|
|
46
|
+
subRef.current?.loadNextPage();
|
|
47
|
+
};
|
|
48
|
+
// @ts-expect-error union type
|
|
49
|
+
return {
|
|
50
|
+
...state,
|
|
51
|
+
loadNextPage,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=useInfiniteQuerySubscription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useInfiniteQuerySubscription.js","sourceRoot":"","sources":["../../src/useInfiniteQuerySubscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,QAAQ,EACR,+BAA+B,GAChC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AA6BlE,MAAM,YAAY,GAAG;IACnB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,IAAI;IACf,eAAe,EAAE,KAAK;CACvB,CAAC;AAEF,MAAM,UAAU,4BAA4B,CAI1C,EACA,IAAI,EACJ,KAAK,EACL,IAAI,GAKL;IACC,MAAM,MAAM,GAAG,MAAM,CAAmC,IAAI,CAAC,CAAC;IAE9D,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,+BAA+B,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAEpE,MAAM,aAAa,GAAG,MAAM,CAE1B;QACA,GAAG,QAAQ;QACX,SAAS,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK;KAC7C,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,EAAc,EAAE,EAAE;QACjB,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QAEtB,MAAM,YAAY,GAAG,+BAA+B,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACxE,aAAa,CAAC,OAAO,GAAG;YACtB,GAAG,YAAY;YACf,SAAS,EAAE,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK;SACrD,CAAC;QAEF,EAAE,EAAE,CAAC;QAEL,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,sBAAsB,CACrC,KAAK,EACL,CAAC,IAAI,EAAE,EAAE;YACP,aAAa,CAAC,OAAO,GAAG;gBACtB,GAAG,IAAI;gBACP,SAAS,EAAE,KAAK;aACjB,CAAC;YACF,EAAE,EAAE,CAAC;QACP,CAAC,EACD,IAAI,CACL,CAAC;QAEF,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC;QAErB,OAAO,GAAG,EAAE;YACV,GAAG,CAAC,WAAW,EAAE,CAAC;YAClB,IAAI,MAAM,CAAC,OAAO,KAAK,GAAG,EAAE,CAAC;gBAC3B,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACxB,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EACD,CAAC,SAAS,EAAE,QAAQ,CAAC,CACtB,CAAC;IAEF,MAAM,KAAK,GAAG,oBAAoB,CAChC,SAAS,EACT,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,EAC3B,GAAG,EAAE,CAAC,YAAY,CACnB,CAAC;IAEF,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;IACjC,CAAC,CAAC;IAEF,8BAA8B;IAC9B,OAAO;QACL,GAAG,KAAK;QACR,YAAY;KACb,CAAC;AACJ,CAAC","sourcesContent":["import {\n type InfiniteQuerySubscription,\n type InstantCoreDatabase,\n type InstantSchemaDef,\n type InstaQLOptions,\n InstaQLResponse,\n ValidQuery,\n weakHash,\n getInfiniteQueryInitialSnapshot,\n} from '@instantdb/core';\nimport { useCallback, useRef, useSyncExternalStore } from 'react';\n\nexport type InfiniteQueryResult<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> =\n | {\n error: { message: string };\n data: undefined;\n isLoading: false;\n canLoadNextPage: boolean;\n loadNextPage: () => void;\n }\n | {\n error: undefined;\n data: undefined;\n isLoading: true;\n canLoadNextPage: boolean;\n loadNextPage: () => void;\n }\n | {\n error: undefined;\n data: InstaQLResponse<Schema, Q, UseDates>;\n isLoading: false;\n canLoadNextPage: boolean;\n loadNextPage: () => void;\n };\n\nconst defaultState = {\n error: undefined,\n data: undefined,\n isLoading: true,\n canLoadNextPage: false,\n};\n\nexport function useInfiniteQuerySubscription<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n>({\n core,\n query,\n opts,\n}: {\n core: InstantCoreDatabase<Schema, UseDates>;\n query: Q | null;\n opts?: InstaQLOptions;\n}): InfiniteQueryResult<Schema, Q, UseDates> {\n const subRef = useRef<InfiniteQuerySubscription | null>(null);\n\n const queryHash = weakHash(query);\n const optsHash = weakHash(opts);\n const snapshot = getInfiniteQueryInitialSnapshot(core, query, opts);\n\n const stateCacheRef = useRef<\n Omit<InfiniteQueryResult<Schema, Q, UseDates>, 'loadNextPage'>\n >({\n ...snapshot,\n isLoading: !snapshot.data && !snapshot.error,\n });\n\n const subscribe = useCallback(\n (cb: () => void) => {\n subRef.current = null;\n\n const nextSnapshot = getInfiniteQueryInitialSnapshot(core, query, opts);\n stateCacheRef.current = {\n ...nextSnapshot,\n isLoading: !nextSnapshot.data && !nextSnapshot.error,\n };\n\n cb();\n\n if (!query) {\n return () => {};\n }\n\n const sub = core.subscribeInfiniteQuery(\n query,\n (resp) => {\n stateCacheRef.current = {\n ...resp,\n isLoading: false,\n };\n cb();\n },\n opts,\n );\n\n subRef.current = sub;\n\n return () => {\n sub.unsubscribe();\n if (subRef.current === sub) {\n subRef.current = null;\n }\n };\n },\n [queryHash, optsHash],\n );\n\n const state = useSyncExternalStore(\n subscribe,\n () => stateCacheRef.current,\n () => defaultState,\n );\n\n const loadNextPage = () => {\n subRef.current?.loadNextPage();\n };\n\n // @ts-expect-error union type\n return {\n ...state,\n loadNextPage,\n };\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type InstaQLOptions, InstantCoreDatabase, InstaQLLifecycleState, InstantSchemaDef, ValidQuery } from '@instantdb/core';
|
|
2
|
+
export declare function useQueryInternal<Q extends ValidQuery<Q, Schema>, Schema extends InstantSchemaDef<any, any, any>, UseDates extends boolean>(_core: InstantCoreDatabase<Schema, UseDates>, _query: null | Q, _opts?: InstaQLOptions, serverSnapshot?: () => InstaQLLifecycleState<Schema, Q, UseDates> | undefined): {
|
|
3
|
+
state: InstaQLLifecycleState<Schema, Q, UseDates>;
|
|
4
|
+
query: any;
|
|
5
|
+
queryHash: string;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=useQuery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../../src/useQuery.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,cAAc,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,UAAU,EACX,MAAM,iBAAiB,CAAC;AAoBzB,wBAAgB,gBAAgB,CAC9B,CAAC,SAAS,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,EAC/B,MAAM,SAAS,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC9C,QAAQ,SAAS,OAAO,EAExB,KAAK,EAAE,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC5C,MAAM,EAAE,IAAI,GAAG,CAAC,EAChB,KAAK,CAAC,EAAE,cAAc,EACtB,cAAc,CAAC,EAAE,MAAM,qBAAqB,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,GAAG,SAAS,GAC5E;IACD,KAAK,EAAE,qBAAqB,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IAClD,KAAK,EAAE,GAAG,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB,CAgFA"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { weakHash, coerceQuery, } from '@instantdb/core';
|
|
3
|
+
import { useCallback, useRef, useSyncExternalStore } from 'react';
|
|
4
|
+
const defaultState = {
|
|
5
|
+
isLoading: true,
|
|
6
|
+
data: undefined,
|
|
7
|
+
pageInfo: undefined,
|
|
8
|
+
error: undefined,
|
|
9
|
+
};
|
|
10
|
+
function stateForResult(result) {
|
|
11
|
+
return {
|
|
12
|
+
isLoading: !Boolean(result),
|
|
13
|
+
data: undefined,
|
|
14
|
+
pageInfo: undefined,
|
|
15
|
+
error: undefined,
|
|
16
|
+
...(result ? result : {}),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function useQueryInternal(_core, _query, _opts, serverSnapshot) {
|
|
20
|
+
if (_query && _opts && 'ruleParams' in _opts) {
|
|
21
|
+
_query = { $$ruleParams: _opts['ruleParams'], ..._query };
|
|
22
|
+
}
|
|
23
|
+
const query = _query ? coerceQuery(_query) : null;
|
|
24
|
+
const queryHash = weakHash(query);
|
|
25
|
+
// We use a ref to store the result of the query.
|
|
26
|
+
// This is becuase `useSyncExternalStore` uses `Object.is`
|
|
27
|
+
// to compare the previous and next state.
|
|
28
|
+
// If we don't use a ref, the state will always be considered different, so
|
|
29
|
+
// the component will always re-render.
|
|
30
|
+
const resultCacheRef = useRef(stateForResult(_core._reactor.getPreviousResult(query)));
|
|
31
|
+
// Cache the server snapshot to satisfy useSyncExternalStore's requirement
|
|
32
|
+
// that getServerSnapshot returns the same reference across calls.
|
|
33
|
+
const serverSnapshotCacheRef = useRef(defaultState);
|
|
34
|
+
// Similar to `resultCacheRef`, `useSyncExternalStore` will unsubscribe
|
|
35
|
+
// if `subscribe` changes, so we use `useCallback` to memoize the function.
|
|
36
|
+
const subscribe = useCallback((cb) => {
|
|
37
|
+
// Update the ref when the query changes to avoid showing stale data
|
|
38
|
+
resultCacheRef.current = stateForResult(_core._reactor.getPreviousResult(query));
|
|
39
|
+
// before the subscribeQuery is connected and calls it's own callback,
|
|
40
|
+
// we might have data in the store via SSR, we need to notify useSyncExternalStore that
|
|
41
|
+
// the data has changed.
|
|
42
|
+
cb();
|
|
43
|
+
// Don't subscribe if query is null
|
|
44
|
+
if (!query) {
|
|
45
|
+
const unsubscribe = () => { };
|
|
46
|
+
return unsubscribe;
|
|
47
|
+
}
|
|
48
|
+
const unsubscribe = _core.subscribeQuery(query, (result) => {
|
|
49
|
+
resultCacheRef.current = {
|
|
50
|
+
isLoading: !Boolean(result),
|
|
51
|
+
// @ts-expect-error: ts thinks this will always be overwritten
|
|
52
|
+
data: undefined,
|
|
53
|
+
// @ts-expect-error: ts thinks this will always be overwritten
|
|
54
|
+
pageInfo: undefined,
|
|
55
|
+
// @ts-expect-error: ts thinks this will always be overwritten
|
|
56
|
+
error: undefined,
|
|
57
|
+
...result,
|
|
58
|
+
};
|
|
59
|
+
cb();
|
|
60
|
+
});
|
|
61
|
+
return unsubscribe;
|
|
62
|
+
},
|
|
63
|
+
// Build a new subscribe function if the query changes
|
|
64
|
+
[queryHash]);
|
|
65
|
+
const state = useSyncExternalStore(subscribe, () => resultCacheRef.current, () => {
|
|
66
|
+
if (serverSnapshot && serverSnapshotCacheRef.current === defaultState) {
|
|
67
|
+
const result = serverSnapshot();
|
|
68
|
+
if (result) {
|
|
69
|
+
serverSnapshotCacheRef.current = result;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return serverSnapshotCacheRef.current;
|
|
73
|
+
});
|
|
74
|
+
return { state, query, queryHash };
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=useQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQuery.js","sourceRoot":"","sources":["../../src/useQuery.ts"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport {\n weakHash,\n coerceQuery,\n type InstaQLOptions,\n InstantCoreDatabase,\n InstaQLLifecycleState,\n InstantSchemaDef,\n ValidQuery,\n} from '@instantdb/core';\nimport { useCallback, useRef, useSyncExternalStore } from 'react';\n\nconst defaultState = {\n isLoading: true,\n data: undefined,\n pageInfo: undefined,\n error: undefined,\n} as const;\n\nfunction stateForResult(result: any) {\n return {\n isLoading: !Boolean(result),\n data: undefined,\n pageInfo: undefined,\n error: undefined,\n ...(result ? result : {}),\n };\n}\n\nexport function useQueryInternal<\n Q extends ValidQuery<Q, Schema>,\n Schema extends InstantSchemaDef<any, any, any>,\n UseDates extends boolean,\n>(\n _core: InstantCoreDatabase<Schema, UseDates>,\n _query: null | Q,\n _opts?: InstaQLOptions,\n serverSnapshot?: () => InstaQLLifecycleState<Schema, Q, UseDates> | undefined,\n): {\n state: InstaQLLifecycleState<Schema, Q, UseDates>;\n query: any;\n queryHash: string;\n} {\n if (_query && _opts && 'ruleParams' in _opts) {\n _query = { $$ruleParams: _opts['ruleParams'], ..._query };\n }\n const query = _query ? coerceQuery(_query) : null;\n const queryHash = weakHash(query);\n\n // We use a ref to store the result of the query.\n // This is becuase `useSyncExternalStore` uses `Object.is`\n // to compare the previous and next state.\n // If we don't use a ref, the state will always be considered different, so\n // the component will always re-render.\n const resultCacheRef = useRef<InstaQLLifecycleState<Schema, Q, UseDates>>(\n stateForResult(_core._reactor.getPreviousResult(query)),\n );\n\n // Cache the server snapshot to satisfy useSyncExternalStore's requirement\n // that getServerSnapshot returns the same reference across calls.\n const serverSnapshotCacheRef = useRef<\n InstaQLLifecycleState<Schema, Q, UseDates>\n >(defaultState as any);\n\n // Similar to `resultCacheRef`, `useSyncExternalStore` will unsubscribe\n // if `subscribe` changes, so we use `useCallback` to memoize the function.\n const subscribe = useCallback(\n (cb) => {\n // Update the ref when the query changes to avoid showing stale data\n resultCacheRef.current = stateForResult(\n _core._reactor.getPreviousResult(query),\n );\n // before the subscribeQuery is connected and calls it's own callback,\n // we might have data in the store via SSR, we need to notify useSyncExternalStore that\n // the data has changed.\n cb();\n\n // Don't subscribe if query is null\n if (!query) {\n const unsubscribe = () => {};\n return unsubscribe;\n }\n\n const unsubscribe = _core.subscribeQuery<Q, UseDates>(query, (result) => {\n resultCacheRef.current = {\n isLoading: !Boolean(result),\n // @ts-expect-error: ts thinks this will always be overwritten\n data: undefined,\n // @ts-expect-error: ts thinks this will always be overwritten\n pageInfo: undefined,\n // @ts-expect-error: ts thinks this will always be overwritten\n error: undefined,\n ...result,\n };\n\n cb();\n });\n\n return unsubscribe;\n },\n // Build a new subscribe function if the query changes\n [queryHash],\n );\n\n const state = useSyncExternalStore<\n InstaQLLifecycleState<Schema, Q, UseDates>\n >(\n subscribe,\n () => resultCacheRef.current,\n () => {\n if (serverSnapshot && serverSnapshotCacheRef.current === defaultState) {\n const result = serverSnapshot();\n if (result) {\n serverSnapshotCacheRef.current = result;\n }\n }\n\n return serverSnapshotCacheRef.current;\n },\n );\n\n return { state, query, queryHash };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTimeout.d.ts","sourceRoot":"","sources":["../../src/useTimeout.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU;iBAOJ,MAAM,MAAM,MAAM,IAAI;;EAY3C"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { useEffect, useRef } from 'react';
|
|
2
|
+
export function useTimeout() {
|
|
3
|
+
const timeoutRef = useRef(null);
|
|
4
|
+
useEffect(() => {
|
|
5
|
+
clear();
|
|
6
|
+
}, []);
|
|
7
|
+
function set(delay, fn) {
|
|
8
|
+
clear();
|
|
9
|
+
timeoutRef.current = setTimeout(fn, delay);
|
|
10
|
+
}
|
|
11
|
+
function clear() {
|
|
12
|
+
if (timeoutRef.current) {
|
|
13
|
+
clearTimeout(timeoutRef.current);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return { set, clear };
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=useTimeout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTimeout.js","sourceRoot":"","sources":["../../src/useTimeout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE1C,MAAM,UAAU,UAAU;IACxB,MAAM,UAAU,GAAG,MAAM,CAAuC,IAAI,CAAC,CAAC;IAEtE,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,EAAE,CAAC;IACV,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,GAAG,CAAC,KAAa,EAAE,EAAc;QACxC,KAAK,EAAE,CAAC;QACR,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,SAAS,KAAK;QACZ,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACxB,CAAC","sourcesContent":["import { useEffect, useRef } from 'react';\n\nexport function useTimeout() {\n const timeoutRef = useRef<null | ReturnType<typeof setTimeout>>(null);\n\n useEffect(() => {\n clear();\n }, []);\n\n function set(delay: number, fn: () => void) {\n clear();\n timeoutRef.current = setTimeout(fn, delay);\n }\n\n function clear() {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n }\n\n return { set, clear };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,eAAe,OAAO,CAAC","sourcesContent":["import { version } from '@instantdb/version';\n\nexport default version;\n"]}
|