@dnd-kit/react 0.5.1-beta-20260905201412 → 0.5.1-beta-20260912195958
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/hooks.cjs +56 -37
- package/hooks.cjs.map +1 -1
- package/hooks.js +57 -38
- package/hooks.js.map +1 -1
- package/package.json +4 -4
package/hooks.cjs
CHANGED
|
@@ -22,14 +22,14 @@ function useForceUpdate() {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
// src/hooks/useSignal.ts
|
|
25
|
-
function useSignal(
|
|
26
|
-
const previous = react.useRef(
|
|
25
|
+
function useSignal(signal2, sync = false) {
|
|
26
|
+
const previous = react.useRef(signal2.peek());
|
|
27
27
|
const read = react.useRef(false);
|
|
28
28
|
const forceUpdate = useForceUpdate();
|
|
29
29
|
useIsomorphicLayoutEffect(
|
|
30
30
|
() => state.effect(() => {
|
|
31
31
|
const previousValue = previous.current;
|
|
32
|
-
const currentValue2 =
|
|
32
|
+
const currentValue2 = signal2.value;
|
|
33
33
|
if (previousValue !== currentValue2) {
|
|
34
34
|
previous.current = currentValue2;
|
|
35
35
|
if (!read.current) return;
|
|
@@ -40,12 +40,12 @@ function useSignal(signal, sync = false) {
|
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
}),
|
|
43
|
-
[
|
|
43
|
+
[signal2, sync, forceUpdate]
|
|
44
44
|
);
|
|
45
45
|
return {
|
|
46
46
|
get value() {
|
|
47
47
|
read.current = true;
|
|
48
|
-
return
|
|
48
|
+
return signal2.peek();
|
|
49
49
|
}
|
|
50
50
|
};
|
|
51
51
|
}
|
|
@@ -59,60 +59,79 @@ function useComputed(compute, dependencies = [], sync = false) {
|
|
|
59
59
|
sync
|
|
60
60
|
);
|
|
61
61
|
}
|
|
62
|
+
function useLatest(value) {
|
|
63
|
+
const valueRef = react.useRef(value);
|
|
64
|
+
useIsomorphicLayoutEffect(() => {
|
|
65
|
+
valueRef.current = value;
|
|
66
|
+
}, [value]);
|
|
67
|
+
return valueRef;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// src/hooks/useDeepSignal.ts
|
|
62
71
|
function useDeepSignal(target, synchronous) {
|
|
63
|
-
const tracked = react.useRef(/* @__PURE__ */ new Map());
|
|
64
72
|
const forceUpdate = useForceUpdate();
|
|
73
|
+
const synchronousRef = useLatest(synchronous);
|
|
74
|
+
const tracker = react.useMemo(() => {
|
|
75
|
+
const tracked = /* @__PURE__ */ new Map();
|
|
76
|
+
return {
|
|
77
|
+
tracked,
|
|
78
|
+
propertyCount: state.signal(0),
|
|
79
|
+
active: false,
|
|
80
|
+
proxy: target ? new Proxy(target, {
|
|
81
|
+
get(target2, key) {
|
|
82
|
+
const value = target2[key];
|
|
83
|
+
if (!tracked.has(key)) tracked.set(key, value);
|
|
84
|
+
return value;
|
|
85
|
+
}
|
|
86
|
+
}) : target
|
|
87
|
+
};
|
|
88
|
+
}, [target]);
|
|
65
89
|
useIsomorphicLayoutEffect(() => {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
90
|
+
tracker.propertyCount.value = tracker.tracked.size;
|
|
91
|
+
});
|
|
92
|
+
useIsomorphicLayoutEffect(() => {
|
|
93
|
+
if (!target) return;
|
|
94
|
+
const { tracked, propertyCount } = tracker;
|
|
95
|
+
tracker.active = true;
|
|
96
|
+
const dispose = state.effect(() => {
|
|
97
|
+
propertyCount.value;
|
|
72
98
|
let stale = false;
|
|
73
99
|
let sync = false;
|
|
74
|
-
for (const
|
|
75
|
-
const [key] = entry;
|
|
76
|
-
const value = state.untracked(() => entry[1]);
|
|
100
|
+
for (const [key, value] of tracked) {
|
|
77
101
|
const latestValue = target[key];
|
|
78
|
-
if (value
|
|
102
|
+
if (!Object.is(value, latestValue)) {
|
|
79
103
|
stale = true;
|
|
80
|
-
tracked.
|
|
81
|
-
sync = (
|
|
104
|
+
tracked.set(key, latestValue);
|
|
105
|
+
sync = state.untracked(
|
|
106
|
+
() => {
|
|
107
|
+
var _a;
|
|
108
|
+
return (_a = synchronousRef.current) == null ? void 0 : _a.call(synchronousRef, key, value, latestValue);
|
|
109
|
+
}
|
|
110
|
+
) === true || sync;
|
|
82
111
|
}
|
|
83
112
|
}
|
|
84
113
|
if (stale) {
|
|
85
114
|
if (sync) {
|
|
86
|
-
queueMicrotask(() =>
|
|
115
|
+
queueMicrotask(() => {
|
|
116
|
+
if (tracker.active) reactDom.flushSync(forceUpdate);
|
|
117
|
+
});
|
|
87
118
|
} else {
|
|
88
119
|
forceUpdate();
|
|
89
120
|
}
|
|
90
121
|
}
|
|
91
122
|
});
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
return value;
|
|
99
|
-
}
|
|
100
|
-
}) : target,
|
|
101
|
-
[target]
|
|
102
|
-
);
|
|
123
|
+
return () => {
|
|
124
|
+
tracker.active = false;
|
|
125
|
+
dispose();
|
|
126
|
+
};
|
|
127
|
+
}, [target, tracker, forceUpdate, synchronousRef]);
|
|
128
|
+
return tracker.proxy;
|
|
103
129
|
}
|
|
104
130
|
|
|
105
131
|
// src/hooks/useImmediateEffect.ts
|
|
106
132
|
function useImmediateEffect(callback, _) {
|
|
107
133
|
callback();
|
|
108
134
|
}
|
|
109
|
-
function useLatest(value) {
|
|
110
|
-
const valueRef = react.useRef(value);
|
|
111
|
-
useIsomorphicLayoutEffect(() => {
|
|
112
|
-
valueRef.current = value;
|
|
113
|
-
}, [value]);
|
|
114
|
-
return valueRef;
|
|
115
|
-
}
|
|
116
135
|
function useOnValueChange(value, onChange, effect3 = react.useEffect, compare = Object.is) {
|
|
117
136
|
const tracked = react.useRef(value);
|
|
118
137
|
effect3(() => {
|
package/hooks.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["src/hooks/useConstant.ts","src/hooks/useIsomorphicLayoutEffect.ts","src/hooks/useForceUpdate.ts","src/hooks/useSignal.ts","src/hooks/useComputed.ts","src/hooks/useDeepSignal.ts","src/hooks/useImmediateEffect.ts","src/hooks/useLatest.ts","src/hooks/useOnValueChange.ts","src/hooks/useOnElementChange.ts"],"names":["useRef","useLayoutEffect","useEffect","useState","useCallback","effect","currentValue","flushSync","useMemo","computed","untracked","target"],"mappings":"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","file":"hooks.cjs","sourcesContent":["import {type MutableRefObject, useRef} from 'react';\n\nexport function useConstant<T = any>(initializer: () => T) {\n const ref = useRef<T>(null) as MutableRefObject<T>;\n\n if (!ref.current) {\n ref.current = initializer();\n }\n\n return ref.current;\n}\n","import {useEffect, useLayoutEffect} from 'react';\n\n// https://github.com/facebook/react/blob/master/packages/shared/ExecutionEnvironment.js\nexport const canUseDOM =\n typeof window !== 'undefined' &&\n typeof window.document !== 'undefined' &&\n typeof window.document.createElement !== 'undefined';\n\n/**\n * A hook that resolves to useEffect on the server and useLayoutEffect on the client\n * @param callback {function} Callback function that is invoked when the dependencies of the hook change\n */\nexport const useIsomorphicLayoutEffect = canUseDOM\n ? useLayoutEffect\n : useEffect;\n","import {useCallback, useState} from 'react';\n\nexport function useForceUpdate() {\n const setState = useState(0)[1];\n\n return useCallback(() => {\n setState((value) => value + 1);\n }, [setState]);\n}\n","import {useRef, useState} from 'react';\nimport {flushSync} from 'react-dom';\nimport {effect, Signal} from '@dnd-kit/state';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\nimport {useForceUpdate} from './useForceUpdate.ts';\n\n/** Trigger a re-render when reading a signal. */\nexport function useSignal<T = any>(signal: Signal<T>, sync = false) {\n const previous = useRef(signal.peek());\n const read = useRef(false);\n const forceUpdate = useForceUpdate();\n\n useIsomorphicLayoutEffect(\n () =>\n effect(() => {\n const previousValue = previous.current;\n const currentValue = signal.value;\n\n if (previousValue !== currentValue) {\n previous.current = currentValue;\n\n if (!read.current) return;\n\n if (sync) {\n flushSync(forceUpdate);\n } else {\n forceUpdate();\n }\n }\n }),\n [signal, sync, forceUpdate]\n );\n\n return {\n get value() {\n read.current = true;\n\n return signal.peek();\n },\n };\n}\n","import {useMemo, useRef} from 'react';\nimport {computed} from '@dnd-kit/state';\n\nimport {useSignal} from './useSignal.ts';\n\nexport function useComputed<T = any>(\n compute: () => T,\n dependencies: any[] = [],\n sync = false\n) {\n const $compute = useRef(compute);\n $compute.current = compute;\n\n return useSignal(\n useMemo(() => computed(() => $compute.current()), dependencies),\n sync\n );\n}\n","import {useMemo, useRef} from 'react';\nimport {flushSync} from 'react-dom';\nimport {effect, untracked} from '@dnd-kit/state';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\nimport {useForceUpdate} from './useForceUpdate.ts';\n\n/** Trigger a re-render when reading signal properties of an object. */\nexport function useDeepSignal<T extends object | null | undefined>(\n target: T,\n synchronous?: (property: keyof T, oldValue: any, newValue: any) => boolean\n): T {\n const tracked = useRef(new Map<string | symbol, any>());\n const forceUpdate = useForceUpdate();\n\n useIsomorphicLayoutEffect(() => {\n if (!target) {\n tracked.current.clear();\n return;\n }\n\n return effect(() => {\n let stale = false;\n let sync = false;\n\n for (const entry of tracked.current) {\n const [key] = entry;\n const value = untracked(() => entry[1]);\n const latestValue = (target as any)[key];\n\n if (value !== latestValue) {\n stale = true;\n tracked.current.set(key, latestValue);\n sync = synchronous?.(key as keyof T, value, latestValue) ?? false;\n }\n }\n\n if (stale) {\n if (sync) {\n // Defer flushSync to a microtask to avoid calling it from within\n // a React lifecycle method (e.g. useEffect batch), which happens when\n // signal updates are triggered synchronously from a React effect\n queueMicrotask(() => flushSync(forceUpdate));\n } else {\n forceUpdate();\n }\n }\n });\n }, [target]);\n\n return useMemo(\n () =>\n target\n ? new Proxy(target, {\n get(target, key) {\n const value = (target as any)[key];\n\n tracked.current.set(key, value);\n\n return value;\n },\n })\n : target,\n [target]\n );\n}\n","import type {DependencyList, EffectCallback} from 'react';\n\nexport function useImmediateEffect(\n callback: EffectCallback,\n _?: DependencyList\n) {\n callback();\n}\n","import {useRef} from 'react';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\n\nexport function useLatest<T>(value: T) {\n const valueRef = useRef<T | undefined>(value);\n\n useIsomorphicLayoutEffect(() => {\n valueRef.current = value;\n }, [value]);\n\n return valueRef;\n}\n","import {useRef, useEffect} from 'react';\n\nexport function useOnValueChange<T>(\n value: T,\n onChange: (value: T, oldValue: T) => void,\n effect = useEffect,\n compare = Object.is\n) {\n const tracked = useRef<T>(value);\n\n effect(() => {\n const oldValue = tracked.current;\n\n if (!compare(value, oldValue)) {\n tracked.current = value;\n onChange(value, oldValue);\n }\n }, [onChange, value]);\n}\n","import {useRef} from 'react';\nimport {currentValue, type RefOrValue} from '@dnd-kit/react/utilities';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\n\nexport function useOnElementChange(\n value: RefOrValue<Element>,\n onChange: (value: Element | undefined) => void\n) {\n const previous = useRef(currentValue(value));\n\n useIsomorphicLayoutEffect(() => {\n const current = currentValue(value);\n\n if (current !== previous.current) {\n previous.current = current;\n onChange(current);\n }\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["src/hooks/useConstant.ts","src/hooks/useIsomorphicLayoutEffect.ts","src/hooks/useForceUpdate.ts","src/hooks/useSignal.ts","src/hooks/useComputed.ts","src/hooks/useLatest.ts","src/hooks/useDeepSignal.ts","src/hooks/useImmediateEffect.ts","src/hooks/useOnValueChange.ts","src/hooks/useOnElementChange.ts"],"names":["useRef","useLayoutEffect","useEffect","useState","useCallback","signal","effect","currentValue","flushSync","useMemo","computed","target","untracked"],"mappings":"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","file":"hooks.cjs","sourcesContent":["import {type MutableRefObject, useRef} from 'react';\n\nexport function useConstant<T = any>(initializer: () => T) {\n const ref = useRef<T>(null) as MutableRefObject<T>;\n\n if (!ref.current) {\n ref.current = initializer();\n }\n\n return ref.current;\n}\n","import {useEffect, useLayoutEffect} from 'react';\n\n// https://github.com/facebook/react/blob/master/packages/shared/ExecutionEnvironment.js\nexport const canUseDOM =\n typeof window !== 'undefined' &&\n typeof window.document !== 'undefined' &&\n typeof window.document.createElement !== 'undefined';\n\n/**\n * A hook that resolves to useEffect on the server and useLayoutEffect on the client\n * @param callback {function} Callback function that is invoked when the dependencies of the hook change\n */\nexport const useIsomorphicLayoutEffect = canUseDOM\n ? useLayoutEffect\n : useEffect;\n","import {useCallback, useState} from 'react';\n\nexport function useForceUpdate() {\n const setState = useState(0)[1];\n\n return useCallback(() => {\n setState((value) => value + 1);\n }, [setState]);\n}\n","import {useRef, useState} from 'react';\nimport {flushSync} from 'react-dom';\nimport {effect, Signal} from '@dnd-kit/state';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\nimport {useForceUpdate} from './useForceUpdate.ts';\n\n/** Trigger a re-render when reading a signal. */\nexport function useSignal<T = any>(signal: Signal<T>, sync = false) {\n const previous = useRef(signal.peek());\n const read = useRef(false);\n const forceUpdate = useForceUpdate();\n\n useIsomorphicLayoutEffect(\n () =>\n effect(() => {\n const previousValue = previous.current;\n const currentValue = signal.value;\n\n if (previousValue !== currentValue) {\n previous.current = currentValue;\n\n if (!read.current) return;\n\n if (sync) {\n flushSync(forceUpdate);\n } else {\n forceUpdate();\n }\n }\n }),\n [signal, sync, forceUpdate]\n );\n\n return {\n get value() {\n read.current = true;\n\n return signal.peek();\n },\n };\n}\n","import {useMemo, useRef} from 'react';\nimport {computed} from '@dnd-kit/state';\n\nimport {useSignal} from './useSignal.ts';\n\nexport function useComputed<T = any>(\n compute: () => T,\n dependencies: any[] = [],\n sync = false\n) {\n const $compute = useRef(compute);\n $compute.current = compute;\n\n return useSignal(\n useMemo(() => computed(() => $compute.current()), dependencies),\n sync\n );\n}\n","import {useRef} from 'react';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\n\nexport function useLatest<T>(value: T) {\n const valueRef = useRef<T | undefined>(value);\n\n useIsomorphicLayoutEffect(() => {\n valueRef.current = value;\n }, [value]);\n\n return valueRef;\n}\n","import {useMemo} from 'react';\nimport {flushSync} from 'react-dom';\nimport {effect, signal, untracked} from '@dnd-kit/state';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\nimport {useForceUpdate} from './useForceUpdate.ts';\nimport {useLatest} from './useLatest.ts';\n\n/** Trigger a re-render when reading signal properties of an object. */\nexport function useDeepSignal<T extends object | null | undefined>(\n target: T,\n synchronous?: (property: keyof T, oldValue: any, newValue: any) => boolean\n): T {\n const forceUpdate = useForceUpdate();\n const synchronousRef = useLatest(synchronous);\n const tracker = useMemo(() => {\n const tracked = new Map<string | symbol, any>();\n\n return {\n tracked,\n propertyCount: signal(0),\n active: false,\n proxy: target\n ? new Proxy(target, {\n get(target, key) {\n const value = (target as any)[key];\n\n // Reads must not overwrite the observer's comparison baseline.\n if (!tracked.has(key)) tracked.set(key, value);\n\n return value;\n },\n })\n : target,\n };\n }, [target]);\n\n // Publish newly read properties after commit, without notifying from render.\n // The map only grows for a given target, so its size versions the key set.\n useIsomorphicLayoutEffect(() => {\n tracker.propertyCount.value = tracker.tracked.size;\n });\n\n useIsomorphicLayoutEffect(() => {\n if (!target) return;\n\n const {tracked, propertyCount} = tracker;\n tracker.active = true;\n const dispose = effect(() => {\n // Keep the effect alive, but refresh its dependencies for late reads.\n propertyCount.value;\n\n let stale = false;\n let sync = false;\n\n for (const [key, value] of tracked) {\n const latestValue = (target as any)[key];\n\n if (!Object.is(value, latestValue)) {\n stale = true;\n tracked.set(key, latestValue);\n sync =\n untracked(() =>\n synchronousRef.current?.(key as keyof T, value, latestValue)\n ) === true || sync;\n }\n }\n\n if (stale) {\n if (sync) {\n // Signal updates can originate in a React lifecycle method.\n queueMicrotask(() => {\n if (tracker.active) flushSync(forceUpdate);\n });\n } else {\n forceUpdate();\n }\n }\n });\n\n return () => {\n tracker.active = false;\n dispose();\n };\n }, [target, tracker, forceUpdate, synchronousRef]);\n\n return tracker.proxy;\n}\n","import type {DependencyList, EffectCallback} from 'react';\n\nexport function useImmediateEffect(\n callback: EffectCallback,\n _?: DependencyList\n) {\n callback();\n}\n","import {useRef, useEffect} from 'react';\n\nexport function useOnValueChange<T>(\n value: T,\n onChange: (value: T, oldValue: T) => void,\n effect = useEffect,\n compare = Object.is\n) {\n const tracked = useRef<T>(value);\n\n effect(() => {\n const oldValue = tracked.current;\n\n if (!compare(value, oldValue)) {\n tracked.current = value;\n onChange(value, oldValue);\n }\n }, [onChange, value]);\n}\n","import {useRef} from 'react';\nimport {currentValue, type RefOrValue} from '@dnd-kit/react/utilities';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\n\nexport function useOnElementChange(\n value: RefOrValue<Element>,\n onChange: (value: Element | undefined) => void\n) {\n const previous = useRef(currentValue(value));\n\n useIsomorphicLayoutEffect(() => {\n const current = currentValue(value);\n\n if (current !== previous.current) {\n previous.current = current;\n onChange(current);\n }\n });\n}\n"]}
|
package/hooks.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useLayoutEffect, useEffect, useRef, useMemo, useState, useCallback } from 'react';
|
|
2
|
-
import { computed, effect, untracked } from '@dnd-kit/state';
|
|
2
|
+
import { computed, signal, effect, untracked } from '@dnd-kit/state';
|
|
3
3
|
import { flushSync } from 'react-dom';
|
|
4
4
|
import { currentValue } from '@dnd-kit/react/utilities';
|
|
5
5
|
|
|
@@ -20,14 +20,14 @@ function useForceUpdate() {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
// src/hooks/useSignal.ts
|
|
23
|
-
function useSignal(
|
|
24
|
-
const previous = useRef(
|
|
23
|
+
function useSignal(signal2, sync = false) {
|
|
24
|
+
const previous = useRef(signal2.peek());
|
|
25
25
|
const read = useRef(false);
|
|
26
26
|
const forceUpdate = useForceUpdate();
|
|
27
27
|
useIsomorphicLayoutEffect(
|
|
28
28
|
() => effect(() => {
|
|
29
29
|
const previousValue = previous.current;
|
|
30
|
-
const currentValue2 =
|
|
30
|
+
const currentValue2 = signal2.value;
|
|
31
31
|
if (previousValue !== currentValue2) {
|
|
32
32
|
previous.current = currentValue2;
|
|
33
33
|
if (!read.current) return;
|
|
@@ -38,12 +38,12 @@ function useSignal(signal, sync = false) {
|
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
}),
|
|
41
|
-
[
|
|
41
|
+
[signal2, sync, forceUpdate]
|
|
42
42
|
);
|
|
43
43
|
return {
|
|
44
44
|
get value() {
|
|
45
45
|
read.current = true;
|
|
46
|
-
return
|
|
46
|
+
return signal2.peek();
|
|
47
47
|
}
|
|
48
48
|
};
|
|
49
49
|
}
|
|
@@ -57,60 +57,79 @@ function useComputed(compute, dependencies = [], sync = false) {
|
|
|
57
57
|
sync
|
|
58
58
|
);
|
|
59
59
|
}
|
|
60
|
+
function useLatest(value) {
|
|
61
|
+
const valueRef = useRef(value);
|
|
62
|
+
useIsomorphicLayoutEffect(() => {
|
|
63
|
+
valueRef.current = value;
|
|
64
|
+
}, [value]);
|
|
65
|
+
return valueRef;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// src/hooks/useDeepSignal.ts
|
|
60
69
|
function useDeepSignal(target, synchronous) {
|
|
61
|
-
const tracked = useRef(/* @__PURE__ */ new Map());
|
|
62
70
|
const forceUpdate = useForceUpdate();
|
|
71
|
+
const synchronousRef = useLatest(synchronous);
|
|
72
|
+
const tracker = useMemo(() => {
|
|
73
|
+
const tracked = /* @__PURE__ */ new Map();
|
|
74
|
+
return {
|
|
75
|
+
tracked,
|
|
76
|
+
propertyCount: signal(0),
|
|
77
|
+
active: false,
|
|
78
|
+
proxy: target ? new Proxy(target, {
|
|
79
|
+
get(target2, key) {
|
|
80
|
+
const value = target2[key];
|
|
81
|
+
if (!tracked.has(key)) tracked.set(key, value);
|
|
82
|
+
return value;
|
|
83
|
+
}
|
|
84
|
+
}) : target
|
|
85
|
+
};
|
|
86
|
+
}, [target]);
|
|
63
87
|
useIsomorphicLayoutEffect(() => {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
88
|
+
tracker.propertyCount.value = tracker.tracked.size;
|
|
89
|
+
});
|
|
90
|
+
useIsomorphicLayoutEffect(() => {
|
|
91
|
+
if (!target) return;
|
|
92
|
+
const { tracked, propertyCount } = tracker;
|
|
93
|
+
tracker.active = true;
|
|
94
|
+
const dispose = effect(() => {
|
|
95
|
+
propertyCount.value;
|
|
70
96
|
let stale = false;
|
|
71
97
|
let sync = false;
|
|
72
|
-
for (const
|
|
73
|
-
const [key] = entry;
|
|
74
|
-
const value = untracked(() => entry[1]);
|
|
98
|
+
for (const [key, value] of tracked) {
|
|
75
99
|
const latestValue = target[key];
|
|
76
|
-
if (value
|
|
100
|
+
if (!Object.is(value, latestValue)) {
|
|
77
101
|
stale = true;
|
|
78
|
-
tracked.
|
|
79
|
-
sync = (
|
|
102
|
+
tracked.set(key, latestValue);
|
|
103
|
+
sync = untracked(
|
|
104
|
+
() => {
|
|
105
|
+
var _a;
|
|
106
|
+
return (_a = synchronousRef.current) == null ? void 0 : _a.call(synchronousRef, key, value, latestValue);
|
|
107
|
+
}
|
|
108
|
+
) === true || sync;
|
|
80
109
|
}
|
|
81
110
|
}
|
|
82
111
|
if (stale) {
|
|
83
112
|
if (sync) {
|
|
84
|
-
queueMicrotask(() =>
|
|
113
|
+
queueMicrotask(() => {
|
|
114
|
+
if (tracker.active) flushSync(forceUpdate);
|
|
115
|
+
});
|
|
85
116
|
} else {
|
|
86
117
|
forceUpdate();
|
|
87
118
|
}
|
|
88
119
|
}
|
|
89
120
|
});
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
return value;
|
|
97
|
-
}
|
|
98
|
-
}) : target,
|
|
99
|
-
[target]
|
|
100
|
-
);
|
|
121
|
+
return () => {
|
|
122
|
+
tracker.active = false;
|
|
123
|
+
dispose();
|
|
124
|
+
};
|
|
125
|
+
}, [target, tracker, forceUpdate, synchronousRef]);
|
|
126
|
+
return tracker.proxy;
|
|
101
127
|
}
|
|
102
128
|
|
|
103
129
|
// src/hooks/useImmediateEffect.ts
|
|
104
130
|
function useImmediateEffect(callback, _) {
|
|
105
131
|
callback();
|
|
106
132
|
}
|
|
107
|
-
function useLatest(value) {
|
|
108
|
-
const valueRef = useRef(value);
|
|
109
|
-
useIsomorphicLayoutEffect(() => {
|
|
110
|
-
valueRef.current = value;
|
|
111
|
-
}, [value]);
|
|
112
|
-
return valueRef;
|
|
113
|
-
}
|
|
114
133
|
function useOnValueChange(value, onChange, effect3 = useEffect, compare = Object.is) {
|
|
115
134
|
const tracked = useRef(value);
|
|
116
135
|
effect3(() => {
|
package/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["src/hooks/useConstant.ts","src/hooks/useIsomorphicLayoutEffect.ts","src/hooks/useForceUpdate.ts","src/hooks/useSignal.ts","src/hooks/useComputed.ts","src/hooks/useDeepSignal.ts","src/hooks/useImmediateEffect.ts","src/hooks/useLatest.ts","src/hooks/useOnValueChange.ts","src/hooks/useOnElementChange.ts"],"names":["useRef","currentValue","effect","flushSync","useMemo","target","useEffect"],"mappings":"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","file":"hooks.js","sourcesContent":["import {type MutableRefObject, useRef} from 'react';\n\nexport function useConstant<T = any>(initializer: () => T) {\n const ref = useRef<T>(null) as MutableRefObject<T>;\n\n if (!ref.current) {\n ref.current = initializer();\n }\n\n return ref.current;\n}\n","import {useEffect, useLayoutEffect} from 'react';\n\n// https://github.com/facebook/react/blob/master/packages/shared/ExecutionEnvironment.js\nexport const canUseDOM =\n typeof window !== 'undefined' &&\n typeof window.document !== 'undefined' &&\n typeof window.document.createElement !== 'undefined';\n\n/**\n * A hook that resolves to useEffect on the server and useLayoutEffect on the client\n * @param callback {function} Callback function that is invoked when the dependencies of the hook change\n */\nexport const useIsomorphicLayoutEffect = canUseDOM\n ? useLayoutEffect\n : useEffect;\n","import {useCallback, useState} from 'react';\n\nexport function useForceUpdate() {\n const setState = useState(0)[1];\n\n return useCallback(() => {\n setState((value) => value + 1);\n }, [setState]);\n}\n","import {useRef, useState} from 'react';\nimport {flushSync} from 'react-dom';\nimport {effect, Signal} from '@dnd-kit/state';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\nimport {useForceUpdate} from './useForceUpdate.ts';\n\n/** Trigger a re-render when reading a signal. */\nexport function useSignal<T = any>(signal: Signal<T>, sync = false) {\n const previous = useRef(signal.peek());\n const read = useRef(false);\n const forceUpdate = useForceUpdate();\n\n useIsomorphicLayoutEffect(\n () =>\n effect(() => {\n const previousValue = previous.current;\n const currentValue = signal.value;\n\n if (previousValue !== currentValue) {\n previous.current = currentValue;\n\n if (!read.current) return;\n\n if (sync) {\n flushSync(forceUpdate);\n } else {\n forceUpdate();\n }\n }\n }),\n [signal, sync, forceUpdate]\n );\n\n return {\n get value() {\n read.current = true;\n\n return signal.peek();\n },\n };\n}\n","import {useMemo, useRef} from 'react';\nimport {computed} from '@dnd-kit/state';\n\nimport {useSignal} from './useSignal.ts';\n\nexport function useComputed<T = any>(\n compute: () => T,\n dependencies: any[] = [],\n sync = false\n) {\n const $compute = useRef(compute);\n $compute.current = compute;\n\n return useSignal(\n useMemo(() => computed(() => $compute.current()), dependencies),\n sync\n );\n}\n","import {useMemo, useRef} from 'react';\nimport {flushSync} from 'react-dom';\nimport {effect, untracked} from '@dnd-kit/state';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\nimport {useForceUpdate} from './useForceUpdate.ts';\n\n/** Trigger a re-render when reading signal properties of an object. */\nexport function useDeepSignal<T extends object | null | undefined>(\n target: T,\n synchronous?: (property: keyof T, oldValue: any, newValue: any) => boolean\n): T {\n const tracked = useRef(new Map<string | symbol, any>());\n const forceUpdate = useForceUpdate();\n\n useIsomorphicLayoutEffect(() => {\n if (!target) {\n tracked.current.clear();\n return;\n }\n\n return effect(() => {\n let stale = false;\n let sync = false;\n\n for (const entry of tracked.current) {\n const [key] = entry;\n const value = untracked(() => entry[1]);\n const latestValue = (target as any)[key];\n\n if (value !== latestValue) {\n stale = true;\n tracked.current.set(key, latestValue);\n sync = synchronous?.(key as keyof T, value, latestValue) ?? false;\n }\n }\n\n if (stale) {\n if (sync) {\n // Defer flushSync to a microtask to avoid calling it from within\n // a React lifecycle method (e.g. useEffect batch), which happens when\n // signal updates are triggered synchronously from a React effect\n queueMicrotask(() => flushSync(forceUpdate));\n } else {\n forceUpdate();\n }\n }\n });\n }, [target]);\n\n return useMemo(\n () =>\n target\n ? new Proxy(target, {\n get(target, key) {\n const value = (target as any)[key];\n\n tracked.current.set(key, value);\n\n return value;\n },\n })\n : target,\n [target]\n );\n}\n","import type {DependencyList, EffectCallback} from 'react';\n\nexport function useImmediateEffect(\n callback: EffectCallback,\n _?: DependencyList\n) {\n callback();\n}\n","import {useRef} from 'react';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\n\nexport function useLatest<T>(value: T) {\n const valueRef = useRef<T | undefined>(value);\n\n useIsomorphicLayoutEffect(() => {\n valueRef.current = value;\n }, [value]);\n\n return valueRef;\n}\n","import {useRef, useEffect} from 'react';\n\nexport function useOnValueChange<T>(\n value: T,\n onChange: (value: T, oldValue: T) => void,\n effect = useEffect,\n compare = Object.is\n) {\n const tracked = useRef<T>(value);\n\n effect(() => {\n const oldValue = tracked.current;\n\n if (!compare(value, oldValue)) {\n tracked.current = value;\n onChange(value, oldValue);\n }\n }, [onChange, value]);\n}\n","import {useRef} from 'react';\nimport {currentValue, type RefOrValue} from '@dnd-kit/react/utilities';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\n\nexport function useOnElementChange(\n value: RefOrValue<Element>,\n onChange: (value: Element | undefined) => void\n) {\n const previous = useRef(currentValue(value));\n\n useIsomorphicLayoutEffect(() => {\n const current = currentValue(value);\n\n if (current !== previous.current) {\n previous.current = current;\n onChange(current);\n }\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["src/hooks/useConstant.ts","src/hooks/useIsomorphicLayoutEffect.ts","src/hooks/useForceUpdate.ts","src/hooks/useSignal.ts","src/hooks/useComputed.ts","src/hooks/useLatest.ts","src/hooks/useDeepSignal.ts","src/hooks/useImmediateEffect.ts","src/hooks/useOnValueChange.ts","src/hooks/useOnElementChange.ts"],"names":["signal","useRef","currentValue","useMemo","target","effect","flushSync","useEffect"],"mappings":"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","file":"hooks.js","sourcesContent":["import {type MutableRefObject, useRef} from 'react';\n\nexport function useConstant<T = any>(initializer: () => T) {\n const ref = useRef<T>(null) as MutableRefObject<T>;\n\n if (!ref.current) {\n ref.current = initializer();\n }\n\n return ref.current;\n}\n","import {useEffect, useLayoutEffect} from 'react';\n\n// https://github.com/facebook/react/blob/master/packages/shared/ExecutionEnvironment.js\nexport const canUseDOM =\n typeof window !== 'undefined' &&\n typeof window.document !== 'undefined' &&\n typeof window.document.createElement !== 'undefined';\n\n/**\n * A hook that resolves to useEffect on the server and useLayoutEffect on the client\n * @param callback {function} Callback function that is invoked when the dependencies of the hook change\n */\nexport const useIsomorphicLayoutEffect = canUseDOM\n ? useLayoutEffect\n : useEffect;\n","import {useCallback, useState} from 'react';\n\nexport function useForceUpdate() {\n const setState = useState(0)[1];\n\n return useCallback(() => {\n setState((value) => value + 1);\n }, [setState]);\n}\n","import {useRef, useState} from 'react';\nimport {flushSync} from 'react-dom';\nimport {effect, Signal} from '@dnd-kit/state';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\nimport {useForceUpdate} from './useForceUpdate.ts';\n\n/** Trigger a re-render when reading a signal. */\nexport function useSignal<T = any>(signal: Signal<T>, sync = false) {\n const previous = useRef(signal.peek());\n const read = useRef(false);\n const forceUpdate = useForceUpdate();\n\n useIsomorphicLayoutEffect(\n () =>\n effect(() => {\n const previousValue = previous.current;\n const currentValue = signal.value;\n\n if (previousValue !== currentValue) {\n previous.current = currentValue;\n\n if (!read.current) return;\n\n if (sync) {\n flushSync(forceUpdate);\n } else {\n forceUpdate();\n }\n }\n }),\n [signal, sync, forceUpdate]\n );\n\n return {\n get value() {\n read.current = true;\n\n return signal.peek();\n },\n };\n}\n","import {useMemo, useRef} from 'react';\nimport {computed} from '@dnd-kit/state';\n\nimport {useSignal} from './useSignal.ts';\n\nexport function useComputed<T = any>(\n compute: () => T,\n dependencies: any[] = [],\n sync = false\n) {\n const $compute = useRef(compute);\n $compute.current = compute;\n\n return useSignal(\n useMemo(() => computed(() => $compute.current()), dependencies),\n sync\n );\n}\n","import {useRef} from 'react';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\n\nexport function useLatest<T>(value: T) {\n const valueRef = useRef<T | undefined>(value);\n\n useIsomorphicLayoutEffect(() => {\n valueRef.current = value;\n }, [value]);\n\n return valueRef;\n}\n","import {useMemo} from 'react';\nimport {flushSync} from 'react-dom';\nimport {effect, signal, untracked} from '@dnd-kit/state';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\nimport {useForceUpdate} from './useForceUpdate.ts';\nimport {useLatest} from './useLatest.ts';\n\n/** Trigger a re-render when reading signal properties of an object. */\nexport function useDeepSignal<T extends object | null | undefined>(\n target: T,\n synchronous?: (property: keyof T, oldValue: any, newValue: any) => boolean\n): T {\n const forceUpdate = useForceUpdate();\n const synchronousRef = useLatest(synchronous);\n const tracker = useMemo(() => {\n const tracked = new Map<string | symbol, any>();\n\n return {\n tracked,\n propertyCount: signal(0),\n active: false,\n proxy: target\n ? new Proxy(target, {\n get(target, key) {\n const value = (target as any)[key];\n\n // Reads must not overwrite the observer's comparison baseline.\n if (!tracked.has(key)) tracked.set(key, value);\n\n return value;\n },\n })\n : target,\n };\n }, [target]);\n\n // Publish newly read properties after commit, without notifying from render.\n // The map only grows for a given target, so its size versions the key set.\n useIsomorphicLayoutEffect(() => {\n tracker.propertyCount.value = tracker.tracked.size;\n });\n\n useIsomorphicLayoutEffect(() => {\n if (!target) return;\n\n const {tracked, propertyCount} = tracker;\n tracker.active = true;\n const dispose = effect(() => {\n // Keep the effect alive, but refresh its dependencies for late reads.\n propertyCount.value;\n\n let stale = false;\n let sync = false;\n\n for (const [key, value] of tracked) {\n const latestValue = (target as any)[key];\n\n if (!Object.is(value, latestValue)) {\n stale = true;\n tracked.set(key, latestValue);\n sync =\n untracked(() =>\n synchronousRef.current?.(key as keyof T, value, latestValue)\n ) === true || sync;\n }\n }\n\n if (stale) {\n if (sync) {\n // Signal updates can originate in a React lifecycle method.\n queueMicrotask(() => {\n if (tracker.active) flushSync(forceUpdate);\n });\n } else {\n forceUpdate();\n }\n }\n });\n\n return () => {\n tracker.active = false;\n dispose();\n };\n }, [target, tracker, forceUpdate, synchronousRef]);\n\n return tracker.proxy;\n}\n","import type {DependencyList, EffectCallback} from 'react';\n\nexport function useImmediateEffect(\n callback: EffectCallback,\n _?: DependencyList\n) {\n callback();\n}\n","import {useRef, useEffect} from 'react';\n\nexport function useOnValueChange<T>(\n value: T,\n onChange: (value: T, oldValue: T) => void,\n effect = useEffect,\n compare = Object.is\n) {\n const tracked = useRef<T>(value);\n\n effect(() => {\n const oldValue = tracked.current;\n\n if (!compare(value, oldValue)) {\n tracked.current = value;\n onChange(value, oldValue);\n }\n }, [onChange, value]);\n}\n","import {useRef} from 'react';\nimport {currentValue, type RefOrValue} from '@dnd-kit/react/utilities';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect.ts';\n\nexport function useOnElementChange(\n value: RefOrValue<Element>,\n onChange: (value: Element | undefined) => void\n) {\n const previous = useRef(currentValue(value));\n\n useIsomorphicLayoutEffect(() => {\n const current = currentValue(value);\n\n if (current !== previous.current) {\n previous.current = current;\n onChange(current);\n }\n });\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dnd-kit/react",
|
|
3
|
-
"version": "0.5.1-beta-
|
|
3
|
+
"version": "0.5.1-beta-20260912195958",
|
|
4
4
|
"main": "./index.cjs",
|
|
5
5
|
"module": "./index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -64,9 +64,9 @@
|
|
|
64
64
|
"clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist"
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@dnd-kit/abstract": "0.5.1-beta-
|
|
68
|
-
"@dnd-kit/dom": "0.5.1-beta-
|
|
69
|
-
"@dnd-kit/state": "0.5.1-beta-
|
|
67
|
+
"@dnd-kit/abstract": "0.5.1-beta-20260912195958",
|
|
68
|
+
"@dnd-kit/dom": "0.5.1-beta-20260912195958",
|
|
69
|
+
"@dnd-kit/state": "0.5.1-beta-20260912195958",
|
|
70
70
|
"tslib": "^2.6.2"
|
|
71
71
|
},
|
|
72
72
|
"peerDependencies": {
|