@derivesome/react 1.0.0
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/.package.json.~undo-tree~ +9 -0
- package/.tsconfig.cjs.json.~undo-tree~ +5 -0
- package/.tsconfig.json.~undo-tree~ +5 -0
- package/dist/cjs/hooks/index.d.ts +2 -0
- package/dist/cjs/hooks/index.d.ts.map +1 -0
- package/dist/cjs/hooks/index.js +18 -0
- package/dist/cjs/hooks/index.js.map +1 -0
- package/dist/cjs/hooks/useDerived.d.ts +6 -0
- package/dist/cjs/hooks/useDerived.d.ts.map +1 -0
- package/dist/cjs/hooks/useDerived.js +42 -0
- package/dist/cjs/hooks/useDerived.js.map +1 -0
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +18 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/esm/hooks/index.d.ts +2 -0
- package/dist/esm/hooks/index.d.ts.map +1 -0
- package/dist/esm/hooks/index.js +2 -0
- package/dist/esm/hooks/index.js.map +1 -0
- package/dist/esm/hooks/useDerived.d.ts +6 -0
- package/dist/esm/hooks/useDerived.d.ts.map +1 -0
- package/dist/esm/hooks/useDerived.js +36 -0
- package/dist/esm/hooks/useDerived.js.map +1 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/package.json +48 -0
- package/package.json~ +43 -0
- package/src/.index.ts.~undo-tree~ +6 -0
- package/src/hooks/.index.ts.~undo-tree~ +6 -0
- package/src/hooks/.useDerived.ts.~undo-tree~ +354 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/index.ts~ +1 -0
- package/src/hooks/useDerived.ts +73 -0
- package/src/hooks/useDerived.ts~ +75 -0
- package/src/index.ts +1 -0
- package/src/index.ts~ +0 -0
- package/tsconfig.cjs.json +8 -0
- package/tsconfig.cjs.json~ +0 -0
- package/tsconfig.json +24 -0
- package/tsconfig.json~ +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useDerived';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useDerived';
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Reference, compare } from "@derivesome/core";
|
|
2
|
+
import {
|
|
3
|
+
Dispatch,
|
|
4
|
+
SetStateAction,
|
|
5
|
+
useCallback,
|
|
6
|
+
useRef,
|
|
7
|
+
useSyncExternalStore,
|
|
8
|
+
} from "react";
|
|
9
|
+
|
|
10
|
+
export const useDerivedValue = <
|
|
11
|
+
D extends Reference<any>,
|
|
12
|
+
R = D extends Reference<infer K> ? K : never,
|
|
13
|
+
>(
|
|
14
|
+
d: D,
|
|
15
|
+
): R => {
|
|
16
|
+
const ref = useRef(d).current;
|
|
17
|
+
const old = useRef<R>(d.peek());
|
|
18
|
+
|
|
19
|
+
return useSyncExternalStore(
|
|
20
|
+
useCallback(
|
|
21
|
+
(callback) => {
|
|
22
|
+
const unsub = ref.subscribe((next) => {
|
|
23
|
+
callback();
|
|
24
|
+
old.current = next;
|
|
25
|
+
});
|
|
26
|
+
callback();
|
|
27
|
+
return () => {
|
|
28
|
+
unsub();
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
[ref],
|
|
32
|
+
),
|
|
33
|
+
() => {
|
|
34
|
+
const nextSnap = ref.peek();
|
|
35
|
+
|
|
36
|
+
if (compare(old.current, nextSnap)) {
|
|
37
|
+
return old.current;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return nextSnap;
|
|
41
|
+
},
|
|
42
|
+
);
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export const useSetDerived = <
|
|
46
|
+
D extends Reference<any>,
|
|
47
|
+
R = D extends Reference<infer K> ? K : never,
|
|
48
|
+
>(
|
|
49
|
+
d: D,
|
|
50
|
+
): Dispatch<SetStateAction<R>> => {
|
|
51
|
+
const ref = useRef(d).current;
|
|
52
|
+
|
|
53
|
+
const setter: Dispatch<SetStateAction<R>> = useCallback(
|
|
54
|
+
(fn) => {
|
|
55
|
+
ref.set(fn);
|
|
56
|
+
},
|
|
57
|
+
[ref],
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
return setter;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export const useDerived = <
|
|
64
|
+
D extends Reference<any>,
|
|
65
|
+
R = D extends Reference<infer K> ? K : never,
|
|
66
|
+
>(
|
|
67
|
+
d: D,
|
|
68
|
+
): [R, Dispatch<SetStateAction<R>>] => {
|
|
69
|
+
const ref = useRef(d).current;
|
|
70
|
+
const current = useDerivedValue<D, R>(ref);
|
|
71
|
+
const setter = useSetDerived<D, R>(ref);
|
|
72
|
+
return [current, setter];
|
|
73
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Reference, compare } from "@derivesome/core";
|
|
2
|
+
import {
|
|
3
|
+
Dispatch,
|
|
4
|
+
SetStateAction,
|
|
5
|
+
useCallback,
|
|
6
|
+
useRef,
|
|
7
|
+
useSyncExternalStore,
|
|
8
|
+
} from "react";
|
|
9
|
+
|
|
10
|
+
export const useDerivedValue = <
|
|
11
|
+
D extends Reference<any>,
|
|
12
|
+
R = D extends Reference<infer K> ? K : never,
|
|
13
|
+
>(
|
|
14
|
+
d: D,
|
|
15
|
+
): R => {
|
|
16
|
+
const ref = useRef(d).current;
|
|
17
|
+
const old = useRef<R>(d.peek());
|
|
18
|
+
|
|
19
|
+
return useSyncExternalStore(
|
|
20
|
+
useCallback(
|
|
21
|
+
(callback) => {
|
|
22
|
+
const unsub = ref.subscribe((next) => {
|
|
23
|
+
callback();
|
|
24
|
+
old.current = next;
|
|
25
|
+
});
|
|
26
|
+
callback();
|
|
27
|
+
return () => {
|
|
28
|
+
unsub();
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
[ref],
|
|
32
|
+
),
|
|
33
|
+
() => {
|
|
34
|
+
const nextSnap = ref.peek();
|
|
35
|
+
|
|
36
|
+
if (compare(old.current, nextSnap)) {
|
|
37
|
+
return old.current;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return nextSnap;
|
|
41
|
+
},
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export const useSetDerived = <
|
|
46
|
+
D extends Reference<any>,
|
|
47
|
+
R = D extends Reference<infer K> ? K : never,
|
|
48
|
+
>(
|
|
49
|
+
d: D,
|
|
50
|
+
): Dispatch<SetStateAction<R>> => {
|
|
51
|
+
const ref = useRef(d).current;
|
|
52
|
+
|
|
53
|
+
const setter: Dispatch<SetStateAction<R>> = useCallback(
|
|
54
|
+
(fn) => {
|
|
55
|
+
ref.set(fn);
|
|
56
|
+
},
|
|
57
|
+
[ref],
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
return setter;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export const useDerived = <
|
|
64
|
+
D extends Reference<any>,
|
|
65
|
+
R = D extends Reference<infer K> ? K : never,
|
|
66
|
+
>(
|
|
67
|
+
d: D,
|
|
68
|
+
): [R, Dispatch<SetStateAction<R>>] => {
|
|
69
|
+
const ref = useRef(d).current;
|
|
70
|
+
const current = useDerivedValue<D, R>(ref);
|
|
71
|
+
const setter = useSetDerived<D, R>(ref);
|
|
72
|
+
return [current, setter];
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
|
package/src/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './hooks';
|
package/src/index.ts~
ADDED
|
File without changes
|
|
File without changes
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"rootDir": "./src",
|
|
4
|
+
"outDir": "./dist/esm",
|
|
5
|
+
"module": "esnext",
|
|
6
|
+
"moduleResolution": "bundler",
|
|
7
|
+
"target": "esnext",
|
|
8
|
+
"lib": ["esnext"],
|
|
9
|
+
"types": ["node"],
|
|
10
|
+
"sourceMap": true,
|
|
11
|
+
"declaration": true,
|
|
12
|
+
"declarationMap": true,
|
|
13
|
+
"noUncheckedIndexedAccess": true,
|
|
14
|
+
"exactOptionalPropertyTypes": true,
|
|
15
|
+
"strict": true,
|
|
16
|
+
"isolatedModules": true,
|
|
17
|
+
"esModuleInterop": true,
|
|
18
|
+
"noUncheckedSideEffectImports": true,
|
|
19
|
+
"moduleDetection": "force",
|
|
20
|
+
"skipLibCheck": true
|
|
21
|
+
},
|
|
22
|
+
"include": ["./src/**/*.ts"],
|
|
23
|
+
"exclude": ["./src/**/*.test.ts"]
|
|
24
|
+
}
|
package/tsconfig.json~
ADDED
|
File without changes
|